根据我的理解,为了Site-A从Site-B访问用户的信息,OAuth 2中发生了以下一系列事件。
Site-A registers on Site-B, and obtains a Secret and an ID.
When User tells Site-A to access Site-B, User is sent to Site-B where they tell Site-B that they would indeed like to give Site-A permissions to specific information.
Site-B redirects User back to Site-A, along with an Authorization Code.
Site-A then passes that Authorization Code along with its Secret back to Site-B in return for a Security Token.
Site-A then makes requests to Site-B on behalf of User by bundling the Security Token along with requests.
在高水平上,所有这些在安全和加密方面是如何工作的?OAuth 2如何使用安全令牌防止重放攻击?
OAuth是一种协议,第三方应用程序可以在不需要您的帐户和密码的情况下访问存储在另一个网站上的数据。有关更正式的定义,请参考Wiki或规范。
下面是一个用例演示:
我登录领英,想联系我Gmail联系人中的一些朋友。LinkedIn支持这一点。它将从gmail请求一个安全资源(我的gmail联系人列表)。我点击这个按钮:
弹出一个网页,它显示Gmail登录页面,当我输入我的帐户和密码:
Gmail然后显示一个同意页面,我点击“接受”:
现在LinkedIn可以访问我在Gmail的联系人:
下面是上面例子的流程图:
步骤1:LinkedIn从Gmail的授权服务器请求一个令牌。
步骤2:Gmail授权服务器对资源所有者进行身份验证,并向用户显示同意页面。(如果用户尚未登录,则需要登录Gmail)
步骤3:用户授予LinkedIn访问Gmail数据的请求。
步骤4:Gmail授权服务器返回一个访问令牌。
步骤5:LinkedIn使用这个访问令牌调用Gmail API。
步骤6:如果访问令牌有效,Gmail资源服务器将返回您的联系人。(令牌将由Gmail资源服务器验证)
你可以在这里获得更多关于OAuth的细节。
另一个答案非常详细,解决了OP提出的大部分问题。
为了详细说明,特别是解决OP的问题“OAuth 2如何防止使用安全令牌的重放攻击?”,在实现OAuth 2的官方建议中有两个额外的保护措施:
令牌通常有一个很短的有效期(https://www.rfc-editor.org/rfc/rfc6819#section-5.1.5.3):
令牌的短到期时间是一种保护手段
以下威胁:
重播…
站点A使用令牌时,建议它不作为URL参数,而是在授权请求报头字段(https://www.rfc-editor.org/rfc/rfc6750):)中显示
客户端应该使用承载令牌进行身份验证请求
“授权”请求头字段与“承载”HTTP
授权方案。
...
不应该使用"application/x-www-form-urlencoded"方法
除非在应用程序上下文中,其中参与的浏览器不这样做
可以访问“授权”请求头字段。
...
URI查询参数…用于记录当前使用情况;它的用途不是
推荐,由于其安全性不足