oAuth 2.0

参考:oAuth

4 个角色

  1. resource owner
    • 可以授权访问被保护资源的实体,如果是人的话,即是最终用户
  2. resource server
    • 存储被保护资源的服务器,使用 access token 可以访问受保护的资源
  3. client
    • 经由 resource owner 授权,访问受保护资源的应用程序
  4. authorization server
    • 认证 resource owner 并获取其授权后发放 access token 的服务器

协议流程

比较抽象的流程图

说明

  1. client 向 resource owner 请求授权。client 可以直接向 resource owner 申请授权(如图),但更好的做法是经由 authorization server 中转授权请求。若 resource owner 同意授权,可以有 4 种授权类型(grant type),具体使用哪一种授权类型,要看客户端请求方式和服务器是否支持
    • anthorization code 授权码
    • implicit
    • resource owner password credentials 密码凭证
    • client credentials 客户端凭证
  2. client 获得 授权后,即可到 authorization server 请求 access token;authorization server 要验证客户端合法性和 resource owner 授权有效性,如果验证通过,发放 access token
    • client 需要事先在 authorization server 上注册,获得 app key 和 app secret
  3. client 凭 access token 即可访问受保护的资源,resource onwer 验证 access token 有效性,如果有效,则提供服务

授权

这里只介绍授权码类型,这是最主流的 oAuth 授权类型

授权码类型

授权码类型的流程依赖于重定向,所以 client 必须具备如下能力

  1. 和 resource owner 的 user-agent(通常是 web 浏览器) 交互:这是说,user-agent 访问的初始 url 肯定是 client 提供的;此外,client 的回调地址不是由 authorization server 来回调的,实际上是 user-agent 在回调
  2. 接收从 authorization server 重定向过来的请求:这表示,client 肯定要有一个 web 后台,能接收并处理 url

看一下流程

说明

  1. client 生成授权的 url,并由 user-agent 打开:即在浏览器打开一个授权的 url
  2. 该授权 url 实际是 authorization server 上的一个接口,authorization server 会做如下工作
    • 验证 client 的有效性,即 client 提交的 app_key 是否注册过
    • 如果已经注册过,用户是否登录
      • 如果用户未登录,那么给浏览器一个重定向,浏览器会进入登录页
    • 如果用户已登录,那么用户是否已经授权给该 client 所需的权限
      • 如果用户未授权,那么给浏览器一个重定向,浏览器会进入授权页面
  3. 如果用户同意授权(或已授权过),authorization server 向浏览器发送一个 302 重定向,这会导致浏览器回调 client 的后台地址,使 client 拿到 authorization code(授权码)
  4. client 后台拿到授权码以后,再到 authorization server 获取 access token

思考

为什么不在步骤 3 里直接返回 access token,而是返回一个 code,再用 code 去换 access token 捏?这是不是有点多此一举?

答案是为了 token 的安全,url 回调是 authorization server 给 浏览器一个 302 重定向实现的,这个 code 甚至可以在浏览器的地址栏里看到,如果用这种方式返回 token,那 token 就不太安全了

client 的后台拿到 code 以后换取 token 是直接和 authorization server 通信的,不借助用户的浏览器,token 就不会暴露啦

攻击者拿到 code 能否换取 token 呢?答案是有难度,换取 token 必须要有 client 的 app key 和 app secret,想必 client 会好好爱护他们滴

results matching ""

    No results matching ""