首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python :相同域上的cookie行为

Python :相同域上的cookie行为
EN

Stack Overflow用户
提问于 2022-10-25 14:05:21
回答 1查看 119关注 0票数 1

希望这不是一个太愚蠢的问题,但我在处理aiohttp曲奇时遇到了麻烦。

Aiohttp的CookieJar类提到它实现了遵循RFC 6265的cookie存储,其中声明:

给定主机的

  • Cookie是跨主机的共享的,
  • Cookies不通过端口提供隔离。如果cookie由运行在一个端口上的服务读取,则运行在同一server.

的另一个端口上的服务也可读取cookie。

但是,如果我创建了两个aiohttp服务器,一个让您“登录”并返回一个cookie,另一个服务器的端点希望您拥有一个cookie,这两个服务器都托管在本地主机(我猜是两个不同的端口),那么cookie将不会被处理。

下面是一组使用aiohttp、pytest、pytest和pytest-aiohttp来解释的4种测试:

代码语言:javascript
复制
import functools

import pytest
from aiohttp import web


pytestmark = pytest.mark.asyncio


def attach_session(f):
    @functools.wraps(f)
    async def wrapper(request: web.Request):
        session_id = request.cookies.get("testcookie")
        request["mysession"] = session_id

        response = await f(request)
        response.set_cookie("testcookie", session_id)
        return response

    return wrapper


def is_logged_in(f):
    @functools.wraps(f)
    @attach_session
    async def wrapper(request: web.Request):
        session = request["mysession"]
        if not session:
            raise web.HTTPUnauthorized
        return await f(request)

    return wrapper


async def login(_: web.Request):
    response = web.Response()
    response.set_cookie("testcookie", "somerandomstring")
    return response


@is_logged_in
async def some_endpoint(request: web.Request):
    return web.Response(text="sweet")


@pytest.fixture
def auth_client(event_loop, aiohttp_client):
    app = web.Application()
    app.router.add_post("/login", login)
    return event_loop.run_until_complete(aiohttp_client(app))


@pytest.fixture
def core_client(event_loop, aiohttp_client):
    app = web.Application()
    app.router.add_get("/some_endpoint", some_endpoint)
    return event_loop.run_until_complete(aiohttp_client(app))


async def test_login(auth_client):
    resp = await auth_client.post("/login")
    assert resp.status == 200
    assert resp.cookies.get("testcookie").value == "somerandomstring"


async def test_some_endpoint_anonymous(core_client):
    resp = await core_client.get("/some_endpoint")
    assert resp.status == 401


async def test_some_endpoint_as_logged_in(auth_client, core_client):
    resp1 = await auth_client.post("/login")
    resp2 = await core_client.get("/some_endpoint", cookies=resp1.cookies)
    assert resp2.status == 401


async def test_some_endpoint_as_logged_in_again(auth_client, core_client):
    resp1 = await auth_client.post("/login")

    _cookie = list(resp1.cookies.values())[0]
    resp2 = await core_client.get(
        "/some_endpoint", cookies={_cookie.key: _cookie.value}
    )
    assert resp2.status == 200

但据我理解,"test_some_endpoint_as_logged_in“测试应该有效。为什么它返回401,而同样的事情,但发送饼干作为一个迪克返回200?

EN

回答 1

Stack Overflow用户

发布于 2022-11-04 10:49:20

我认为在客户端之间共享cookie的正确方法是将resp1的resp1对象加载到core_client.session.cookie_jar。

更改test_some_endpoint_as_logged_in的代码以修复它:

代码语言:javascript
复制
async def test_some_endpoint_as_logged_in(auth_client, core_client):
    resp1 = await auth_client.post("/login")
    core_client.session.cookie_jar.update_cookies(resp1.cookies)
    resp2 = await core_client.get("/some_endpoint")
    assert resp2.status == 401

Cookie数据保存在会话对象中,因为auth_client和core_client是不同的会话,其中自己的数据cookie数据是不共享的。这相当于使用不同的浏览器,每个浏览器都有自己的cookie_jar。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74195374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档