认证具有智威汤逊和刷新令牌

问题描述:

目前我开始拉我的头发了这个移动应用程序。我做了一些研究过去的日子里,似乎我没有得到相当的点如何实现以下目标:认证具有智威汤逊和刷新令牌

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

现在我不知道如何将刷新令牌整合。我如何确保用户只有使用已发布到此确切设备的有效刷新令牌才能获得新的访问令牌?还是我过分复杂的事情,并分配一个刷新令牌,可以用于传输设备将做的伎俩?

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

此外,我更喜欢使用JWT的道理,所以我没有存储任何东西,但在数据库中刷新令牌。下面的过程是安全的吗?

  1. 用户请求使用用户名/密码的访问令牌 - 我们假设一个设备名称。
  2. 服务器发出JWT并为当前设备创建一个刷新令牌。
  3. 服务器存储刷新令牌。
  4. 当访问令牌过期后,用户使用它的刷新令牌请求一个新的。
  5. 服务器验证刷新令牌并发出新的访问令牌。此外,刷新令牌将被替换为新的令牌。

我对此的疑问:用户可以在多个设备上登录,如何区分它们?

我看到这项工作的方式是服务器返回未授权状态(401),并显示一条消息,指出访问令牌已过期,但客户端恰好有一次机会请求带有该令牌的新令牌过期的令牌。一旦客户端使用该过期令牌来申请新令牌,过期令牌就会失效并且不能再使用。这样你就可以继续交易旧的代币换新的代币。

如果您的过期时间很短,被盗的令牌仍然有效的可能性很小,但从UX的角度来看,用户将保持登录状态,因为令牌协商可能发生在后台。用户的令牌只有在注销时才会失效,或者他们正在使用的令牌在服务器端显式失效。

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

+0

其实我不太喜欢只有一个访问令牌没有刷新令牌的想法。所以潜在的攻击者可以用被盗的访问令牌生成无限的新令牌。此外,我希望尽可能地接近OAuth2规范。 –

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

用户使用用户名/密码请求访问令牌,并且让我们假设一个 设备名称。

发送用户名/密码和设备名称到您的服务器将失败客户端的目的,而不必为您提供他们的凭据。

我看到它作为移动客户端从oauth提供程序请求令牌id(您需要服务器clientID)。移动客户端将令牌标识发送到您的服务器进行验证,从而确保客户身份。服务器可以通过成功的验证提供JWT中的用户电子邮件地址。看到导轨google-token-id宝石。

+0

请参阅我更新的问题。我想使用JWT,并且使用门卫+ jwt将最终在数据库内存储jwt令牌 - 无论如何,JWT应该是独立于数据库的,因此将它们存储在数据库中是没有意义的。 –

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

+0

堆栈溢出具有[关于联盟披露的政策](http://*.com/help/promotion)我知道您的网站与您的用户名相匹配,但我建议您明确指出您的连接。例如,您可以在链接旁边添加短语“我的网站”。 – RJHunter