OAuth2.0

OAuth2.0

OAuth 2.0是一种授权协议,旨在解决第三方软件访问用户数据的安全问题。通过授权机制,第三方软件只有在获得授权后才能访问用户数据,而不是直接使用用户的用户名和密码。该协议通过颁发访问令牌的方式来保护对外的Web API,成为目前Web上重要的安全手段之一。

其实 OAUTH 2.0 离我们程序员很近,像 Spring Security 中其实就内置了对 OAUTH 2.0 的支持。在生活当中,比如我们在使用 stackoverflow 这种网站的时候,可以采用谷歌账号来一键完成注册和登录操作,这种便捷性其实就是源于 OAUTH 2.0。

为什么需要 OAuth 2.0

在很多网站,我们都需要进行一些需要权限的操作,比如说发表评论、展示所有内容等。但我们又不想进行麻烦的注册和登录操作,毕竟我们只是想快速浏览一下后退出,总不能看内容一分钟,注册十分钟吧。这时候我们就需要一种授权机制,用一个已经登录的账号(可以是其他平台)来给这些需要权限的操作授权。

OAuth 2.0 就是一种授权协议,它允许第三方应用访问用户在某一网站上存储的私密信息,而不需要将用户名和密码提供给第三方应用。OAuth 2.0 定义了四种角色:

  • Resource Owner(资源所有者):拥有资源的最终用户。
  • Client(客户端):请求资源的应用。
  • Authorization Server(授权服务器):认证资源所有者并向客户端提供访问令牌。
  • Access Token(访问令牌):授权服务器颁发给客户端的临时令牌,用于访问受保护资源。

授权流程

  1. 在需要权限的网站中,登录操作的下方增加一个用其他平台账号登录的按钮。
  2. 点击按钮,跳转到授权服务器的登录页面,已登录的其他平台账号显示有人尝试进行授权操作,是否同一授权。
  3. 点击同意授权,授权服务器生成访问令牌(有过期时间),并将访问令牌返回给客户端。
  4. 客户端将访问令牌发送给资源服务器,请求访问受保护资源。
  5. 资源服务器验证访问令牌,如果有效,则返回受保护资源。

为什么要有访问令牌?我们让资源服务器返回给他资源不就行了?这里是因为 HTTP 是无状态的,一次访问后下一次访问都需要重新验证身份,这样下一次就还需要再次授权,这显然不合理。而获取了访问令牌后,资源服务器可以记住这个令牌,下次访问时直接使用这个令牌就能访问受保护资源,省去了授权过程。

应用登记

接下来我们来聊聊如何自己实现一个 OAuth 2.0。那么我们此时要扮演的角色就变成了资源所有者,以授权服务器为工具,向客户端颁发访问令牌以访问受限资源。

假设我们用 A 平台作为授权服务器。对我们资源所有者来说,我们需要定义它的入口 URL,即用户进行授权操作进入 A 平台授权页的入口;此外还需要一个重定向的跳转 URL,即 A 平台授权成功后,用户将会被重定向到我们网站的某个页面。除此之外,对于 A 平台返回的访问令牌,我们还需要一个识别并验证的机制,不能进入重定向页面就直接能访问受保护资源。

  1. 客户端向我们请求资源,并选择使用 OAuth 2.0 用 A 平台来授权登录。(注意暴露的这个 A 平台既是客户端已登录的平台,也是我们资源所有者所认可且匹配的平台)
  2. 客户端会被跳转到 A 网站,并被要求用户登录,然后询问是否同一我们的网站要求获得权限。
  3. 客户端点击同意,A 平台发放访问令牌,并重定向到我们的网站。
  4. 我们网站接收到访问令牌,并验证它是否有效。