[简易图解]『 OAuth2.0』 『进阶』 授权模式总结 转本站chihokyo

一,到底 OAuth 是什么?

写在前面的

上一次简单傻瓜式的用图来说明了到底什么是 OAuth,没看过的童靴可以点击下面这条链接看一下。
看完这个在来看这篇可能理解起来效果拔群。
【简易图解】『 OAuth2.0』 猴子都能懂的图解
简而言之就是一个程序想借用下你的数据 ( 想借你微信朋友圈内容看一下啦,想借你微博图片下载一下啦) 所产生的一系列问题 (比如安全,如何授权等等),OAuth 就是关于这些的规范。

  • 接下来我想就授权模式做一下总结,还是用图。
  • 这次的图可能没有上次这么傻瓜,只要仔细阅读一下,就连我非计算机专业出身的人都能懂的话,一般的猴子们估计也没问题。觉得太长的可以只从图解看起,或者只看授权码模式就好。
  • 授权模式主要参考来自 RFC 6749

认证 Authentication VS 授权 Authorization

看授权模式图之前,先区别下这两个概念。

  • 认证就是我要输入帐号和密码来证明我是我

  • 授权就是并非通过帐号和密码来把我的东西借给其他人

  • 这其中的关键就是,是否需要输入帐号密码。记住,OAuth 不需要输入帐号和密码,你要做的只是授权。
    下面这张图清晰的说明了,认证和授权。
    file

    二,授权模式

    如果有觉得画质太差的,没办法,上传之后就这样了。。
    这里是 PPT 链接。

  • 授权码模式

  • 简化模式

  • 密码模式

  • 客户端模式

  • 刷新令牌

1. 授权码模式 Authorization Code

  • 授权码模式是最常见常用的模式,我们所熟悉的微博,QQ 等都是这种模式。

  • 另外也是最繁琐的一种方式,如果弄懂了这个相信接下来的三种类型都会迎刃而解。

  • 这种模式和其他最大的区别就在于是否有授权码这个步骤。

    1.1 图解

    file
    file
    file
    file
    file
    file
    file
    file
    file
    file
    file
    file

    1.2 授权请求 Authorization Request

    GET {认证终点}
    ?response_type=code           // 必选项
    &client_id={客户端的ID}       // 必选项 
    &redirect_uri={重定向URI}    // 可选项 
    &scope={申请的权限范围}        // 可选项
    &state={任意值}              // 推荐
    HTTP/1.1
    HOST: {认证服务器}

1.3 授权响应 Authorization Response

HTTP/1.1 302 Found
Location: {重定向URI}
?code={授权码}          // 必填
&state={任意文字}       // 如果授权请求中包含 state的话那就是必填

1.4 令牌请求 Access Token Request

POST {令牌终点} HTTP/1.1
Host: {认证服务器}
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code      // 必填
&code={授权码}                     // 必填 必须是认证服务器响应给的授权码
&redirect_uri={重定向URI}          // 如果授权请求中包含 redirect_uri 那就是必填
&code_verifier={验证码}            // 如果授权请求中包含 code_challenge 那就是必填

根据具体情况有可能是向客户端服务器进行请求,这时候请加上 Basic 认证(Authorization 头部)或者是 参数 client_id & client_secret

1.5 令牌响应 Access Token Response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"{访问令牌}",      // 必填
  "token_type":"{令牌类型}",      // 必填
  "expires_in":{过期时间},        // 任意
  "refresh_token":"{刷新令牌}",   // 任意
  "scope":"{授权范围}"            // 如果请求和响应的授权范围不一致就必填
}

2. 简化模式 Implicit

  • 简化模式,顾名思义,就是简化了的模式。

  • 简化的就是授权码这个步骤。

    2.1 图解

    file
    file
    file
    file
    file
    file
    file
    file
    file
    file

2.2 授权请求 Authorization Request

GET {授权终点}
  ?response_type=token             // 必填
  &client_id={客户端ID}      // 必填
  &redirect_uri={重定向URI}  // 可选。授权成功后的重定向地址
  &scope={授权范围}              // 任意
  &state={任意文字}              // 推荐
  HTTP/1.1
HOST: {认证服务器}

2.3 授权响应 Authorization Response

HTTP/1.1 302 Found
Location: {重定向URI}
  #access_token={令牌码}       // 必填
  &token_type={令牌类型}     // 必填
  &expires_in={过期时间}       // 任意
  &state={任意文字}            // 如果授权请求中包含 state 那就是必填
  &scope={授权范围}            // 如果请求和响应的授权范围不一致就必填

3. 密码模式 Resource Owner Password Credentials

  • 密码模式其实就是进一步再去简化了简化模式。

  • 不仅仅没有了授权码模式下的授权码,也没了简化模式下的授权请求。

  • 直接就请求了令牌码。

    3.1 图解

    file
    file
    file
    file
    file
    file
    file
    file
    file

3.2 令牌请求 Access Token Request

POST {令牌终点} HTTP/1.1
Host: {认证服务器}
Content-Type: application/x-www-form-urlencoded

grant_type=password       // 必填
&username={用户ID}    // 必填
&password={密码}    // 必填
&scope={授权范围}       // 任意

根据具体情况有可能是向客户端服务器进行请求,这时候请加上 Basic 认证(Authorization 头部)或者是 参数 client_id & client_secret

3.3 令牌响应 Access Token Response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"{访问令牌}",   // 必填
  "token_type":"{令牌类型}",      // 必填
  "expires_in":{过期时间},        // 任意
  "refresh_token":"{刷新令牌}", // 任意
  "scope":"{授权范围}"              // 如果请求和响应的授权范围不一致就必填
}

4. 客户端模式 Client Credentials

  • 客户端模式可是最简化的了。

  • 什么都不问,直接请求!简单粗暴给我令牌!

    4.1 图解

    file
    file
    file
    file
    file
    file

4.2 令牌请求 Access Token Request

POST {令牌终点} HTTP/1.1
Host: {认证服务器}
Authorization: Basic {客户端模式}
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials     // 必填
&scope={授权范围}               // 任意

4.3 令牌响应 Access Token Response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"{访问令牌}",  // 必填
  "token_type":"{令牌类型}",      // 必填
  "expires_in":{过期时间},              // 任意
  "scope":"{授权范围}"                // 如果请求和响应的授权范围不一致就必填
}

5. 刷新令牌 Refresh Token

5.1 图解

第三方已存在令牌码为前提进行更新令牌
file
file
file
file
file
file

5.2 令牌请求 Access Token Request

POST {令牌终点} HTTP/1.1
Host: {认证服务器}
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token           // 必填
&refresh_token={刷新令牌}        // 必填
&scope={授权范围}                    // 任意

根据具体情况有可能是向客户端服务器进行请求,这时候请加上 Basic 认证(Authorization 头)或者是 参数 client_id & client_secret

5.3 令牌响应 Access Token Response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"{访问令牌}",      // 必填
  "token_type":"{令牌类型}",          // 必填
  "expires_in":{过期时间},                  // 任意
  "refresh_token":"{刷新令牌}", // 任意
  "scope":"{授权范围}"                    // 如果请求和响应的授权范围不一致就必填
}

三,总结

授权模式 授权终点 令牌终点
授权码模式 使用 使用
简化模式 使用 不使用
密码模式 不使用 使用
客户端模式 不使用 使用
刷新令牌 不使用 使用

其实授权终点就是授权请求和响应
令牌终点就是令牌的请求和响应

感谢您的阅读!

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!