我一直在阅读Doorkeeper文档,并查看了源代码。但是,我尚未了解Doorkeeper如何生成其令牌。该文档重点介绍了如何使用Doorkeeper,但没有说明如何生成令牌,也没有说明为什么使用安全的令牌生成,验证和吊销策略。 Oauth2是一种协议,它没有说明如何生成安全的刷新令牌和访问令牌,它本身就符合Oauth2,却没有说明用于处理令牌生成和验证的技术。
可能有人解释了看门人如何生成它的访问令牌和刷新令牌,以及它为什么安全。门卫如何处理令牌吊销?
与门卫默认令牌系统相比,如果我只想处理本机移动应用程序的刷新和访问令牌,而我不需要其余的Oauth2功能,则采用我自己的“刷新令牌”策略会更安全通过使用RSA(例如,每个用户在外部用uuid标识的每个用户使用1个私钥)将公钥存储在服务器上,并通过API使用ssh样式的加密挑战,或者将JWT与RS512一起使用,并使用公钥来验证签名令牌以验证用户身份。两种情况下的撤销都可以通过将公钥列入白名单来解决。我的问题不是关于我了解的OAuth2协议,也不是关于门卫的安全性的声明,而是说我对门卫如何处理其令牌不了解,我知道同时改造轮子不是一个好主意我不想使用我不了解的东西,也不知道门卫如何处理令牌。
答案 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方法。
顺序为:
AccessTokenMixin#generate_token
之后,将创建一个新的#generate_token
#token_generator
方法(Doorkeeper::AccessToken
回调)before
令牌生成器为token_generator#generate
UniqueToken
,调用SecureRandom
方法#generate_token
,可以使用#generate_token
加密机密,或使用bcrypt
Doorkeeper::OAuth::Helpers::UniqueToken
generator is used散列(默认值:普通)对于刷新令牌,再次使用JWT。
使用SHA256
设置访问令牌生成器的能力使得可以插入不同的令牌生成器,例如Token Introspection endpoint。
令牌接收者(例如API)应使用documentation中定义的RFC7662(Token Revocation endpoint)验证收到的令牌。可以使用documentation
中定义的RFC7009("Do not roll your own crypto")撤销令牌我的建议是避免编写您自己的安全相关代码,并使用现有的开源解决方案,例如Doorkeeper,该解决方案经过同行评审并且已经被许多公司/项目(aka {{3}})信任。容易犯与安全相关的错误,并危及客户的安全和/或隐私。