OAuth 2.0“状态”和OpenID“nonce”参数之间的区别?为什么国家不能重复使用?

时间:2017-10-20 07:30:37

标签: oauth oauth-2.0 openid-connect

OAuth 2.0定义了客户端请求发送的“state”参数,以防止跨站点请求攻击。在OpenID规范中提到“nonce”也是如此。除了在ID令牌而不是查询参数中返回“nonce”这一事实之外,它们看起来服务于完全相同的目的。如果有人可以解释为什么他们是分开的

4 个答案:

答案 0 :(得分:38)

状态和随机数似乎相似。但如果你深入挖掘,你会发现它们有不同的用途。

状态用于保护最终用户免受跨站点请求伪造(CSRF)攻击。它是从OAuth 2.0协议RFC6749引入的。协议规定,

  

一旦获得最终用户的授权,即可      授权服务器将最终用户的用户代理重定向回      具有“状态”中包含的所需绑定值的客户端      参数。绑定值使客户端能够验证      通过匹配绑定值来确定请求的有效性      用户代理的身份验证状态

这用于授权请求。它使客户端能够验证授权响应是否未被原始服务器更改并由auth发送。请求已发送。简而言之,它允许客户端交叉检查授权请求和响应。

Nonce 有不同的用途。它将令牌与客户绑定在一起。它用作令牌验证参数,并从OpenID Connect specification引入。

  

nonce - 用于将客户端会话与ID令牌相关联并减轻重放攻击的字符串值。该值通过未经修改从身份验证请求传递到ID令牌。如果存在于ID令牌中,客户端必须验证nonce Claim Value是否等于Authentication Request中发送的nonce参数的值。如果存在于认证请求中,则授权服务器必须在ID令牌中包含一个nonce Claim,其中Claim Value是在Authentication Request中发送的nonce值。授权服务器不应该对使用的nonce值执行任何其他处理。 nonce值是区分大小写的字符串

如您所见,nonce值来自授权请求,它由客户端生成。如果包含nonce,它将出现在令牌中。因此,客户端可以根据初始授权请求验证收到的令牌,从而确保令牌的有效性。

此外,根据流类型, nonce 可以是必需参数。隐式流和混合流要求 nonce 值。客户端应用程序的两个值都是生成验证

为什么州无法重复使用?

如果捕获了授权请求,则恶意方可以伪造授权响应。这可以通过改变状态参数来避免。

答案 1 :(得分:2)

我要说明他们的RFC。该解释非常简单和不言自明。

状态

     An opaque value used by the client to maintain
     state between the request and callback.  The authorization
     server includes this value when redirecting the user-agent back
     to the client.  The parameter SHOULD be used for preventing
     cross-site request forgery

Nonce

     The nonce parameter value needs to include per-session state and be unguessable 
     to attackers. One method to achieve this for Web Server Clients is to store a 
     cryptographically random value as an HttpOnly session cookie and use a 
     cryptographic hash of the value as the nonce parameter. In that case, the nonce 
     in the returned ID Token is compared to the hash of the session cookie to detect 
     ID Token replay by third parties. A related method applicable to JavaScript 
     Clients is to store the cryptographically random value in HTML5 local storage 
     and use a cryptographic hash of this value.

希望这能回答您的问题。

答案 2 :(得分:1)

Nonce向浏览器回答这个问题:这个ID令牌是对我最初请求的响应吗?

说明后端服务器的答案:同意真的来自我认为是谁吗?

因此,他们回答类似的问题,但针对不同的实体。

答案 3 :(得分:0)

如果要实现自己的三足式OAuth2工作流程(客户端,中间件和联合身份提供商,例如:statenonce),请在上述回答中重点关注statenonce的安全性例如Facebook),您的中间件有时可能需要一些上下文。例如,当来自FIP的响应在返回客户之前先回到中间件时,您可能需要更多地了解原始请求的详细信息(即,对FIP的原始请求)。由于您的中间件很可能是无状态的,因此如果没有任何帮助,它将无法回答该问题。这就是OAuth2 firebase_analytics: ^6.0.0变量的来源。您可以存储任何表示要在所有OAuth2跳转之间传递的状态的字符串,以便中间件(以及您的客户端)可以使用更多上下文。对于您的客户端,出于安全原因使用此密码。出于纯粹的安全原因,Podfile被用作OIDC规范的一部分。