Doorkeeper 使用什么技术或算法来生成它的刷新令牌和访问令牌以及为什么它是安全的

What technology or algorithm Doorkeeper use to generate it's refresh tokens and access tokens and why is it secured

我一直在浏览 Doorkeeper 文档并查看源代码。但是,我还没有了解 Doorkeeper 是如何生成它的令牌的。该文档的重点是如何使用 Doorkeeper,但他们没有解释他们如何生成令牌,也没有解释为什么他们使用安全的令牌生成、验证和撤销策略。 Oauth2 是一种协议,它没有说明如何生成安全的刷新令牌和访问令牌,符合 Oauth2 本身也没有说明用于处理令牌生成和验证的技术。

有人可以解释看门人如何生成它的访问令牌和刷新令牌,以及为什么它是安全的。 Doorkeeper 如何处理令牌撤销?

与 doorkeeper 默认令牌系统相比,如果我只想处理本机移动应用程序的刷新和访问令牌并且我不需要 Oauth2 的其余功能,那么我自己推出会更安全吗"refresh token" 策略,例如使用 RSA,每个用户使用 1 个私钥在外部用 uuid 标识,并将 public 密钥存储在服务器上,并在 API 上使用 ssh 样式加密质询,或使用 JWT 和 RS512并使用 public 密钥验证令牌的签名以对用户进行身份验证。两种情况下的撤销都将通过将 public 键列入白名单来处理。

我的问题不是关于我理解的 OAuth2 协议或关于门卫安全性的声明,而是声明我对门卫如何处理其令牌的无知,我知道重新发明轮子不是一个好主意,在同时我不想用我不懂的东西,我也不明白看门人是怎么处理令牌的

这里是 Doorkeeper 版本 v5.2.3 的主要部分的解释以及代码指针。

默认情况下,Doorkeeper 提供了一种方法specify the TokenGenerator

如果没有指定TokenGeneratordefault one is Doorkeeper::OAuth::Helpers::UniqueToken.

UniqueToken 生成器正在使用 SecureRandom (provided by the Ruby standard library) to generate a token using the .urlsafe_base64 method as specified in RFC6750. Practically, you can consider SecureRandomn.urlsafe_base64 足够安全的所有意图和目的。

Doorkeeper 将访问令牌存储在数据库中,并且是 using ActiveRecord (from Rails) as an ORM. Before creating a Doorkeeper::AccessToken entry in the database it calls the #generate_token method. The #generate_token method is provided by the AccessTokenMixin mix-in which is included in Doorkeeper::AccessToken model

顺序是:

  1. successfully authenticating but before responding 之后将创建一个新的 Doorkeeper::AccessToken
  2. 调用了AccessTokenMixin#generate_token方法(before回调)
  3. 调用了#token_generator方法
  4. 默认的 UniqueToken 令牌生成器是 returned
  5. 回到 #generate_token token_generator#generate 方法被调用
  6. 令牌是使用SecureRandom
  7. 生成的
  8. 回到 #generate_token 秘密可以使用 bcrypt 加密或使用 SHA256 before stored 散列(默认:普通)
  9. 令牌保存在数据库中并返回给调用者

对于刷新令牌,Doorkeeper::OAuth::Helpers::UniqueToken generator is used

使用 Doorkeeper.configuration.access_token_generator 设置访问令牌生成器的能力使得插入不同的令牌生成器成为可能,例如 JWT

令牌接收者(例如 API)应使用 Token Introspection endpoint (documentation) as defined in RFC7662 验证收到的令牌。可以使用 Token 撤销令牌 撤销端点 (documentation) as defined in RFC7009

我的建议是避免自己编写与安全相关的代码,并使用现有的开源解决方案,例如 Doorkeeper,这些解决方案经过同行评审并且已经受到许多公司/项目的信任(又名。"Do not roll your own crypto")。很容易犯与安全相关的错误并危及客户的安全 and/or 隐私。