OAuth2 快速入门

作者 | Rekent
来源 | urlify.cn/yqqQNj
1 OAuth简述OAuth 2.0 是一个授权协议 , 它允许软件应用代表(而不是充当)资源拥有者去访问资源拥有者的资源 。 应用向资源拥有者请求授权 , 然后取得令牌(token) , 并用它来访问资源 , 并且资源拥有者不用向应用提供用户名和密码等敏感数据 。
2 OAuth角色OAuth整个授权过程中定义了4种角色:

  • 客户端(Cilent):代表资源拥有者访问受保护资源的软件 , 它使用OAuth 来获取访问权限;
  • 资源拥有者(Resource Owner):是有权将访问权限授权给客户端的主体 , 在大多数情况下 , 资源拥有者是一个人 , 他使用客户端软件访问受他控制的资源;
  • 资源服务器(Resource Server):资源服务器能够通过HTTP 服务器进行访问 , 在访问时需要OAuth 访问令牌 。 受保护资源需要验证收到的令牌 , 并决定是否响应以及如何响应请求;
  • 授权服务器(Authorization Server):一个HTTP 服务器 , 它在OAuth 系统中充当中央组件 。 授权服务器对资源拥有者和客户端进行身份认证 , 让资源拥有者向客户端授权、为客户端颁发令牌 。 某些授权服务器还会提供额外的功能 , 例如令牌内省、记忆授权决策;
假设你使用了一个照片云存储服务和一个云打印服务 , 并且想使用云打印服务来打印存放在云存储服务上的照片 。 很幸运 , 这两个服务能够使用API 来通信 。 这很好 , 但两个服务由不同的公司提供 , 这意味着你在云存储服务上的账户和在云打印服务上的账户没有关联 。 使用OAuth 可以解决这个问题:授权云打印服务访问照片 , 但并不需要将存储服务上的账户密码交给它 。 在这上面这一段中:客户端 :云打印服务资源拥有者:你资源服务器 , 授权服务器:照片云存储服务
3 OAuth授权许可类型3.1 授权码许可类型(Grant Type: Authorization Code)资源拥有者通过在授权服务器完成登录 , 获取授权码的形式 , 客户端通过Ajax请求最终兑换令牌 , 该种形式使得令牌对外是不可见的 , 一定程度上保证了令牌的安全 , 通常用于Web端的OAuth2.0 开发 。 具体流程步骤为:(1)资源拥有者在授权服务器完成登录 , 并完成授权 , 资源服务器重定向至客户端 , 并附带一个临时授权码 , 该授权码是短时效性的;(2)客户端获取到临时授权码后 , 通过临时授权码以及其他应用信息 , 向资源服务器接口请求 , 以此来换取令牌(后端接口请求) 。
OAuth2 快速入门文章插图
3.2 隐式许可类型(Grant Type:Implicit)有些 Web 应用是纯前端应用 , 没有后端 。 此时就没有使用授权码形式的必要了 , 而是直接返回令牌 , 省略了授权码再去兑换令牌的步骤(该步骤本是在后端进行 , 目的是对前端隐藏令牌内容) 。 隐式许可流程不可用于获取刷新令牌 。 因为浏览器内的应用具有短暂运行的特点 , 只会在被加载到浏览器的期间保持会话 。
// 请求 , response_type 参数的值为token , 其为一个授权页面 , 用户需要在上面完成授权 , 授权完成后 , 会重定向至redirect_uriHTTP/1.1 302 Moved TemporarilyLocation: http://localhost:9001/authorize?response_type=token charset=utf-8Content-Length: 444Date: Fri, 31 Jul 2015 20:50:19 GMT // 返回 , 直接返回accss_token , 注意此处为 #access_tokenGET /callback#access_token=987tghjkiu6trfghjuytrghj Intel Mac OS X 10.10; rv:39.0)Gecko/20100101 Firefox/39.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Referer: http://localhost:9001/authorize?response_type=code --tt-darkmode-color: #FFFFFF;">3.3 客户端凭证许可类型(Grant Type:Client Credential)后端系统之间需要直接通信 , 且本身并不代表某个特定用户 , 没有用户对客户端授权 。 客户端直接向授权服务器进行身份认证 , 而授权服务器给客户端颁发访问令牌 。 需要提供客户端id以及key(在对接前 , 手动申请)其大致的请求如下:
POST /tokenHost: localhost:9001Accept: application/jsonContent-type: application/x-www-form-encodedgrant_type=client_credentials --tt-darkmode-color: #FFFFFF;">3.4 断言许可类型在断言许可类型下 , 客户端会得到一条结构化的且被加密保护的信息 , 叫作断言 , 使用断言向授权服务器换取令牌 。 这种许可类型只使用后端信道 , 与客户端凭据许可类型很相似 , 没有明确的资源拥有者参与 。 与客户端凭据流程不同的是 , 由此颁发的令牌所关联的权限取决于所出示的断言 , 而不仅仅取决于客户端本身 。 由于断言一般来自于客户端之外的第三方 , 因此客户端可以不知道断言本身的含义 。 目前标准的断言格式: