Doorkeeper JWT 无需将整个 jwt 存储在数据库中

Doorkeeper JWT without storing the whole jwt in database

我们有一个使用 doorkeeper 的 oauth 服务器。我们想开始使用 doorkeeper jwt,但我们还不能为所有 oauth 客户端启用它,因为有些客户端超出了我们的控制范围,我们非常确定它们将应用程序收到的访问令牌存储在 varchar(255) 列中如果我们开始为所有应用程序分发 JWT 令牌,它将无法工作。此外,如果我们可以避免的话,我们也真的不想将整个 JWT 存储在我们的数据库中。

我们的想法是让门卫首先为所有应用程序生成一个不透明的访问令牌,并将其存储在数据库中。然后在 return 应用程序的不透明访问令牌之前,我们检查应用程序是否启用了 JWT 令牌,如果是,则将不透明访问令牌转换为 JWT 访问令牌,使用不透明访问令牌作为 JWT 的 jti 索赔。如果应用程序启用了 JWT 访问令牌,我们正在考虑使用 before_successful_strategy_response 回调转换为使用 doorkeeper-jwt gem 的 JWT。

然后,当我们收到具有访问令牌的请求时,检查访问令牌是否是 JWT 访问令牌,如果是,则从中读取 jti 声明并使用它来加载来自数据库的访问令牌。我们目前没有合适的地方来解决这个问题。现在我们正在考虑在 from_request 方法中进行猴子修补 Doorkeeper::Oauth::Token 以在 return 之前检查令牌是否是 JWT,如果是,return JWT jti 代替。

这看起来是一种合理的方法吗?还有没有猴子补丁的另一种方法Doorkeeper::Oauth::Token?

较新版本的 doorkeeper 允许您配置访问令牌模型 class,如下所示: https://github.com/doorkeeper-gem/doorkeeper/blob/55488ccd9910e0c45ed4342617da8e026f4f55b5/lib/doorkeeper/oauth/token.rb#L17

所以我们可以挂钩访问令牌查找,而无需诉诸猴子补丁。