迁移至Google Identity Services后aiohttp无法获取myid Cookie求助
问题核心原因
Google Identity Services设置的g_state={"i_l":0} Cookie值违反了Cookie规范,而Python标准库的http.cookies.SimpleCookie对格式校验严格,遇到非法Cookie项时会停止解析后续所有Cookie,这才导致你的myid=10无法被读取。
对三个疑问的解答
- 是Google的无效Cookie值问题? 是的。根据RFC 6265规范,Cookie值不能包含未转义的
{、}这类特殊字符,Google的g_state直接使用了未转义的大括号,属于格式违规。 - 是SimpleCookie的解析问题? 不算。SimpleCookie的逻辑严格遵循早期的RFC 2109/2965标准,遇到不符合规范的Cookie项时会跳过,并且终止后续Cookie的解析(这是导致你的自定义Cookie被忽略的直接原因)。
- 是aiohttp的Bug? 不是。aiohttp只是直接复用了Python标准库的SimpleCookie处理请求Cookie,本身没有逻辑错误。
正确修复方案
方案一:自定义Cookie解析逻辑
绕过SimpleCookie的严格校验,手动拆分并解析Cookie头,忽略格式错误的项:
def parse_raw_cookies(cookie_header): cookies = {} if not cookie_header: return cookies for item in cookie_header.split(';'): item = item.strip() if '=' not in item: continue key, val = item.split('=', 1) # 可选:处理HTML转义字符,比如把"还原为" val = val.replace('"', '"') cookies[key] = val return cookies # 在aiohttp请求处理中使用 async def handle_request(request): raw_cookies = parse_raw_cookies(request.headers.get('Cookie', '')) myid = raw_cookies.get('myid') # 后续业务逻辑...
方案二:向Google反馈格式问题
你可以通过Google Identity Services的官方反馈渠道提交问题,要求修复g_state Cookie的格式——正确的做法应该是对特殊字符进行URL编码,或者用双引号包裹Cookie值并转义内部的引号。
临时方案说明
你当前直接从request.headers['Cookie']中读取myid的方式是可行的,但自定义解析逻辑会更健壮,能兼容更多异常情况。
内容的提问来源于stack exchange,提问作者vvkatwss vvkatwss
相关产品推荐
相关产品推荐

