高效的OAuth2.0服务器/提供商如何运作?

Jon*_*her 5 security encryption cryptography digital-signature oauth-2.0

我可能需要为我正在创建的API实现OAuth2.0服务器.此API允许第三方代表用户执行操作.

OAuth2.0有3个电源呼叫.首先,有一个提示用户同意的电话.这会返回一个code.第二个是code交换a的地方access token.最后,access token用于代表用户调用API.

为了实现,我认为第一个调用生成一个随机字符串,作为一个code.在code随后被保存在一个指向当前用户和随机数据库HMAC Key,然后随机数据返回给第三方的code.

当第三方请求时access token,生成另一条随机数据并与之连接code.使用HMAC key步骤1中的字符串对此字符串进行签名,然后返回此签名字符串和签名以及签名以形成access token.

发生API调用时,将从数据库中检索hmac key与提供的对应access_token的内容.access_token使用hmac密钥验证签名.

用户可以通过简单地从他们的授权HMAC密钥列表中删除HMAC密钥来撤销第三方访问.此外,但只是签署随机数据,我可以避免存储每个创建的每个access_token,而是维护一个简短的hmac键列表.

无论如何,这是我第一次尝试思考.令人惊讶的是,关于有效实现OAuth2.0服务器端的信息很少.我宁愿在数据库中保留尽可能少的信息.签署随机数据然后撤销HMAC密钥的优点是我不必存储每个access token授权调用生成的每个单独的数据.

需要思考!必须有一个更好的方法!

编辑:

我不是在寻找实施方案.谢谢你!此外,我假设整个系统将运行HTTPs.另外,我说的是纯OAuth2.0流程,我不是在谈论带有签名和客户端密钥的OAuth1.0.我问如何在OAuth2.0服务器后面设计密码术,该服务器的工作方式与(例如)Google的OAuth2.0流程类似.

div*_*shm 9

我对此没有确切的答案,但让我们尝试将各个部分放在一起 -

i)我不太确定您是否需要将授权代码保存在数据库中很长时间.这就是Facebook所说的 -

OAuth授权码的新安全限制我们只允许一次授权代码交换访问令牌,并要求在创建后的10分钟内将其交换为访问令牌.这与OAuth 2.0规范一致,从一开始就说"授权代码必须是短期和单次使用".有关更多信息,请查看我们的身份验证文档.

请参阅此链接,https://developers.facebook.com/roadmap/completed-changes/(12月5日,更改).

ii)如果要执行第1步之前的操作,请将授权码和HMAC密钥保存在DB中.让我们拥有10分钟的授权代码(或您认为必要的任何代码),然后删除授权代码.

iii)假设您有一个单点登录服务来验证客户端的凭据.当客户端应用程序命中令牌交换端点(访问令牌的身份验证代码)时,您需要获取HMAC密钥并返回访问令牌.为什么不添加(一些随机数据+时间戳+ customerID /客户名称(或可用于唯一标识用户的内容))并使用密钥对其进行签名并将所有这些数据作为访问令牌返回.
您可以考虑使用新的HMAC密钥并替换旧密钥.

iv)当客户端使用令牌访问任何API端点时,让srvice在内部调用CustomerIDExtractorService,该服务从DB获取HMAC密钥并解密访问令牌并将customerID返回到相关API.然后,独立进程可以使用客户ID来获取数据.基本上,我要求您将登录/令牌生成/令牌信息提​​取过程分离到一个单独的单元.

让我们尝试将此映射到Google如何做这样的事情
i)您使用应用程序并登录Google Oauth.(让谷歌的黑匣子X处理登录).
ii)您的应用程序命中令牌交换端点 - >服务在内部检查代码是否有效.如果是,则服务组合一些数据+ customerID并对其进行签名,并将其作为访问令牌返回给应用程序.
iii)该应用程序现在点击(比方说)google +端点.在内部,服务将令牌传输到黑盒X,黑盒X解密令牌并将客户ID返回给G +服务.g +然后将C_ID映射到相关的客户数据.

另一个建议

根据应用程序请求的范围,您可以向访问令牌添加更多信息.也许创建一个JSON对象并根据应用程序选择的范围添加/删除字段.将JSON字符串签名为访问令牌.