cookies - 未在 iOS Safari 或 Chrome 中设置或发送请求的 Cookie 适用于所有 Android 和桌面浏览器
问题描述
我使用在后端制作的 set-cookie 标头在设备上设置安全的、仅限 http 的 cookie。这在桌面 Safari、Chrome、FF、IE 等上就像一个魅力。这也适用于 Android Chrome。但是,当我尝试在移动 Safari 或 Chrome 中的 iOS 上的 Web 应用程序中运行相同的代码时,请求中没有发送任何 cookie,并且我的 Web 应用程序无法运行。
我尝试查看其他堆栈溢出答案和问题,并尝试修改我的设置并测试是否有几种不同的 iOS 设备。我希望我的 Web 应用程序可以在不修改默认 iOS Safari 设置的情况下运行。我真的不明白为什么 iOS 不工作.. 因为这种行为似乎是前所未有的。
发出包含令牌的 cookie
(授权.py)
#creates the cookie string for the response
def setCookie(name, value, expires='', domain=None,
secure=False, httponly=False, path=None):
morsel = cookies.Morsel()
# morsel.set(name, value, quote(value))
morsel.set(name, value, value)
expires = datetime.utcnow() + timedelta(days=365)
expireStr = expires.strftime("%a, %d %b %Y %X GMT")
print(expireStr)
morsel['expires'] = expireStr
if path:
morsel['path'] = path
if domain:
morsel['domain'] = domain
if secure:
morsel['secure'] = secure
value = morsel.OutputString()
if httponly:
value += '; httponly'
print(value)
return value
def issueCookieTokens(userData):
accessToken = issueAccessToken(userData).decode('utf-8')
refreshToken = issueRefreshToken(userData).decode('utf-8')
tokens = {'accessToken': accessToken, 'refreshToken': refreshToken}
return setCookie('tokens', json.dumps(tokens), path= '/', secure=True, httponly=True)
(customfuncs.py)
headers = {
'Access-Control-Allow-Origin': 'REDACtED',
'Access-Control-Allow-Credentials': True
}
def makeHeader(cookieVal):
newHeader = headers
print("cookieVal: " + cookieVal)
newHeader['Set-Cookie'] = cookieVal
print(newHeader['Set-Cookie'])
return newHeader
(我返回响应的地方)
创建响应以返回设备
response = {"statusCode": 200,
"headers": customfuncs.makeHeader(authorization.issueCookieTokens(userItem)),
"body": json.dumps({'Item': userItem}, cls=decimalencoder.DecimalEncoder)}
return response
我希望我的响应能够成功返回,在返回正文中包含我的 json,并成功返回一个标头,该标头使用 set-cookie 标头存储一个安全的、仅限 http 的 cookie,该 cookie 为用户存储我的访问/刷新令牌. cookie 也应该在后续请求中发送。如果您想自己测试它,该站点是https://swipeme.in。我在登录和注册期间存储 cookie。测试 cookie 集和发送回来的最佳方法是在注册和下一个请求中,即照片上传。
解决方案
有同样的问题,这是由于路径,再次将其设置为“/”就可以了:
// caused problem:
let path = req.headers.host // setting this will allow it to be passed to subdomains
// ok:
// let path = '/'
...
res.cookie( COOKIE_HTTPONLY_JWT, jwttoken, jwtopts )
推荐阅读
- python - Python:如何使用计数器变量正确地增加这个 for 循环?
- elasticsearch - 如何对关系字段进行聚合查询检查顶部父级elasticsearch 7. 想对关系字段进行聚合查询
- loops - Pyspark 代码中“for”循环的替代方案是什么?
- discord.js - 将队列转换为嵌入消息或单个消息
- microsoft-dynamics - 如何将筛选值传递给 Microsoft Dynamics 365 中的工作区磁贴查询
- django - Djangocrispy-forms 在表单顶部显示所有错误消息
- linux - MinGW vs TDM-GCC-64:后增量执行
- protocol-buffers - 将 HTTP/JSON 转码为 gRPC,如何为空消息指定查询参数?
- python-3.x - 将单个字典转换为字典列表并对其进行迭代
- java - Hibernate HQL 更新与 where in