我使用在后端制作的set-cookie标头在设备上设置安全的,仅HTTP的cookie。在桌面Safari,Chrome,FF,IE等上,它的工作原理非常吸引人。在Android Chrome上,它也可以工作。但是,当我尝试在移动Safari或Chrome浏览器中的iOS上从我的Web应用程序运行完全相同的代码时,请求中没有发送Cookie,并且我的Web应用程序无法正常工作。
我尝试查看其他堆栈溢出答案和问题,并尝试修改设置并测试是否有几种不同的iOS设备。我希望我的网络应用程序能够正常运行,而无需修改默认的iOS Safari设置。我真的不明白为什么iOS无法正常运作..因为这种行为似乎是空前的。
(authorization.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标头设置一个cookie,以存储一个安全的,仅HTTP的cookie,该cookie存储我的访问/刷新令牌为用户。 Cookie也应在后续请求中发送。如果您想自己进行测试,则该站点为https://swipeme.in。我在登录和注册期间存储cookie。测试cookie设置并发送回去的最佳方法是在注册过程中以及在下一个请求中(照片上传)。
答案 0 :(得分:0)
遇到相同的问题,这是由于路径引起的,再次将其设置为“ /”是很好的:
// 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 )
答案 1 :(得分:0)
要完成此cookie(安全,httpOnly)设置过程,有两件事很重要。
确保客户端上的请求始终包含与“ Allow-Credentials” https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials
相匹配的凭据如果您使用仅HTTP的安全cookie,则您请求的API必须来自同一域。 (例如,如果我的网站托管在https://swipeme.in上,则它请求的api必须类似于https://api.swipeme.in)
当我在其他域中使用AWS Lambda函数时遇到了这个问题。然后,我将API网关配置为使用自定义域对其进行修复。