2017-06-16 139 views
0

我一直在阅读OAuth2规范,但我无法弄清楚一件事。没有客户端密码(现在推荐用于单页应用程序)的授权码不是非常不安全的,因为它可以轻松用于网络钓鱼?让我解释一下:OAuth2没有客户端密钥 - 可能的网络钓鱼?

  1. 客户端重定向资源所有者到授权服务器,传递重定向URL和客户端ID。
  2. 资源所有者批准请求,授权服务器将他重定向到给定的重定向URL并传递授权码。

现在,实际上,请求授权的客户端是一个钓鱼网站,用户不幸意识到这一点。传递给授权服务器的重定向URL指向恶意客户端,而不是合法的客户端。客户ID是公开信息,因此建立这样的网站相当容易。

如果需要客户端密钥,会发生什么情况?

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

但是如果资源服务器不需要客户端密钥呢?

  1. 恶意客户端会收到授权码,即使它不知道客户端密码,它也会请求访问令牌。
  2. 资源服务器将接受请求,因为提供了有效的授权码和客户端ID,并且不需要客户端密钥。恶意客户端获取访问令牌并且用户信息受到威胁。

我是否错过了一些东西,或者这是正确的,并且没有什么可以使OAuth2与单页面应用程序更安全吗?

回答

0

资源服务器不需要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