【发布时间】:2018-06-12 04:18:55
【问题描述】:
我正在开发一个带有 GraphQL 后端的新 SPA。我不确定的是如何正确解决 JS 客户端和 GraphQL 后端之间的身份验证。出于身份验证的目的,后端是 GraphQL 还是良好的旧 REST 并不重要。
我在 StackOverflow 上阅读了一些文章和其他问题。以下是我收集的可能解决方案及其问题:
Cookies
当然,cookie 容易受到 CSRF 攻击。所以也许 cookie 可以与一些额外的 CSRF 保护一起使用。不过,在这种情况下,我找不到如何实现它。如何在 SPA 中创建和使用 CSRF 令牌?
JWT(JSON Web 令牌)
显然JWT有很多问题,不应该使用:
- https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid
- http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
- http://cryto.net/%7Ejoepie91/blog/2016/06/19/stop-using-jwt-for-sessions-part-2-why-your-solution-doesnt-work/
其他一些标记
这是大多数 REST API 所做的 - 客户端通常在 X-Auth-Token 标头中发送身份验证令牌。这当然没有 cookie 的 CSRF 漏洞,但并不完全适合 SPA(REST API 通常不是为 SPA 前端应用程序设计的)。它与 JWT 存在一些问题——主要是令牌需要存储在客户端的 LocalStorage 中。 (在上面链接的关于 JWT 的 article 中进行了解释。)
问题是我总是发现一些批评,为什么解决方案 X 是错误的,没有信息可以使用什么来代替,或者建议使用解决方案 Y,而不考虑该解决方案的问题。
许多网站都说 API 应该是无状态的 - 不保存有关当前经过身份验证的会话的任何数据,因为它可以防止水平扩展。我并不真正关心这个问题 - 99% 的应用程序都不需要水平扩展。
那么 SPA 身份验证的最佳做法是什么?您在 SPA 中使用什么解决方案?
我不一定会忽略上面列出的所有解决方案,但如果应该使用其中任何一个,我需要以某种方式解决他们的问题,或者有充分的理由忽略这些问题。
【问题讨论】:
标签: authentication single-page-application