没有客户端密钥的OAuth2 - 可能的网络钓鱼?

时间:2017-06-16 18:01:17

标签: javascript security oauth single-page-application

我一遍又一遍地阅读OAuth2规范,但我无法弄清楚一件事。没有Client Secret(现在推荐用于单页应用程序)的授权代码流程是否高度不安全,因为它可以轻松用于网络钓鱼?让我解释一下:

  1. 客户端将资源所有者重定向到授权服务器,并传递重定向URL和客户端ID。
  2. 资源所有者批准该请求,并且授权服务器将他重定向到给定的重定向URL并传递授权码。
  3. 现在,实际上,请求授权的客户端是一个网络钓鱼站点,但遗憾的是,用户无法识别。传递给授权服务器的重定向URL指向恶意客户端,而不是合法客户端。客户端ID是公共信息,因此设置此类网站相当容易。

    如果需要客户端密钥会怎样?

    1. 恶意客户端将收到授权码,但它不知道合法的客户端密钥。
    2. 资源服务器将拒绝发送访问令牌,因为未提供有效的客户端密钥。用户信息是安全的。
    3. 但是,如果资源服务器不需要客户端密钥怎么办?

      1. 恶意客户端将收到授权码,即使它不知道客户端密钥,它也会请求访问令牌。
      2. 资源服务器将接受请求,因为提供了有效的授权码和客户端ID,并且不需要客户端密钥。恶意客户端获取访问令牌,用户信息被泄露。
      3. 我是否遗漏了某些内容或者这是否正确无法使用单个页面应用的OAuth2更安全?

1 个答案:

答案 0 :(得分:1)

资源服务器不需要client_secret,因为只有有效的客户才能获得兑换授权代码。

客户端不仅必须针对client_id进行验证,还必须针对注册到客户端的redirect_uri进行验证。注册OAuth客户端时,您应该要求允许使用client_id允许的redirect_uri列表。

因此,如果恶意客户端发出请求,则验证将失败,因为只有在redirect_uri被允许的情况下才必须重定向。

这在OAuth 2.0 RFC第3.1.2.2节https://tools.ietf.org/html/rfc6749#section-3.1.2.2

中有详细说明