我的前端在“https://example.com”上运行,后端在“https://api.example.com”上运行。
从后端,登录端点“https://api.example.com/auth/login”在响应标头中返回刷新令牌,如下所示(我可以在浏览器网络选项卡中看到它):
Access-Control-Allow-Origin:https://example.com
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Set-Cookie: refreshToken=eyJhbGciOiJIUzI1NiJ9...; Path=/auth/refresh; Domain=example.com; Max-Age=31536000000; Expires=Thu, 23 Oct 3023 00:57:41 GMT; Secure; HttpOnly; SameSite=Lax
other headers....
但是当前端调用刷新访问令牌时,请求不包含刷新令牌。浏览器不会在请求中附加令牌,服务器会以 403 拒绝它。以下是刷新令牌的请求详细信息:
Request URL:https://api.example.com/auth/refresh
Request Method:POST
Status Code:403 Forbidden
Remote Address:xxxxx
Referrer Policy:strict-origin-when-cross-origin
请求标头:
:authority:api.example.com
:method:POST
:path:/auth/refresh
:scheme:https
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, br, zstd
Accept-Language:en-GB,en-US;q=0.9,en;q=0.8
Content-Length:0
Origin:https://example.com
Priority:u=1, i
Referer:https://example.com
当刷新令牌来自同一子域并且刷新令牌 cookie 中也设置了域属性时,为什么浏览器不附加或存储刷新令牌?
该 cookie 在浏览器的开发工具中也不可见。
最终通过“J Asgarov”我解决了这个问题。 cookie 设置没问题,因为我已经在其中设置了域“example.com”(不再需要在其中引导
.
,如果根匹配,浏览器也允许子域)。
真正的问题是,我仅针对
withCredentials
请求将 refresh token
设置为 true,而对于 login
请求也需要为 true。启用登录后,浏览器能够读取刷新令牌 cookie,否则登录响应会忽略它。
根据网络文档,传出请求和传入响应都需要 withCredentials 标志。 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials