OAuth简单来说就是一种授权标准,目前版本为2.0,但是不向后兼容。

简述

直观例子

举个例子,我们现在需要优化登录流程,支持qq用户授权登录。为了实现这个功能,一般有这么几步:

  1. 登录页面提示用户可以使用第三方qq登录

  2. 点击qq登录,跳转到qq登录页面输入用户名密码,用户点击授权

  3. 跳转回到我们自己的网站,后端创建新用户,并同步用户qq信息(头像、用户名等)

  4. 用户使用这个新用户进行登录,并返回登录已成功,用户继续浏览页面

而这里面涉及到的授权协议,就可以使用OAuth2.0来实现。

重要名词

用我们的例子来说明:

  • 第三方应用(Third-party application):又称客户端,我们的应用

  • 服务提供商(HTTP service):qq

  • 资源拥有者(Resource Owner):用户

  • 用户代理(User Agent):浏览器

  • 认证服务器(Authorization server):qq提供专门用于认证的服务器

  • 资源服务器(Resource server):qq存放用户信息的服务器

OAuth2.0规定在第三方应用和服务提供商之间,需要有一个授权层。第三方应用只能登录授权层,获取令牌(token),令牌有权限和有效期。服务提供商根据令牌的权限和有效期,向第三方应该提供相应的资源。

OAuth2.0定义了四种授权方式:授权码模式、简化模式、密码模式以及客户端模式。我们主要介绍授权码模式,因为这是功能最完整、流程最严密的授权模式,使用也最广泛。

认证流程

以我们的例子来说明OAuth2.0授权码模式的流程:

oauth2

主要分为以下几步:

  1. 用户访问客户端,客户端将用户导向认证服务器,并附上一个重定向客户端uri

  2. 用户在认证服务器中允许授权该客户端,认证服务器将用户导向重定向客户端uri,并附上授权码(code)

  3. 客户端收到授权码,并附上早先的重定向uri,在服务端向认证服务器申请令牌(token)

  4. 认证服务器核对重定向uri以及授权码,向客户端发放令牌

  5. 客户端使用令牌请求相应的资源

这几步中,可能还需要一些额外的参数,比如客户端id、客户端状态、权限范围等,这些跟具体的实现有关,就不再详细说明了。