如何存储 jwt 令牌以便重定向到其他子域不需要凭据

Posted

技术标签:

【中文标题】如何存储 jwt 令牌以便重定向到其他子域不需要凭据【英文标题】:How to store jwt token so that redirecting to other subdomain doesn't require the credentials 【发布时间】:2020-12-25 07:02:45 【问题描述】:

。我将它存储在一个 cookie 中,但在 iPhone 上,它不起作用。重定向到其他子域时要求输入密码。

function saveJWT(jwtKey, jwtValue) 
 let days;
 if(!days) 
  days = 365* 20;
 
 const date = new Date();
 date.setTime(date.getTime() + (days* 24 * 60 * 60 * 1000));
 console.log(date)

 const expires = ';expires' + date.toUTCString();
 console.log(expires)
 const prodCookie = jwtKey+ "=" +jwtValue+ expires + 
 ";domain=.cerebry.co;path=/"
const devCookie = jwtKey+ "=" +jwtValue+ expires + "; path=/ "

if(location.hostname === "localhost")
  document.cookie = devCookie;

else 
  document.cookie = prodCookie;

【问题讨论】:

【参考方案1】:

Cookie 应该可以工作,请确保在设置 cookie 时设置正确的路径和根域。 如果域在 Set-Cookie 标头中明确命名,则 2 个域 mydomain.com 和 subdomain.mydomain.com 只能共享 cookie。否则,cookie 的作用域仅限于请求主机。

如果您使用以下内容,它将在两个域中都可用: 设置 Cookie:名称=值;域=mydomain.com

由于 cookie 可能会被 XSS 攻击窃取,因此请确保防止令牌侧钉。请参阅 OWASP 以保护您的 JWT 身份验证机制 https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html

【讨论】:

pastebin.com/BKi2qWDs我用这种方式保存,请问我这里做错了什么? 我将域视为 .domain=.cerebry.co。删除开始时的点字符。例如,如果您的域是 app.cerebry.co,则域应设置为“cerebry.co”。此外,由于最近 chrome 对 cookie 的更改,请确保首先设置 cookie,因为如果未设置相同站点属性,则需要 https 域 我改用 cerebry.co 仍然无法在 iPhone 上运行 那部iphone的ios版本是多少?你试过用旧的 iphone 吗? 尝试使用旧的 ios 版本或尝试通过 mac 进行调试,它应该会显示一些问题【参考方案2】:

在 Iphone 中保存 cookie 时出现问题,所以我使用 js-cookie 库解决了我的问题 JS COOKIE LINK

【讨论】:

是否特定于特定的 ios 版本或手机?因为我听说 safari 在子域中的 cookie 有一些问题

以上是关于如何存储 jwt 令牌以便重定向到其他子域不需要凭据的主要内容,如果未能解决你的问题,请参考以下文章

在 Vue.js 中捕获和重定向 JWT 令牌过期,而不阻塞 Vue 3 中的其他 401 错误

OAuth提供者重定向后如何给用户JWT令牌?

.net MVC 重定向与 JWT 令牌

如果刷新(JWT)令牌未经授权(401响应),AngularJS重定向到登录

在 JWT 刷新时出现 401 时重定向

如何从子域重定向到其他域URI?