【发布时间】:2020-01-13 19:37:44
【问题描述】:
我正在尝试在 Next.js 前端和 Rails API 后端之间实现身份验证,但我很难理解如何正确地安全地进行此操作。
我在 Rails 端使用 jwt-sessions gem,登录时返回 access_token、refresh_token 和 csrf 令牌。 csrf 只能通过标头发送,并且对于所有非 GET 或 HEAD 请求都是必需的。 access 和 refresh 可以通过标头 或 由 cookie 给出。
我可以实现后端以在 JSON 响应中返回所有令牌,或设置 cookie,或两者兼而有之。
问题是,客户端我看不到存储这些令牌的真正方法是:
- 安全
- 在 SSR 期间以及在浏览器中可用
这是我看到的选项
选项 1:服务器设置 httpOnly Cookies
这是jwt-sessions gem 推荐的。将 CSRF 保存在 localStorage 中,而将其他令牌保存在服务器设置的 httpOnly cookie 中。
这似乎是最安全的,但是通过getInitialProps 的SSR 根本不起作用,因为它无法通过fetch 发送cookie。我什至不能手动发送它们,因为我在 JS 中看不到它们。
选项 2:非 httpOnly Cookies
这就是official next example 似乎在做的事情(尽管使用了一个可能是无状态的令牌)
让服务器或浏览器设置 cookie没有 httpOnly。
我可以通过 SSR 访问它,但这不会打开我的 XSS 吗?
选项 3:使用浏览器存储
只需将所有令牌放入localStorage 和/或sessionStorage。这似乎是最糟糕的选择,因为它在 SSR 中不起作用,而且据我所知并不安全。
????
我错过了什么吗?是非httpOnly,就像在官方的例子中,好吗?有更好的方法吗?还是我必须忽略 SSR(因此是 Next.js 的杀手级功能之一)?
【问题讨论】:
-
next.js 服务器端应用程序是否由与
jwt-sessionsgem 相同的域提供服务?如果没有,jwt-sessionsgem 无法设置 next.js 服务器端渲染可以看到的 cookie。 -
csrf只能通过 header 发送,并且对于所有非 GET 或 HEAD 请求到 rail 后端 都需要,因此需要将其传递给任何时候服务器端都可能向后端发出非 GET 或 HEAD 请求时,next.js 服务器端?
标签: javascript ruby-on-rails authentication jwt next.js