我可能需要实现我创造一个API的OAuth2.0的服务器。 这个API将允许第三方来执行代表用户的操作。
OAuth2.0的有3次主通话。 首先,有一个呼叫提示同意用户。 这将返回一个code
。 第二种情况是该code
为交换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的流量工程的OAuth2.0的服务器背后的密码。
我没有一个确切的答案,但让我们尝试把拼在一起 -
我),我也不太清楚,如果你需要保存在数据库中的授权码长。 这是Facebook的说的话 -
对于OAuth授权代码,我们将只允许访问令牌交换一次授权码,并要求他们为一个访问令牌10分钟他们的创作中来交换新的安全限制。 这是在使用OAuth 2.0规格线,从一开始就指出,“授权码必须是短暂的,单次使用”。 欲了解更多信息,请查看我们的认证文件。
看到此链接, https://developers.facebook.com/roadmap/completed-changes/ (12月5日的变化)。
II)什么做你在做什么,直到第1步,保持数据库的授权码和HMAC密钥。 让我们10分钟(或任何你觉得是必要的)授权代码,然后删除授权码。
三)假设你有一个验证客户端凭据的单一登录服务。 当客户端应用程序打令牌交换终结(AUTH代码访问令牌),你需要获取HMAC键和返回访问令牌。 为什么不加(一些随机数据+时间戳+的customerID /客户名称(或一些可以用来唯一标识用户)),并与密钥进行签名,并返回所有这些数据的访问令牌。
你可以想想也许使用一个新的HMAC密钥和新人换旧人。
四)当客户端的匹配使用令牌的API端点,让srvice内部调用获取从DB HMAC密钥和解密的访问令牌,并返回在客户的相关API一个CustomerIDExtractorService。 然后,独立的进程可以使用客户ID来获取数据。 所以基本上,我请你登录/令牌生成/令牌信息提取过程中分离到一个单独的单元。
让我们尝试此地图谷歌怎么可以做这样的事情
i)您使用的应用程序,并登录到谷歌的Oauth。 (让谷歌从一个黑盒子X处理登录)。
ii)以应用匹配令牌交换终结 - >服务内部检查代码是否有效。 如果是,该服务结合了一些数据+ CustomerID和体征,并将其返回给应用程序作为访问令牌。
三)应用程序现在打(说)的谷歌+终点。 在内部,所述服务传送该令牌黑匣子X,其解密该令牌并返回客户ID以G +服务。 G +则映射C_ID相关客户数据。
另一项建议
根据该应用程序所要求的范围,你可以添加到访问令牌的更多信息。 也许创建JSON对象和添加/根据由该应用选择的范围中删除的字段。 签署JSON字符串作为访问令牌。
看来你的描述开始时确定,但我必须承认,我只能跟随部分你的方法。 据我所知的OAuth2在很大程度上依赖于HTTPS而不是签署的请求,但我想你可以自由地使用这些。
我不知道你提出撤销接入的概念。 通常,这将依靠只是在访问令牌(它应该在某个时间点到期,你可以取消它,它可以续签)。 如果API请求你拉键输入用户名字,然后可能是你的代码是太紧密联系在一起的“用户”的概念,而不是OAuth用户端(与作用,范围,资源)
在任何情况下,它不是一个简单的标准,我想讨论可以去很长,即使在那时我不知道所有可能被覆盖。 我相信我们已经回顾在RFC:
http://tools.ietf.org/html/rfc6749
我也看到您的个人资料,你很可能一个Java开发人员。 在这种情况下,它可能是一个好主意,检查弹簧安全的oauth2在:
https://github.com/SpringSource/spring-security-oauth
如果您的解决方案将不使用Java很多你暗示你提问中的问题进行了接触,并通过这样的项目来解决,所以它应该给你很多的想法。 如果你用的是Java那么它可以帮助你很多。
希望能帮助到你!
其实大多数实现都使用OAuth 2.0用户承载令牌通过https不支持Mac,检查该演示文稿页面54-56为什么喜欢承载,在另一方面弹簧实现不支持MAC令牌的OAuth 2.0,并有一个关于它的开放问题,但它仍然是开放的
时间感,如果你正在寻找春天的实现演示中,你可以检查此源代码 ,但它是使用数据库来存储标记,并有使用数据库是连接已经到资源服务器和授权服务器之间进行,在这个演示。
开源实现春天的OAuth 2.0中的一项是cloudfoundry的UAA我参加一下一个会议还他们告诉,有通信,必须在两个服务器之间进行。 链接