【问题标题】:How to use JWT as refresh tokens with Doorkeeper?如何将 JWT 用作 Doorkeeper 的刷新令牌?
【发布时间】:2021-09-12 06:10:18
【问题描述】:
我一直在尝试找到一个指南来在 Rails 6 中实现一个使用 JWT+Refresh 令牌的身份验证 API,并通过一个不将令牌保存在 localStorage 而是在内存中的 React 客户端使用它(几乎每个我读过的教程使用带有 localStorage 的玩具应用程序,而不是可接受的生产就绪解决方案)。
我发现 Doorkeeper 在后端是一个很好的解决方案,我将它与 doorkeeper-jwt gem 一起使用,它将访问令牌转换为 JWT,但它对刷新不一样令牌(意味着它不是 JWT,而只是一个编码令牌)。我试图研究 gem 以复制刷新令牌的行为,但我在 Ruby 上不是那么好,所以我做不到。
是否有关于如何将该刷新令牌转换为 JWT 的指南?
谢谢。
【问题讨论】:
标签:
ruby-on-rails
jwt
doorkeeper
【解决方案1】:
是否有关于如何将该刷新令牌转换为 JWT 的指南?
我不喜欢用“不要”来回答“我如何...”的问题,但您没有找到现成的方法这样做的原因是因为它是有害的,而不是您应该做的事情正在做。
一般来说,JWT 很有用,因为它们可以基于公钥进行验证,而无需联系远程服务来检查其有效性。这对于长期存在的令牌来说是非常有问题的,因为撤销不再有效。这对于刷新令牌来说是一个严重的安全问题,因为刷新令牌的生命周期非常长并且必须是可撤销的。
能够验证刷新令牌的唯一服务是颁发者本身(即,Doorkeeper),并且可以使用令牌的唯一方式是在向颁发者请求新访问令牌的请求中。颁发者不需要对自己的令牌进行签名,它会在颁发新的访问令牌之前检查刷新令牌是否与数据库中未撤销的令牌匹配,这是更正确的做法。
所有其他服务应将刷新令牌视为不透明的,将其安全存储,并将其用于从 OAuth2 提供者请求新访问令牌的唯一目的。任何部分都不需要 JWT 验证。