使用JWT验证移动应用程序并刷新令牌

时间:2015-11-13 18:21:13

标签: ruby-on-rails authentication oauth-2.0 jwt json-web-token

目前,我正在开始研究这个问题。我过去几天做了一些研究,似乎我没有明白如何实现以下目标:

我目前正在使用移动应用程序作为客户端在Rails中构建API。移动应用程序可以是iOS或Android。现在,我正在努力进行身份验证。客户端登录设备后,我发出了一个短期到期的JWT。因此,如果令牌过期,客户端需要重新登录,这在我的情况下是不可接受的用户体验。无论如何,我觉得我需要有某种过期,以防止令牌被盗后永久使用。

现在我想知道如何集成刷新令牌。如何确保用户只能使用已发布到此确切设备的有效刷新令牌获取新的访问令牌?或者我是否过度复杂化并分配一个可以在alle设备上使用的刷新令牌可以解决这个问题?

更新:我查看了门卫gem,它支持密码授权流程。但是门卫处理令牌的方式是,它将每个生成的访问令牌存储在具有相应刷新令牌的数据库中。令牌被撤销或刷新后,旧的访问令牌将失效 - 随着时间的推移,这将增长到一个巨大的数据库表。

此外,我更喜欢使用JWT作为令牌,因此我不必在数据库中存储除刷新令牌之外的任何内容。以下过程是否安全?

  1. 用户请求使用用户名/密码访问令牌,并且 - 让我们说设备名称。
  2. 服务器发出JWT并为当前设备创建刷新令牌。
  3. 服务器存储刷新令牌。
  4. 当访问令牌过期时,用户使用它的刷新令牌请求新的令牌。
  5. 服务器验证刷新令牌并发出新的访问令牌。此外,刷新令牌将被替换为新的。
  6. 我的问题:用户可以登录多个设备,如何区分它们?

3 个答案:

答案 0 :(得分:0)

我看到工作的方式是服务器返回未经授权的状态(401),其中包含一条消息,指示访问令牌已过期,但客户端只有一次机会请求新的令牌已过期令牌。一旦客户端使用该过期令牌请求新令牌,则过期令牌将变为无效且无法再使用。这样你就可以继续用新的代币换新的代币。

如果您的到期时间很短,被盗令牌仍然有效的可能性非常小,但从用户体验的角度来看,用户将保持登录状态,因为令牌协商只能在后台进行。用户的令牌只有在他们注销或者他们正在使用的令牌在服务器端明确无效时才会失效。

对于您拥有的每个用户名/密码组合,您肯定应该拥有唯一的令牌。对应用程序中的每个客户端使用相同的令牌将是非常不安全的。

答案 1 :(得分:0)

我喜欢刷新令牌的想法。在后端使用doorkeeper gem怎么样?这样,令牌到期就会在每个客户端请求上更新。

  

用户请求使用用户名/密码访问令牌 - 让我们说a   设备名称。

向您的服务器发送用户名/密码和设备名称会使客户无需向您提供凭据的目的失败。

我看到它是因为移动客户端从oauth提供者请求令牌ID(您需要服务器clientID)。移动客户端将令牌ID发送到您的服务器进行验证,从而确保客户端身份。服务器可以在成功验证提供的JWT中找到用户电子邮件地址。查看rails google-token-id gem。

答案 2 :(得分:0)

安全始终是相对的,我们可以通过更多努力使任何人滥用系统更加困难。承载令牌是IO绑定(缓存/数据库调用),JWT令牌是CPU(加密/解密)绑定。两者都是常规服务领域的足够好的解决方案,除了我们在这里关于移动设备的一件事。这里可以使用的方法之一是通过反向信道将令牌/刷新令牌发送到设备,而不是将其作为身份验证的一部分发送。似乎有些额外的工作,但在发布和刷新移动设备的令牌方面提供了更多的安全性。更多细节可以在http://sdhankar.com/2016/10/24/authentication-and-jwt-token-refresh-on-mobile-devices/

找到