OAuth2.0介绍

  1. OAuth2.0简介
  2. 四种许可类型

    2.1. 授权码许可(Authorization Code)

    2.2. 隐式许可(Implicit)

    2.3. 资源拥有者密码凭据许可(Resource Owner Password Credentials)

    2.4. 客户端凭据许可(Client Credentials)

## 1、OAuth2.0简介

OAuth2官网是这么描述的:

The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf.

官方文档:https://tools.ietf.org/html/rfc6749

中文文档:https://github.com/jeansfish/RFC6749.zh-cn/blob/master/index.md

白话

OAuth2 是一个开放授权协议标准,它允许用户(资源拥有者)让第三方应用访问该用户在某服务的特定私有资源(资源服务器)但是不提供账号密码信息给第三方应用。

角色


1、Resource Owner:资源拥有者(能够许可对受保护资源的访问权限的实体。当资源拥有者是个人时,它被称为最终用户。)

2、Resource Server:资源服务器(托管受保护资源的服务器,能够接收和响应使用访问令牌对受保护资源的请求。)

3、Client:第三方应用客户端(使用资源拥有者的授权代表资源拥有者发起对受保护资源的请求的应用程序)

4、Authorization Server :授权服务器(在成功验证资源拥有者且获得授权后颁发访问令牌给客户端的服务器。)

协议流程


  1. +--------+ +---------------+
  2. | |--(A)- Authorization Request ->| Resource |
  3. | | | Owner |
  4. | |<-(B)-- Authorization Grant ---| |
  5. | | +---------------+
  6. | |
  7. | | +---------------+
  8. | |--(C)-- Authorization Grant -->| Authorization |
  9. | Client | | Server |
  10. | |<-(D)----- Access Token -------| |
  11. | | +---------------+
  12. | |
  13. | | +---------------+
  14. | |--(E)----- Access Token ------>| Resource |
  15. | | | Server |
  16. | |<-(F)--- Protected Resource ---| |
  17. +--------+ +---------------+

抽象的OAuth2.0流程描述

(A)客户端从资源拥有者处请求授权。授权请求可以直接向资源拥有者发起(如图所示),或者更可取的是通过授权服务器作为中介间接发起。

(B)客户端收到授权许可,这是一个代表资源拥有者的授权的凭据,使用本规范中定义的四种许可类型之一或者使用扩展许可类型表示。授权许可类型取决于客户端请求授权所使用的方法以及授权服务器支持的类型。

(C)客户端与授权服务器进行身份认证并出示授权许可以请求访问令牌。

(D)授权服务器验证客户端身份并验证授权许可,若有效则颁发访问令牌。

(E)客户端从资源服务器请求受保护资源并出示访问令牌进行身份验证。

(F)资源服务器验证访问令牌,若有效则处理该请求。

## 2、四种许可类型

**1、Authorization Code:授权码许可;
2、Implicit:隐式许可;
3、Resource Owner Password Credentials:资源拥有者密码凭据许可;
4、Client Credentials :客户端凭据许可。**

### 2.1、授权码许可(Authorization Code)


授权码模式是最常见的一种授权模式,最为安全和完善。

适用范围

需要得到长期授权,OAuth客户端是Web应用服务器,OAuth访问令牌不宜泄露给用户的环境。

Authorization Code具体的流程如下:

  1. +----------+
  2. | Resource |
  3. | Owner |
  4. | |
  5. +----------+
  6. ^
  7. |
  8. (B)
  9. +----|-----+ Client Identifier +---------------+
  10. | -+----(A)-- & Redirection URI ---->| |
  11. | User- | | Authorization |
  12. | Agent -+----(B)-- User authenticates --->| Server |
  13. | | | |
  14. | -+----(C)-- Authorization Code ---<| |
  15. +-|----|---+ +---------------+
  16. | | ^ v
  17. (A) (C) | |
  18. | | | |
  19. ^ v | |
  20. +---------+ | |
  21. | |>---(D)-- Authorization Code ---------' |
  22. | Client | & Redirection URI |
  23. | | |
  24. | |<---(E)----- Access Token -------------------'
  25. +---------+ (w/ Optional Refresh Token)

授权码许可流程描述

(A)客户端通过向授权端点引导资源拥有者的用户代理开始流程。客户端包括它的客户端标识、请求范围、本地状态和重定向URI,一旦访问被许可(或拒绝)授权服务器将传送用户代理回到该URI。

(B)授权服务器验证资源拥有者的身份(通过用户代理),并确定资源拥有者是否授予或拒绝客户端的访问请求。

(C)假设资源拥有者许可访问,授权服务器使用之前(在请求时或客户端注册时)提供的重定向URI重定向用户代理回到客户端。重定向URI包括授权码和之前客户端提供的任何本地状态。

(D)客户端通过包含上一步中收到的授权码从授权服务器的令牌端点请求访问令牌。当发起请求时,客户端与授权服务器进行身份验证。客户端包含用于获得授权码的重定向URI来用于验证。

(E)授权服务器对客户端进行身份验证,验证授权代码,并确保接收的重定向URI与在步骤(C)中用于重定向(资源拥有者的用户代理)到客户端的URI相匹配。如果通过,授权服务器响应返回访问令牌与可选的刷新令牌。

过程详解


授权请求(A)
参数 是否必须 含义
response_type 必需 授权类型,值固定为“code”。
client_id 必需 客户端标识。
redirect_uri 可选 成功授权后的回调地址。
scope 可选 表示授权范围。
state 推荐 client端的状态值。用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。

示例:

  1. GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
  2. Host: server.example.com
授权响应(C)
参数 是否必须 含义
code 必需 授权服务器生成的授权码。授权码必须在颁发后很快过期以减小泄露风险。
推荐的最长的授权码生命周期是10分钟。客户端不能使用授权码超过一次。
如果一个授权码被使用一次以上,授权服务器必须拒绝该请求并应该撤销(如可能)
先前发出的基于该授权码的所有令牌。
授权码与客户端标识和重定向URI绑定。授权服务器生成的授权码。
授权码必须在颁发后很快过期以减小泄露风险。
state 必需 客户端提供的state参数原样返回。

示例:

  1. HTTP/1.1 302 Found
  2. Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
访问令牌请求(D)
参数 是否必须 含义
grant_type 必需 授权类型,值固定为“authorization_code”。
code 必需 从授权服务器收到的授权码。
redirect_uri 必需 必须和授权请求中提供的redirect_uri相同。
client_id 必需 必须和授权请求中提供的client_id相同。

示例:

  1. POST /token HTTP/1.1
  2. Host: server.example.com
  3. Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
  4. Content-Type: application/x-www-form-urlencoded
  5. grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

##### 访问令牌响应(E)

参数说明 是否必须 描述
access_token 必需 授权令牌,Access_Token。
token_type 必需 表示令牌类型,该值大小写不敏感,可以是bearer类型或mac类型。
expires_in 推荐 该access token的有效期,单位为秒。如果省略,则授权服务器应该通过其他方式提供过期时间,或者记录默认值。
refresh_token 可选 在授权续期时,获取新的Access_Token时需要提供的参数。
scope 可选 表示授权范围。

示例:

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json;charset=UTF-8
  3. Cache-Control: no-store
  4. Pragma: no-cache
  5. {
  6. "access_token":"2YotnFZFEjr1zCsicMWpAA",
  7. "token_type":"example",
  8. "expires_in":3600,
  9. "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
  10. "example_parameter":"example_value"
  11. }

参考 QQ OAuth2 API(Authorization Code)

### 2.2、隐式许可(Implicit)


相比授权码许可,隐式许可少了第一步获取Authorization Code的过程,因此变得更为简单。但正因为如此也降低了安全性。授权服务器不能颁发刷新令牌。

适用范围

其适用于没有Server服务器来接受处理Authorization Code的第三方应用。

仅需临时访问的场景,用户会定期在API提供者那里进行登录,OAuth客户端运行在浏览器中(Javascript、Flash等)浏览器绝对可信,因为该类型可能会将访问令牌泄露给恶意用户或应用程序。

Implicit具体的流程如下:

  1. +----------+
  2. | Resource |
  3. | Owner |
  4. | |
  5. +----------+
  6. ^
  7. |
  8. (B)
  9. +----|-----+ Client Identifier +---------------+
  10. | -+----(A)-- & Redirection URI --->| |
  11. | User- | | Authorization |
  12. | Agent -|----(B)-- User authenticates -->| Server |
  13. | | | |
  14. | |<---(C)--- Redirection URI ----<| |
  15. | | with Access Token +---------------+
  16. | | in Fragment
  17. | | +---------------+
  18. | |----(D)--- Redirection URI ---->| Web-Hosted |
  19. | | without Fragment | Client |
  20. | | | Resource |
  21. | (F) |<---(E)------- Script ---------<| |
  22. | | +---------------+
  23. +-|--------+
  24. | |
  25. (A) (G) Access Token
  26. | |
  27. ^ v
  28. +---------+
  29. | |
  30. | Client |
  31. | |
  32. +---------+

隐式许可流程描述

(A)客户端通过向授权端点引导资源拥有者的用户代理开始流程。客户端包括它的客户端标识、请求范围、本地状态和重定向URI,一旦访问被许可(或拒绝)授权服务器将传送用户代理回到该URI。

(B)授权服务器验证资源拥有者的身份(通过用户代理),并确定资源拥有者是否授予或拒绝客户端的访问请求。

(C)假设资源拥有者许可访问,授权服务器使用之前(在请求时或客户端注册时)提供的重定向URI重定向用户代理回到客户端。重定向URI在URI片段中包含访问令牌。

(D)用户代理顺着重定向指示向Web托管的客户端资源发起请求。用户代理在本地保留片段信息。

(E)Web托管的客户端资源返回一个网页(通常是带有嵌入式脚本的HTML文档),该网页能够访问包含用户代理保留的片段的完整重定向URI并提取包含在片段中的访问令牌(和其他参数)。

(F)用户代理在本地执行Web托管的客户端资源提供的提取访问令牌的脚本。

(G)用户代理传送访问令牌给客户端。

过程详解


授权请求
参数 是否必须 含义
response_type 必需 授权类型,值固定为“token”。
client_id 必需 客户端标识。
redirect_uri 可选 成功授权后的回调地址。
scope 可选 表示授权范围。
state 推荐 client端的状态值。用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。

示例:

  1. GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
  2. Host: server.example.com
访问令牌响应
参数说明 是否必须 描述
access_token 必需 授权令牌,Access_Token。
token_type 必需 表示令牌类型,该值大小写不敏感,可以是bearer类型或mac类型。
expires_in 推荐 该access token的有效期,单位为秒。如果省略,则授权服务器应该通过其他方式提供过期时间,或者记录默认值。
scope 可选 表示授权范围。
state 可选 client端的状态值。用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。

示例:

#后的信息不会回传到服务端example.com/cb中。

  1. HTTP/1.1 302 Found
  2. Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&token_type=example&expires_in=3600

参考 QQ OAuth2 API(Implicit)

### 2.3、资源拥有者密码凭据许可(Resource Owner Password Credentials)


资源拥有者向客户端提供自己的用户名和密码。客户端使用这些信息,向授权服务器请求授权。

适用范围

这种模式会直接将用户密码暴露给客户端,一般适用于Resource server高度信任第三方Client的情况下。

Resource Owner Password Credentials具体的流程如下:

  1. +----------+
  2. | Resource |
  3. | Owner |
  4. | |
  5. +----------+
  6. v
  7. | Resource Owner
  8. (A) Password Credentials
  9. |
  10. v
  11. +---------+ +---------------+
  12. | |>--(B)---- Resource Owner ------->| |
  13. | | Password Credentials | Authorization |
  14. | Client | | Server |
  15. | |<--(C)---- Access Token ---------<| |
  16. | | (w/ Optional Refresh Token) | |
  17. +---------+ +---------------+

资源拥有者密码凭据许可流程描述

(A)资源拥有者提供给客户端它的用户名和密码。

(B)通过包含从资源拥有者处接收到的凭据,客户端从授权服务器的令牌端点请求访问令牌。当发起请求时,客户端与授权服务器进行身份验证。

(C)授权服务器对客户端进行身份验证,验证资源拥有者的凭证,如果有效,颁发访问令牌。

过程详解


访问令牌请求
参数 是否必须 含义
grant_type 必需 授权类型,值固定为“password”。
username 必需 资源拥有者的用户名。
password 必需 资源拥有者的密码。
scope 可选 表示授权范围。

示例:

  1. POST /token HTTP/1.1
  2. Host: server.example.com
  3. Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
  4. Content-Type: application/x-www-form-urlencoded
  5. grant_type=password&username=johndoe&password=A3ddj3w
访问令牌响应

与Authorization Code中的访问令牌响应一样

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json;charset=UTF-8
  3. Cache-Control: no-store
  4. Pragma: no-cache
  5. {
  6. "access_token":"2YotnFZFEjr1zCsicMWpAA",
  7. "token_type":"example",
  8. "expires_in":3600,
  9. "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
  10. "example_parameter":"example_value"
  11. }

### 2.4、客户端凭据许可(Client Credentials)


客户端(Client)请求授权服务器验证,通过验证就发access token,Client直接以已自己的名义去访问Resource server的一些受保护资源。

适用范围

以客户端本身而不是单个用户的身份来读取、修改资源服务器所开放的API。

Client Credentials具体的流程如下:

  1. +---------+ +---------------+
  2. | | | |
  3. | |>--(A)- Client Authentication --->| Authorization |
  4. | Client | | Server |
  5. | |<--(B)---- Access Token ---------<| |
  6. | | | |
  7. +---------+ +---------------+

客户端凭据许可流程描述

(A)客户端与授权服务器进行身份验证并向令牌端点请求访问令牌。

(B)授权服务器对客户端进行身份验证,如果有效,颁发访问令牌。

过程详解


访问令牌请求
参数 是否必须 含义
grant_type 必需 授权类型,值固定为“client_credentials”。
scope 可选 表示授权范围。

示例:

客户端身份验证两种方式

1、Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3。

2、client_id(客户端标识),client_secret(客户端秘钥)。

  1. POST /token HTTP/1.1
  2. Host: server.example.com
  3. Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
  4. Content-Type: application/x-www-form-urlencoded
  5. grant_type=client_credentials
访问令牌响应

参数介绍参见 Authorization Code中的访问令牌响应

刷新令牌不应该包含在内。

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json;charset=UTF-8
  3. Cache-Control: no-store
  4. Pragma: no-cache
  5. {
  6. "access_token":"2YotnFZFEjr1zCsicMWpAA",
  7. "token_type":"example",
  8. "expires_in":3600,
  9. "example_parameter":"example_value"
  10. }

参考 微信公众平台获取access_token(Client Credentials Grant)

OAuth2.0介绍的更多相关文章

  1. 开放平台鉴权以及OAuth2.0介绍

    OAuth 2.0 协议 OAuth是一个开发标准,允许用户授权第三方网站或应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的内容. OAuth 2.0 ...

  2. SpringBootSecurity学习(14)前后端分离版之 OAuth2.0介绍

    登录总结 前面基本介绍了security的常规用法,同时介绍了JWT和它的一个简单实现,基本上开发中遇到的登录问题都能解决了,即使在分布式开发,或者微服务开发中实现登录也基本没有问题了.securit ...

  3. IdentityServer4专题之一:OAuth2.0介绍

    1.OAuth 2.0授权方式介绍: OAuth 2.0 的标准是 RFC 6749 文件.该文件先解释了 OAuth 是什么: OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有 ...

  4. OAuth2.0 介绍

    一.基本协议流程: (1) Client请求RO(Resource Owner)的授权:请求中一般包含:要访问的资源路径,操作类型,Client的身份等信息.(2) RO批准授权:并将“授权证据”发送 ...

  5. Oauth2.0 QQ&微信&微博实现第三方登陆

    一.写在前面 目前对于大多数的App或Web网站都支持有第三方登陆这个功能,用户可使用 QQ/ 微信/ 微博 帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户.最近在新项目上刚好用到了,在 ...

  6. OAuth2.0认证和授权以及单点登录

    https://www.cnblogs.com/shizhiyi/p/7754721.html OAuth2.0认证和授权机制讲解 2017-10-30 15:33 by shizhiyi, 2273 ...

  7. OAuth2.0认证和授权机制讲解

    第一章.OAuth2.0 介绍 OAuth认证 OAuth认证是为了做到第三方应用在未获取到用户敏感信息(如:账号密码.用户PIN等)的情况下,能让用户授权予他来访问开放平台(主要访问平台中的资源服务 ...

  8. 使用OAuth2.0协议的github、QQ、weibo第三方登录接入总结

    目录 第三方接入总结 OAuth2.0介绍 github OAuth2.0登录接入 国内第三方应用商SDK使用 微博SDK 腾讯QQ SDK passport.js插件使用 安装 相关中间件.路由 返 ...

  9. Spring Security OAuth2.0认证授权一:框架搭建和认证测试

    一.OAuth2.0介绍 OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不 需要将用户名和密码提供给第三方应用或分享他们数据的所有内容. 1.s ...

随机推荐

  1. Linux中硬链接和软链接的区别

    看了这篇文章之后,豁然开朗.直接放链接,感谢作者的分享. https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/#ico ...

  2. ASP.NET MVC4添加区域视图 找到多个与名为“home”的控制器匹配的类型

    今天在项目中遇到一个问题,在MVC下想建立一个区域的后台Boss视图,出现了"找到多个与名为“home”的控制器匹配的类型"的问题,希望下面的解决方案能够帮助到大家 这是网站的整体 ...

  3. DNN原理探究系列之目录与序章篇

    序言: 神经网络结构,作为最成功的机器学习模型之一,其工作原理一直被埋藏得比较深,其解释性以至于被称为黑盒. 自己对于DNN的理解也只能算刚踏入了门槛,对于人脑的原理与DNN原理之间的互通性,一直是非 ...

  4. [js]jQuery EasyUI的linkbutton组件disable方法无法禁用jQuery绑定事件的问题分析

    问题由来 linkbutton 是 jQuery EasyUI 中常用的一个控件,可以使用它创建按钮.用法很简单,使用 a 标签给一个easyui-linkbutton 的class就可以了. < ...

  5. IDEA导入Maven多项目(Mac下)

    主界面Import Project 选择maven项目目录文件夹 选择Import project from external model 中的maven选项,Next下一步 Sources和Docu ...

  6. FileReader实现图片预览,并上传(js代码)

    var rFilter = /^(image\/bmp|image\/gif|image\/jpeg|image\/png|image\/tiff)$/i; //控制格式 var iMaxFilesi ...

  7. EFLinq查询

    1.无参数查询var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes ").ToList ...

  8. 使用 vs code 搭建vue项目(一)

    1. 配置环境 1.1. 安装nodejs,下载地址:https://nodejs.org/en/download/. 步骤-..安装完成后,输入node-v,提示如下,则安装完成. 1.2. 安装v ...

  9. EF学习笔记(八):更新关联数据

    学习笔记主目录链接:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇链接:EF学习笔记(七):读取关联数据 本篇原文链接:Updating Related Data 本篇主要考 ...

  10. window、view相关

    View.Window以及Activity主要是用于显示并与用户交互window view activity surfaceView 三者间的关系: 在Activity中要设置View时,通常用的方法 ...