目前,我开始为此烦恼。过去几天我做了一些研究,似乎我不太明白如何实现以下目标:
我目前正在使用移动应用程序作为客户端在 Rails 中构建一个 API。移动应用程序可以是 iOS 或 Android。现在我正在努力进行身份验证。客户端登录设备后,我发出一个短期过期的 JWT。因此,如果令牌过期,客户端需要重新登录,这在我的情况下是不可接受的用户体验。无论如何,我觉得我需要有某种过期,以防止令牌被盗后永远使用。
现在我想知道如何集成刷新令牌。如何确保用户只能使用已颁发给此确切设备的有效刷新令牌来获得新的访问令牌?还是我让事情变得过于复杂并分配一个可以在所有设备上使用的刷新令牌就可以了?
更新:我查看了支持密码授予流程的门卫 gem。但是门卫处理令牌的方式是,它将每个生成的访问令牌与相应的刷新令牌一起存储在数据库中。当令牌被撤销或刷新时,旧的访问令牌会失效——随着时间的推移,这将增长到一个巨大的数据库表。
此外,我更喜欢使用 JWT 作为令牌,因此我不必在数据库中存储刷新令牌以外的任何内容。以下过程是否安全?
- 用户使用用户名/密码请求访问令牌 - 假设是设备名称。
- 服务器发出 JWT 并为当前设备创建一个刷新令牌。
- 服务器存储刷新令牌。
- 当访问令牌过期时,用户使用它的刷新令牌请求一个新令牌。
- 服务器验证刷新令牌并发出新的访问令牌。此外,刷新令牌将替换为新令牌。
我对此的问题:用户可以在多个设备上登录,如何区分它们?