OAuth2 授权(authorization)的开放网络标准


AuthN(验证)/AuthZ(授权)

SSO(Single sign-on) 单一登录是一种认证方案,允许用户使用单个 ID 和密码登录到几个相关但独立的软件系统中的任何一个。 真正的单点登录允许用户登录一次和访问服务,而无需重新输入身份验证因素。

例子: google 第三方应用 - "云冲印"
  • Third-party application:第三方应用程序,本文中又称"客户端"(client),即例子中的"云冲印"。
  • HTTP service:HTTP 服务提供商,本文中简称"服务提供商",即例子中的Google。
  • Resource Owner:资源所有者,本文中又称"用户"(user)。
  • User Agent:用户代理,本文中就是指浏览器。
  • Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。
  • Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

OAuth 在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。"客户端"不能直接登录"服务提供商",只能登录授权层,以此将用户与客户端区分开来。"客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。"客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料。

流程:
  1. 用户打开客户端以后,客户端要求用户给予授权。
  2. 用户同意给予客户端授权(微信中的 code,只能用一次,根据 id,appid 生成)。
  3. 客户端使用上一步获得的授权,向认证服务器申请令牌。
  4. 认证服务器对客户端进行认证以后,确认无误,同意发放令牌(微信中的authtoken)。
  5. 客户端使用令牌,向资源服务器申请获取资源。
  6. 资源服务器确认令牌无误,同意向客户端开放资源。

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0 定义了四种授权方式

  • 授权码模式(authorization code)// 一般使用这种
    1. 用户访问客户端,后者将前者导向认证服务器。
    2. 用户选择是否给予客户端授权。
    3. 假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
    4. 客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
    5. 认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
  • 简化模式(implicit) // 直接在浏览器中向认证服务器申请令牌
  • 密码模式(resource owner password credentials)// 用户向客户端提供用户名和密码
  • 客户端模式(client credentials)// 客户端以自己的名义,向"服务提供商"进行认证