一个高效的OAuth2.0服务器/提供者将如何工作?
我可能需要为我创建的API实现OAuth2.0服务器。 这个API将允许第三方代表用户执行操作。
OAuth2.0有3个市电电话。 首先,有一个电话提示用户同意。 这会返回一个code
。 第二个是code
交换access token
。 最后, access token
用于代表用户调用API。
为了实现,我认为第一次调用会生成一个随机字符串作为code
。 然后将code
存储在数据库中,指向当前用户的指针和随机HMAC Key
,随机数据作为code
返回给第三方。
当第三方请求access token
,会生成另一条随机数据并与code
连接。 该字符串使用步骤1中的HMAC key
进行签名,然后该签名字符串和签名与签名一起返回以形成access token
。
发生API调用时,将从数据库中检索与所提供的access_token
对应的hmac key
。 使用hmac密钥验证access_token
的签名。
用户可以通过从其授权的HMAC密钥列表中简单地删除HMAC密钥来撤销第三方访问。 此外,只是签署随机数据,我可以避免存储每个创建的每个access_token,而是保留一个hmac密钥的简短列表。
无论如何,这是我第一次尝试这个想法。 令人惊讶的是,很少有关于有效实现OAuth2.0的服务器端的信息。 我宁愿在数据库中保留尽可能少的信息。 签署随机数据然后撤销HMAC密钥的好处是,我不必存储每个授权调用产生的每个access token
。
需要思考! 必须有更好的方法!
编辑:
我不是在寻找一个实现。 谢谢你! 另外,我假设整个系统将通过HTTPs运行。 另外,我正在谈论纯OAuth2.0流程,我不是在谈论具有签名和客户端密钥的OAuth1.0。 我在问如何设计OAuth2.0服务器后面的加密算法,这种加密算法的工作方式与Google的OAuth2.0流程类似(例如)。
我没有一个确切的答案,但我们试着把这些东西放在一起 -
i)我不太确定您是否需要长时间将授权码保存到数据库中。 这就是Facebook所说的 -
OAuth授权代码的新安全限制我们只允许授权代码交换一次访问令牌,并要求他们在创建后10分钟内交换访问令牌。 这与OAuth 2.0规范一致,从一开始就表明“授权代码必须是短暂且单次使用”。 有关更多信息,请查看我们的身份验证文档。
看到这个链接,https://developers.facebook.com/roadmap/completed-changes/(12月5日,更改)。
ii)直到第1步完成你正在做的事情,将授权码和HMAC密钥保存在数据库中。 让我们拥有10分钟的授权码(或者您觉得有必要的任何内容),然后删除授权码。
iii)假设您有一个单一的登录服务来验证客户的凭证。 当客户端应用程序访问令牌交换端点(访问令牌的授权代码)时,您需要获取HMAC密钥并返回访问令牌。 为什么不添加(一些随机数据+时间戳+客户ID /客户名称(或可用于唯一标识用户的东西))并用密钥对其进行签名并将所有数据作为访问令牌返回。
您可以考虑使用新的HMAC密钥并替换旧密钥。
iv)当客户端使用令牌访问任何API端点时,让srvice在内部调用CustomerIDExtractorService,从数据库中获取HMAC密钥并解密访问令牌并将customerID返回给相关的API 。 然后独立进程可以使用客户ID来获取数据。 所以基本上,我要求您将登录/令牌生成/令牌信息提取过程分离为单独的单元。
让我们尝试将这个图表映射到Google如何做到这一点
i)您使用应用并登录Google Oauth。 (让谷歌的黑盒子X处理登录)。
ii)您的应用程序点击令牌交换端点 - >服务在内部检查代码是否有效。 如果是这样,该服务将一些数据+客户ID组合并签名,并将其作为访问令牌返回给应用程序。
iii)该应用程序现在击中(说)谷歌+端点。 在内部,服务将令牌传输到黑盒X,黑盒X解密令牌并将客户ID返回给G +服务。 g +然后将C_ID映射到相关的客户数据。
另一个建议
根据应用程序请求的范围,您可以向访问令牌添加更多信息。 也许创建一个JSON对象,并根据应用程序选择的范围添加/删除字段。 将JSON字符串签名为访问令牌。
实际上,大多数实现都是在OAuth 2.0中使用不通过https的持票人令牌,请查看此演示文稿页面54-56,了解为什么更喜欢持票人,另一方面,Spring实现不支持OAuth 2.0的MAC令牌,但存在一个公开问题,但它仍然是开放的
如果你正在寻找Spring实现演示,你可以检查这个源代码,但是它使用数据库来存储令牌,并且在资源服务器和授权服务器之间必须完成连接,在本演示中使用数据库。
Spring OAuth 2.0的开源实现之一是cloudfoundry的UAA,我参加了一个有关它的会话,他们也告诉我们必须在两台服务器之间进行通信。 链接
链接地址: http://www.djcxy.com/p/48013.html上一篇: How would an efficient OAuth2.0 server / provider work?
下一篇: OAuth2.0 Implicit Grant flow. Why use url hash fragments?