OAuth 2.0之间的差异;“国家”;和OpenID“;“暂时的”;参数为什么状态不能被重用?

OAuth 2.0之间的差异;“国家”;和OpenID“;“暂时的”;参数为什么状态不能被重用?,oauth,oauth-2.0,openid-connect,Oauth,Oauth 2.0,Openid Connect,OAuth 2.0定义了客户端在请求中发送的“state”参数,以防止跨站点请求攻击。OpenID规范中也提到了“nonce”。除了在ID令牌中而不是在查询参数中返回“nonce”这一事实之外,它们似乎具有完全相同的用途。如果有人能解释为什么它们是分开的,状态和非状态似乎是相似的。但如果你深入挖掘,你会发现它们有不同的用途 状态用于保护最终用户免受跨站点请求伪造(CSRF)攻击。它是从OAuth2.0协议引入的。议定书规定 从最终用户处获得授权后 授权服务器将最终用户的用户代理重定向回 具有所需

OAuth 2.0定义了客户端在请求中发送的“state”参数,以防止跨站点请求攻击。OpenID规范中也提到了“nonce”。除了在ID令牌中而不是在查询参数中返回“nonce”这一事实之外,它们似乎具有完全相同的用途。如果有人能解释为什么它们是分开的,状态和非状态似乎是相似的。但如果你深入挖掘,你会发现它们有不同的用途

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

从最终用户处获得授权后 授权服务器将最终用户的用户代理重定向回 具有所需绑定值的客户端,该值包含在“状态” 参数绑定值使客户端能够验证 通过将绑定值与 用户代理的身份验证状态

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

(详细说明:要接受授权代码响应,客户端需要接受来自授权服务器的响应(例如:-在web应用程序中,这可以通过重定向和向后端发送表单来完成)。这意味着,我们的客户端应用程序有一个端点是开放的并接受请求。状态参数通过将原始授权请求绑定到响应来保护此端点。这是CSRF保护。)

Nonce有不同的用途。它将令牌与客户端绑定。它用作令牌验证参数,并从中引入

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

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

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

为什么无法重用状态?


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

我正在从他们的RFC中说明一个解释。解释很简单

陈述

客户端用于维护请求和回调之间的状态的不透明值。授权服务器在将用户代理重定向回客户端时包含此值。该参数应用于防止 跨站点请求伪造

暂时

nonce参数值需要包含每个会话状态,并且攻击者无法使用该值。为Web服务器客户端实现这一点的一种方法是将加密随机值存储为HttpOnly会话cookie,并使用该值的加密哈希作为nonce参数。在这种情况下,将返回的ID令牌中的nonce与会话cookie的哈希进行比较,以检测第三方的ID令牌重播。一种适用于JavaScript客户端的相关方法是将加密随机值存储在HTML5本地存储器中,并使用该值的加密哈希

参考链接:国家:

暂时:


希望这能回答您的问题。

立即向浏览器回答问题:此ID标记是对我最初请求的响应吗

对后端服务器的状态回答:同意真的来自我认为是谁吗


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

除了上面的答案,这些答案主要关注
state
nonce
的安全性方面,如果您要实现自己的三条腿OAuth2工作流(客户端、中间件和联合身份提供者,如Facebook),您的中间件有时可能需要一些上下文。例如,当来自FIP的响应在返回到客户端之前返回到您的中间件时,您可能需要更多地了解原始请求(即,对FIP的原始请求)的详细信息。因为您的中间件很可能是无状态的,所以如果没有任何帮助,它将无法回答这个问题。这就是OAuth2
state
变量的作用。您可以存储表示要在所有OAuth2跳转之间传递的状态的任何字符串,以便中间件(以及客户端)可以使用更多上下文。对于您的客户机,这是出于安全考虑。出于纯粹的安全原因,
nonce
被用作OIDC规范的一部分。

如果我们将ID令牌中的状态本身作为nonce传递,并且在其外部传递,那么会有什么负面影响。使用外部的一个来防止CSRF,使用内部的一个来绑定客户端上的会话。@dvsakgec从协议角度看