OAuth2:查询字符串与片段

Pio*_*otr 15 fragment query-string oauth-2.0

刚刚注意到在OAuth2中,当请求的授权类型为:"code"时,回调在查询字符串参数中包含它(在'?'之后).但是,当授权是"令牌"时,它将作为片段传递(在'#'之后).

这看起来是规范的一部分(http://tools.ietf.org/html/draft-ietf-oauth-v2-26#section-4.2)

这样的决定背后可能有什么理由?

谢谢,彼得

Jan*_*ger 15

当您的浏览器被网站重定向到带有查询参数的URL时,查询字符串也是您的浏览器现在发送给主机的请求的一部分.片段仅由您的Web浏览器在本地进行评估,而不包含在对主机的请求中.

如果授权代码授权通常有一个Web应用程序,它直接与提供者通信,则将数据发送到主机正是您所需要的:

  • Web应用程序将浏览器重定向到您登录的提供程序.
  • 提供程序现在告诉浏览器Web应用程序的回调URL并附加授权代码.此代码必须发送到Web应用程序,因此它作为查询参数包含在对回调URL的请求中.
  • Web应用程序现在自己在后台与提供程序进行通信,并使用授权代码验证他确实可以向提供程序查询访问令牌.

如果是Implicit Grant,您通常会在浏览器中直接运行一些Javascript应用程序.没有必要将任何授权代码传递给主机,并且在大多数情况下也不需要将访问令牌发送到主机,因为浏览器中的JS可以直接与提供者通信.这样,您可以在服务器上创建一个网站,该网站使用从另一个提供商查询的信息,并获得用户的同意,其中服务器永远不会访问用户的任何机密数据.(如果是受信任的网站,则不会将访问令牌发送到服务器.)

  • 这是一个很好的解释。我目前遇到的一个问题是,并非所有用户代理(Safari 就是其中之一)都会可靠地传递片段作为重定向的一部分。奇怪的是,该片段在 http 上存在,但在 https 上丢失。因此,我已经采用了使用查询字符串的路线,这当然由于您提到的原因不太理想。 (2认同)