如何使用 JWT 作为 Doorkeeper 的刷新令牌?

How to use JWT as refresh tokens with Doorkeeper?

我一直在努力寻找一个指南来实现 Rails6 中的身份验证 API,它使用 JWT+Refresh 令牌,并通过不保存的 React 客户端使用它令牌在 localStorage 但在内存中(我读过的几乎每一个教程都使用带有 localStorage 的玩具应用程序而不是可接受的生产就绪解决方案)。

我发现 Doorkeeper 在后端是一个很好的解决方案,我将它与 doorkeeper-jwt gem 一起使用,将访问令牌转换为 JWT,但它不会't 对刷新令牌执行相同的操作(这意味着它不是 JWT,而只是一个编码令牌)。我试图研究 gem 来复制刷新令牌的行为,但我在 Ruby 上不太擅长,所以我做不到。

是否有关于如何将该刷新令牌转换为 JWT 的指南?

谢谢。

Is there a guide around on how to convert that refresh token into a JWT?

我不喜欢用“不要”来回答“我该如何……”的问题,但您之所以找不到现成的方法来回答这个问题,是因为它有害而不是什么你应该做的。

JWT 通常很有用,因为它们可以根据 public 密钥进行验证,而无需联系远程服务来检查其有效性。这对于长期存在的令牌来说是非常有问题的,因为撤销不再有效。对于刷新令牌来说,这将是一个严重的安全问题,刷新令牌的寿命非常长,并且必须是可撤销的。

能够验证刷新令牌的唯一服务是颁发者本身(即 Doorkeeper),并且可以使用令牌的唯一方式是在向颁发者请求新访问令牌的请求中。发行者不需要对自己的令牌进行签名,它会在发行新的访问令牌之前检查刷新令牌是否与其数据库中未撤销的令牌相匹配。

所有其他服务都应将刷新令牌视为不透明的,安全地存储它,并将其用于从 OAuth2 提供商请求新访问令牌的唯一目的。任何部分都不需要 JWT 验证。