一、OAuth介绍

  OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。
  OAuth允许用户提供一个令牌给第三方网站,一个令牌对应一个特定的第三方网站,同时该令牌只能在特定的时间内访问特定的资源。

二、OAuth2 角色

OAuth 2 标准中定义了以下几种角色:

  • 资源所有者(Resource Owner)
  • 资源服务器(Resource Server)
  • 授权服务器(Authorization Server)
  • 客户端(Client)

1、资源所有者(Resource Owner)
在 OAuth 2 标准中,资源所有者即代表授权客户端访问本身资源信息的用户(User),也就是应用场景中的“开发者A”。客户端访问用户帐户的权限仅限于用户授权的“范围”(aka. scope,例如读取或写入权限)。

2、资源/授权服务器(Resource/Authorization Server)
资源服务器托管了受保护的用户账号信息,而授权服务器验证用户身份然后为客户端派发资源访问令牌。

3、客户端(Client)
在 OAuth 2 中,客户端即代表意图访问受限资源的第三方应用。在访问实现之前,它必须先经过用户者授权,并且获得的授权凭证将进一步由授权服务器进行验证。

三、OAuth2 授权


1、Authrization Request
客户端向资源所有者请求其授权

2、Authorization Grant(Get)
客户端收到资源所有者的授权许可,这个授权许可是一个代表资源所有者授权的凭据。

3、Authorization Grant(Post)
客户端向授权服务器请求访问令牌,并出示授权许可。

4、Access Token(Get)
授权服务器对客户端身份进行认证,并校验授权许可,如果都是有效的,则发放访问令牌

5、Access Token(Post && Validate)
客户端向资源服务器请求受保护的资源,并出示访问令牌

6、Protected Resource(Get)
资源服务器校验访问令牌,如果令牌有效,则提供服务

三、OAuth2 授权许可

一个授权许可是一个凭据,它代表资源所有者对访问受保护资源的一个授权,是客户端用来获取访问令牌的。

授权类型有四种:authorization code, implicit, resource owner password credentials, and client credentials

  1. Authorization Code
    授权码是授权服务器用来获取并作为客户端和资源所有者之间的中介。代替直接向资源所有者请求授权,客户端定向资源所有者到一个授权服务器,授权服务器反过来指导资源所有者将授权码返回给客户端。在将授权码返回给客户端之前,授权服务器对资源所有者进行身份验证并获得授权。因为资源所有者只对授权服务器进行身份验证,所以资源所有者的凭据永远不会与客户机共享。
  2. Implicit
    隐式授权是为了兼顾到在浏览器中用诸如JavaScript的脚本语言实现的客户端而优化的简化授权代码流程。在隐式授权流程中,不是发给客户端一个授权码,而是直接发给客户端一个访问令牌,而且不会对客户端进行认证。隐式授权提高了一些客户端(比如基于浏览器实现的客户端)的响应能力和效率,因为它减少了获得访问令牌所需的往返次数。
  3. Resource Owner Password Credentials
    资源所有者的密码凭据(比如,用户名和密码)可以直接作为授权许可来获取访问令牌。这个凭据只应该用在高度信任的资源所有者和客户端之间(比如,客户端是系统的一部分,或者特许的应用),并且其它授权模式不可用的时候。
  4. Client Credentials
    客户端凭据通常用作授权许可
  5. Access Token
    访问令牌是用来访问受保护的资源的凭据。一个访问令牌是一个字符串,它代表发给客户端的授权。令牌代表资源所有者授予的对特定范围和访问的时间(PS:令牌是有范围和有效期的),并由资源服务器和授权服务器强制执行。访问令牌可以有不同的格式、结构和使用方法。
  6. Refresh Token
    Refresh Token是用于获取Access Token的凭据。刷新令牌是授权服务器发给客户端的,用于在当前访问令牌已经失效或者过期的时候获取新的访问令牌。刷新令牌只用于授权服务器,并且从来不会发给资源所有者。

    刷新的流程如图所示:
  • (A) 客户端请求获取访问令牌,并向授权服务器提供授权许可
  • (B) 授权服务器对客户端身份进行认证,并校验授权许可,如果校验通过,则发放访问令牌和刷新令牌
  • © 客户端访问受保护的资源,并向资源服务器提供访问令牌
  • (D) 资源服务器校验访问令牌,如果校验通过,则提供服务
  • (E) 重复©和(D)直到访问令牌过期。如果客户端直到访问令牌已经过期,则跳至(G),否则不能继续访问受保护的资源
  • (F) 自从访问令牌失效以后,资源服务器返回一个无效的令牌错误
  • (G) 客户端请求获取一个新的访问令牌,并提供刷新令牌
  • (H) 授权服务器对客户端进行身份认证并校验刷新令牌,如果校验通过,则发放新的访问令牌(并且,可选的发放新的刷新令牌)

四、客户注册

在使用该协议之前,客户端向授权服务器注册。
1、客户端类型
OAuth定义了两种客户端类型:

  • confidential:能够维护其凭证的机密性的客户端
  • public:不能维护其凭证的机密性的客户端

2、客户端密码
拥有客户端密码的客户端可以使用HTTP Basic向服务器进行认证,当然前提是授权服务器支持HTTP Basic认证。

例如:Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3

二者选其一的,授权服务器可能支持在请求体中用下列参数包含客户端凭据:

  • client_id:必须的,在授权服务器中注册过的客户端标识符。
  • client_secret:必须的,客户端秘钥。如果秘钥是空字符串的话可以省略该参数。

用这两个参数将客户端凭据包含在请求体中这种方式不推荐,并且应该限制客户端不能直接用HTTP Basic认证方案。

五、协议端点

授权处理用两个授权服务器端点:

  • Authorization endpoint:用于客户端从资源所有者那里获取授权
  • Token endpoint:用于客户端用授权许可交互访问令牌

还有一个端点

  • Redirection endpoint:用于资源服务器通过资源所有者用户代理将包含授权凭据的响应返回给客户端

1、Authorization Endpoint(授权端点)
  授权端点用于和资源所有者交互并获取一个授权许可的。授权服务器必须首先校验资源所有者的身份。
(1)Response Type(响应类型)
  客户端用以下参数通知授权服务器自己渴望的授权类型:

  • response_type:必须的。为了请求一个授权码这个值必须是"code",为了请求一个访问令牌这个值必须是"token"

(2)Redirection Endpoint(重定向端点)
  在完成和资源所有者的交互以后,授权服务器直接将资源所有者的user-agent返回给客户端。授权服务器重定向到这个user-agent

2、Access Token Scope(访问令牌范围)
  授权和令牌端点允许客户端使用“scope”请求参数指定访问请求的范围。反过来,授权服务器使用“scope”响应参数通知客户机它所发放的访问令牌的范围。

六、Obtaining Authorization(获得授权)

为了获得一个访问令牌,客户端需要先从资源所有者那里获得授权。授权是以授权许可的形式来表示的。

OAuth定义了四种授权类型:

  • authorization code
  • implicit
  • resource owner password credentials
  • client credentials

1、Authorization Code Grant
授权码流程如图所示:

  • (A) 客户端通过将资源所有者的用户代理指向授权端点来启动这个流程。客户端包含它的客户端标识符,请求范围,本地状态,和重定向URI,在访问被允许(或者拒绝)后授权服务器立即将用户代理返回给重定向URI。
  • (B) 授权服务器验证资源所有者(通过用户代理),并确定资源所有者是否授予或拒绝客户端的访问请求。
  • (C ) 假设资源所有者授权访问,那么授权服务器用之前提供的重定向URI(在请求中或在客户端时提供的)将用户代理重定向回客户端。重定向URI包括授权码和前面客户端提供的任意本地状态。
  • (D) 客户端用上一步接收到的授权码从授权服务器的令牌端点那里请求获取一个访问令牌。
  • (E) 授权服务器对客户端进行认证,校验授权码,并确保这个重定向URI和第三步©中那个URI匹配。如果校验通过,则发放访问令牌,以及可选的刷新令牌。

2、Implicit Grant
隐式授权用于获取访问令牌(它不支持刷新令牌),它针对已知的操作特定重定向URI的公共客户端进行了优化。这些客户端通常在浏览器中使用脚本语言(如JavaScript)实现。

因为它是基于重定向的流程,所以客户端必须有能力和资源所有者的用户代理(典型地,是一个Web浏览器)进行交互,同时必须有能力接收来自授权服务器的重定向请求。

隐士授权类型不包含客户端身份验证,它依赖于资源所有者的存在和重定向URI的注册。由于访问令牌被编码到重定向URI中,所以它可能暴露给资源所有者以及同一台设备上的其它应用。
隐式授权流程如图所示:

  • (A) 客户端引导资源所有者的user-agent到授权端点。客户端携带它的客户端标识,请求scope,本地state和一个重定向URI。
  • (B) 授权服务器对资源所有者(通过user-agent)进行身份认证,并建立连接是否资源所有者允许或拒绝客户端的访问请求。
  • © 假设资源所有者允许访问,那么授权服务器通过重定向URI将user-agent返回客户端。
  • (D) user-agent遵从重定向指令
  • (E) web-hosted客户端资源返回一个web页面(典型的,内嵌脚本的HTML文档),并从片段中提取访问令牌。
  • (F) user-agent执行web-hosted客户端提供的脚本,提取访问令牌
  • (G) user-agent将访问令牌传给客户端

3、Resource Owner Password Credentials Grant
资源所有者密码凭证授予类型适用于资源所有者与客户端(如设备操作系统或高度特权应用程序)存在信任关系的情况。授权服务器在启用这种授予类型时应该特别小心,并且只在其他授权流程不可行的时候才允许使用。

这种授权类型适合于有能力维护资源所有者凭证(用户名和密码,典型地,用一个交互式的表单)的客户端。
资源所有者密码凭证流程如图:

  • (A) 资源所有者提供他的用户名和密码给客户端
  • (B) 客户端携带从资源所有者那里收到的凭证去授权服务器的令牌端点那里请求获取访问令牌
  • © 授权服务器对客户端进行身份认证,并校验资源所有者的凭证,如果都校验通过,则发放访问令牌

4、Client Credentials Grant
客户端用它自己的客户单凭证去请求获取访问令牌
客户端凭证授权流程如图所示:

  • (A) 客户端用授权服务器的认证,并请求获取访问令牌
  • (B) 授权服务器验证客户端身份,如果严重通过,则发放令牌

参考文章:https://www.cnblogs.com/cjsblog/p/9174797.html
https://www.cnblogs.com/Wddpct/p/8976480.html

OAuth使用教程(一):初识OAuth相关推荐

  1. Java 结构体之 JavaStruct 使用教程一 初识 JavaStruct

    Javastruct 是什么 简而言之,Javastruct 是一个第三方库,用于像处理 C 或者 C++ 结构体那样处理 java 对象.也即利用 Javastruct 可以在 java 上实现类似 ...

  2. int sel 在c语言表示,C语言教程ch1初识C程序.ppt

    C语言教程ch1初识C程序 C 程序结构 3层结构,5个函数 降低程序的构思.编写.调试的复杂度 可读性好 如何尽快学会用C语言进行程序设计 了解C程序的构成 模仿.改写.编写 通过不断的编程实践,逐 ...

  3. NX10实例教程——草图初识

    NX10实例教程--草图初识 NX10实例教程--草图初识(基础知识和概念) 草图:绘制在平面内的曲线,一般草图曲线为蓝色,是利用约束修改曲线位置,利用标注修改大小的线条.以往使用曲线中的直线和圆弧绘 ...

  4. Standard ML快餐教程(1) - 初识

    Standard ML快餐教程(1) - 初识 好久没写快餐教程了,下面开始一个新的系列,关于函数式编程语言的系列.打算写三种语言:Standard ML,ocaml和Haskell. 这几门语言都不 ...

  5. CANOpen系列教程01_初识CAN与CANOpen及相关内容

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!https://www.cnblogs.com/captainbed 正文: CANOpen ...

  6. CUDA教程: 2.初识CUDA---CUDA简介

    CUDA教程: 2.初识CUDA 在上一章, 我们介绍了GPU的硬件, 这一张呢, 我们来聊聊CUDA编程的细节. 说到编程细节, 无非就是包含: 环境安装, 语法风格, 实现流程(或叫做编程模型), ...

  7. JavaFx教程-01初识javaFX

    什么是JavaFX JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者用来设计.创建.测试.调试和部署富客户端程序,和Java一样跨平台. JavaFX特点 官方对于JavaFX的解释如 ...

  8. ArcGIS地理数据处理高级教程_002_2初识地理处理工具

    ArcGIS地理数据处理高级教程 2.2 认识ArcGIS desktop 10.8 软件装上以后在开始菜单中就能找到ArcGIS这个文件夹,里面有很多东西,我们用的最多的是这个ArcMap 10.8 ...

  9. 零基础HTML入门教程(11)--初识VSCode

    点此查看 所有教程.项目.源码导航 本文目录 1. 编辑器 2. 编辑器是干啥的 3. VSCode编辑器的特长 4. VSCode下载与安装 5. VSCode安装 6. 小结 1. 编辑器 在之前 ...

最新文章

  1. docker学习笔记(四): 镜像和仓库
  2. 微信小程序仿微信SlideView组件slide-view
  3. 使用比较器的nulls对具有null值的列表进行排序
  4. 【收藏】李纪为:初入NLP领域的一些小建议
  5. 智能优化算法:学生心理学优化算法 -附代码
  6. 如何去追女生,看了你就成功了一半
  7. 基于javaweb的客户信息管理系统搭建
  8. c语言程序移动平均法,计算C中的移动平均值
  9. 后端代码增删改查的编写~
  10. 力扣题:904.水果成篮
  11. 辩证统一和有机统一的比较
  12. mysql判断用户名和密码是否正确_怎样分别判断用户名和密码是否正确
  13. Android11.0(R) MTK6771 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)
  14. 前有莫雷,今有清华学霸要求公开华人程序员自杀真相,被Facebook开除了
  15. datav多组件交互
  16. LogiScope100MHZ 16通道逻辑分析仪
  17. UnrealEngine4(虚幻4)这次来真格的了
  18. 教你路由器端口映射设置方法
  19. python123判断火车票座位_[python篇]自己动手实现火车票中转查询
  20. java废弃方法_JAVA9之后废弃newInstance()方法

热门文章

  1. vscode+django 搭建自己的个人网站(一) ——环境搭建与配置
  2. c语言ip字符串分割成数组,将IP地址字符串分割成数组
  3. 质量云时代,WeTest品牌全面升级
  4. WeTest明星工具-移动端性能测试PerfDog初探
  5. 【USB笔记】 标准设备请求Standard Device Requests
  6. GNOME 桌面安装 -- 阿里云 Ubuntu 16.04 安装图形界面
  7. XFF和referer
  8. 使用Service+BroadcastReceiver实现定时更新天气
  9. 教你基带N9008ZMUDNB1 锁定2G /E 网 [转]
  10. android 手机存储空间 进度条,Android 进度条