OAuth2 协议

OAuth2 认证流程

OAuth2 协议

概念

OAuth2授权 协议。

  1. 参与者:

    • Resource Owner(资源所有者)
    • Resource Server(资源服务器)
    • Third-party application(第三方)
    • Authorization Server(授权服务器)
    • User Agent(用户代理,如用户浏览器)
  2. 案例-谷歌云冲印:

    • 谷歌用户小明——资源所有者
    • 谷歌云盘——资源服务器
    • 谷歌云冲印——第三方服务
    • 谷歌授权服务
    • 浏览器

模式

授权码模式简化模式密码模式客户端模式

  1. 授权码模式

    1. 小明访问谷歌云冲印网站,申请打印照片,云冲印将用户导向与谷歌约定的授权页面。
    2. 小明选择同意,登录谷歌账号并授权
    3. 同意之后,申请授权码:

      • 确定校验类型,此处 response_type = “code”
      • 验证谷歌云冲印是否在谷歌云平台注册,通过 client_id
      • 授权,根据谷歌用户信息及 scope 生成授权码 code
      • 根据指定的 redirect_uri 跳转到云冲印网站,同时带回参数( code , state

        注意 state 参数应从步骤1,由谷歌云冲印提供随机数,并在步骤2跳转回来的时候,原值带回。可有效防止CSRF(跨站请求伪造)

    4. 云冲印网站向认证服务器请求令牌 access token
      • 校验 state ,防止 CSRF
      • 附上 coderedirect_uriclient_idclient_secretgrant_type = “authorization_code”,
      • 认证服务器通过client_idclient_secret 认证云冲印应用
      • 认证服务器通过 coderedirect_uri 校验 code
      • 认证服务器根据 codegrant_type 生成 access tokentoken_typeexpires_inrefresh_token
    5. 云冲印应用根据令牌向谷歌云盘(资源服务器)请求资源

      问题思考:

      1. 为什么state 参数可以有效防止CSRF(跨站请求伪造)?
        没有state的情况,提供response_typeclient_idscoperedirect_uri,通过CSRF可以取得有效的 code。有随机 state 的话,获取到 code,可以通过 state 校验是否有效。
      2. 省略获取授权码,直接返回令牌,有什么影响?
        令牌可以直接访问资源,直接暴露出来安全程度大大下降,加上授权码的获取,由客户端应用服务器申请令牌,再请求资源,可以大幅提升安全性。
  2. 简化模式

    • 客户端将用户导向认证服务器。
    • 用户决定是否给于客户端授权。
    • 假设用户给予授权,认证服务器将用户导向客户端指定的”重定向URI”,并在URI的Hash部分包含了访问令牌。
    • 浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
    • 资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
    • 浏览器执行上一步获得的脚本,提取出令牌。
    • 浏览器将令牌发给客户端。
  3. 密码模式

    • 用户向客户端提供用户名和密码。
    • 客户端将用户名和密码发给认证服务器,向后者请求令牌。
    • 认证服务器确认无误后,向客户端提供访问令牌。
  4. 客户端模式

    • 客户端向认证服务器进行身份认证,并要求一个访问令牌。
    • 认证服务器确认无误后,向客户端提供访问令牌。