门卫使用什么技术或算法来生成其刷新令牌和访问令牌,以及为什么要保证其安全

时间:2019-05-07 03:43:53

标签: ruby-on-rails ruby oauth-2.0 doorkeeper

我一直在阅读Doorkeeper文档,并查看了源代码。但是,我尚未了解Doorkeeper如何生成其令牌。该文档重点介绍了如何使用Doorkeeper,但没有说明如何生成令牌,也没有说明为什么使用安全的令牌生成,验证和吊销策略。 Oauth2是一种协议,它没有说明如何生成安全的刷新令牌和访问令牌,它本身就符合Oauth2,却没有说明用于处理令牌生成和验证的技术。

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

与门卫默认令牌系统相比,如果我只想处理本机移动应用程序的刷新和访问令牌,而我不需要其余的Oauth2功能,则采用我自己的“刷新令牌”策略会更安全通过使用RSA(例如,每个用户在外部用uuid标识的每个用户使用1个私钥)将公钥存储在服务器上,并通过API使用ssh样式的加密挑战,或者将JWT与RS512一起使用,并使用公钥来验证签名令牌以验证用户身份。两种情况下的撤销都可以通过将公钥列入白名单来解决。

我的问题不是关于我了解的OAuth2协议,也不是关于门卫的安全性的声明,而是说我对门卫如何处理其令牌不了解,我知道同时改造轮子不是一个好主意我不想使用我不了解的东西,也不知道门卫如何处理令牌。

1 个答案:

答案 0 :(得分:2)

以下是门卫版本v5.2.3的主要部分的解释以及代码的指针。

默认情况下,Doorkeeper提供了一种specify the TokenGenerator的访问方式。

如果未指定default one is Doorkeeper::OAuth::Helpers::UniqueToken,则SecureRandom

TokenGenerator生成器使用generate(由Ruby标准库提供)使用.urlsafe_base64中指定的RFC6750方法来SecureRandomn.urlsafe_base64令牌。实际上,您可以认为using ActiveRecord对于所有意图和目的都足够安全。

Doorkeeper将访问令牌存储在数据库中,并且是Before creating(来自Rails)作为ORM。 #generate_token在数据库中的一个UniqueToken条目,它调用Doorkeeper::AccessToken方法。 AccessTokenMixin混合方法included in Doorkeeper::AccessToken model提供了successfully authenticating but before responding方法。

顺序为:

  1. AccessTokenMixin#generate_token之后,将创建一个新的#generate_token
  2. 调用#token_generator方法(Doorkeeper::AccessToken回调)
  3. returned方法被称为
  4. 默认的before令牌生成器为token_generator#generate
  5. 返回UniqueToken,调用SecureRandom方法
  6. 令牌是使用before stored
  7. 生成的
  8. 返回#generate_token,可以使用#generate_token加密机密,或使用bcrypt Doorkeeper::OAuth::Helpers::UniqueToken generator is used散列(默认值:普通)
  9. 令牌已保存在数据库中并返回给调用方

对于刷新令牌,再次使用JWT

使用SHA256设置访问令牌生成器的能力使得可以插入不同的令牌生成器,例如Token Introspection endpoint

令牌接收者(例如API)应使用documentation中定义的RFC7662Token Revocation endpoint)验证收到的令牌。可以使用documentation

中定义的RFC7009"Do not roll your own crypto")撤销令牌

我的建议是避免编写您自己的安全相关代码,并使用现有的开源解决方案,例如Doorkeeper,该解决方案经过同行评审并且已经被许多公司/项目(aka {{3}})信任。容易犯与安全相关的错误,并危及客户的安全和/或隐私。