【发布时间】:2021-07-13 05:38:44
【问题描述】:
我打算制作一个包含两个部分的应用程序:
- React 原生移动应用
- 桌面用户的浏览器网络应用
我正在尝试计划如何为此管理后端身份验证(Node.js、passport.js)。理想情况下,无论哪种类型的客户端,我都可以让一个后端管理它。
假设我将只拥有谷歌身份验证(为简单起见)。我不需要点击 googles API 获取任何信息(如个人资料、联系人等),我只希望他们使用 google 帐户登录。到目前为止,我的理解是有两种主要方式(特别是因为我使用的是 passport.js)。
- 基于 jwt 的方法
- 基于会话的方法
对于任何一种方法,当涉及到 react native 应用程序时,我的问题就会出现。由于我无法使用HttpOnly cookie,我不确定如何安全地存储数据。例如
-
在 jwt 方法中,如果服务器管理访问令牌和刷新令牌,则 react 本地客户端可以将它们存储在同一位置,例如 https://github.com/mcodex/react-native-sensitive-info。这意味着刷新令牌与访问令牌一样容易受到影响,这会破坏刷新令牌的意义,因此不妨让访问令牌长期存在。
-
在基于会话的方法中,react native 可以将会话 id 存储在某个位置(如上面的 react-native-sensitive-info),并且会出现同样的问题
我目前对应该做什么的想法:
似乎没有办法解决在 react-native 中存储信息的安全问题,所以到目前为止,我觉得我只是要遵循 JWT 方法,并将访问 + 刷新令牌存储在 react-native-敏感信息。但是,这确实意味着当用户代理移动时,登录端点将在请求正文中返回访问 + 刷新令牌。当用户代理是 web 时,我们应该能够设置一个 httponly cookie。我唯一能想到的是,如果有一个恶意请求屏蔽了用户代理(这可能吗?),然后可以在正文中接收访问 + 刷新令牌,并且可以用它做任何事情。
抛开性能
基于会话的存储方法总体上看起来要简单得多。是的,它确实将状态存储在后端,但是如果我们使用 JWT 方法,无论如何我们都必须在后端的某个地方存储用户刷新令牌(如果有需要使用户刷新令牌无效的情况,例如在注销或损坏预防时) )。
这样,假设我们有一个会话表,当用户注销时,或者如果我们想要使会话无效,我们所要做的就是从该表中删除行。在 JWT 方法中,如果我们想使刷新令牌无效,我们必须有一个阻止列表表(它只会不断增长,因为刷新令牌不应该过期,但我想它们可以在很长一段时间后被删除时间)。但是,如果您有很多用户,则会话表可能会变大,这可能会导致性能问题(但您可能会丢弃超过一定年龄的会话)
/旁观
问题:
-
我注意到移动应用程序从未要求我使用 OAuth 重新登录。这是否意味着他们在访问令牌过期时不断使用刷新令牌?如果没有明确的方法以安全的方式将其存储在移动设备中,那么它们是否只有超持久的访问令牌?
-
所有这些想法都是多余的吗?将一个超级持久的访问令牌存储在本机反应中并一直使用它是否可以?那么当用户按下“注销”时,我们可以从本地存储中删除它吗?
-
像 auth0 这样的第三方身份验证系统会为我管理所有这些吗?
【问题讨论】:
标签: node.js react-native authentication jwt passport.js