一尘不染

基于散列片段的安全性到底如何工作?

java

我正在学习OAuth 2.0,无法获得 隐式授权流程
中保护访问令牌的方法。规范中有一些论点,有些被推崇的SO答案看起来彼此矛盾。有人可以解决吗?SO答案和规范引述让我感到困惑:

  1. (来自规范)用于将访问令牌传递给客户端的重定向URI。访问令牌可以向资源所有者或其他具有资源所有者的用户代理访问权限的应用程序公开。
  2. (根据规范)访问令牌凭据(以及任何机密的访问令牌属性)必须在传输和存储过程中保持机密,并且仅在授权服务器,访问令牌对其有效的资源服务器以及客户端所共享发出访问令牌。访问令牌凭证只能使用TLS传输。
  3. (从已接受并获得投票的SO回答)在隐式流中,访问令牌作为哈希片段传递,只有浏览器才知道哈希片段。浏览器会将哈希片段直接传递到目标网页/作为客户端网页的重定向URI(哈希片段不是HTTP请求的一部分),因此您必须使用Javascript读取哈希片段。哈希片段不能被中间服务器/路由器拦截(这很重要)。

我的问题:

P1说通过重定向URI传递给客户端的令牌,P2说传递通道必须是TLS版本的。但是P3表示 哈希片段没有发送到网络
。如果访问令牌由于其哈希片段而未发送,则如何到达客户端?无论如何,它必须通过网络发送,不是吗?还是发送带有重定向URI的令牌会使网络交易变得有些神奇?

唯一可能的解释-
在后台浏览器仅通过网络发送url的非哈希部分,并且在加载新页面后,只需插入哈希片段并将其提供给JS。如果我是对的,我仍然不明白为什么我们不简单地使用
可靠,安全的HTTPS通道 作为响应参数来发送令牌?


阅读 191

收藏
2020-12-03

共1个答案

一尘不染

OAuth Provider通过HTTP响应重定向将访问令牌发送回OAuth使用者:

HTTP/1.1 302 Found
Location: https://consumer.org/redirect_uri#access_token=1111-2222-3333-4444

请注意,作为来自OAuth Provider的HTTP响应的一部分,访问令牌是如何通过网络发送的,除使用方外,ALSO还应位于HTTPS上。

然后,您的浏览器将对使用者端点执行一个新的HTTP GET请求:

GET /redirect_uri HTTP/1.1
Host: consumer.org

注意如何不通过网络将访问令牌发送给使用者。位于的服务器consumer.org将不会在此HTTP请求中接收令牌。相反,从返回的网页https://consumer.org/redirect_uri将包含能够并且将从url片段读取访问令牌的javascript。

因此,您需要信任从Consumer.org(通过使用HTTPS)接收到的javascript代码,因为如果攻击者可以注入代码,它也可以间接获取访问令牌(并将其发送到任何地方)。

使用者的HTTP响应示例:

200 OK
Content-Type: text/html

<html><head><script> 
    alert(window.location.hash) 
</script>
</head><body></body></html>
2020-12-03