OAuth快速入门

一、概述

An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.

OAuth是Open Authorization(开放授权)的缩写,允许用户授权给第三方应用访问服务提供商所提供的用户资源,并且保证授权是安全的。

官网地址

二、概念

四种角色:

  • Resource owner:资源所有者,也叫用户
  • Resource server:资源服务器,服务提供商用来存储资源,以及处理对资源的请求的服务器
  • Client:客户端,也叫第三方应用,通过获取用户的授权,继而访问用户在资源服务器上的资源
  • Authorization server:认证服务器,服务提供商用来处理认证的服务器,物理上与资源服务器可以是同一台服务器

两种实体:

  • HTTP service:服务提供商
  • User Agent:用户代理,通常指浏览器

三、工作原理

(A) 用户打开客户端,客户端请求用户授权

(B) 用户同意授权给客户端

(C) 客户端使用获取的授权,向认证服务器请求令牌

(D) 认证服务器对客户端进行认证,并验证授权,确认有效后发放令牌给客户端

(E) 客户端使用令牌,向资源服务器请求资源

(F) 资源服务器验证令牌,确认有效后处理请求

四、授权类型

客户端必须获取用户的授权,才能够获取令牌。OAuth定义了四种获取授权的方式:

1、授权码模式(Authorization Code)

是功能最齐全、流程最严谨,也是最常用的授权模式。

(A) 用户通过用户代理访问客户端,客户端将其重定向到认证服务器

  • response_type:表示授权类型,必选项,此种模式固定为“code”
  • client_id:表示客户端ID,必选项
  • redirect_uri:表示重定向URI,可选项
  • scope:表示申请的权限范围,可选项
  • state:表示客户端当前状态,可选项

实例:

GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com

(B) 用户选择是否授权给客户端

(C) 如果用户授权,认证服务器将用户重定向到客户端事先指定的URI,并附加一个授权码

  • code:表示授权码,必选项,客户端只能使用一次,与客户端ID和重定向URI一一对应
  • state:表示客户端的状态

实例:

HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
    &state=xyz

(D) 客户端使用授权码和重定向URI,向认证服务器申请令牌

  • grant_type:表示授权类型,必选项,此种模式固定为“authorization_code”
  • code:表示授权码,必选项
  • redirect_uri:表示重定向URI,必选项
  • client_id:表示客户端ID,必选项

实例:

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

(E) 认证服务器验证授权码和URI,确认无误后,向客户端发放令牌

  • access_token:表示访问令牌,必选项
  • token_type:表示令牌类型,必选项,可以是bearer或mac类型
  • expires_in:表示过期时间,单位为秒。如果省略,则其他方式必须设置
  • refresh_token:表示刷新令牌,可选项,用来获取下一次的访问令牌
  • scope:表示权限范围,如果与客户端申请的范围一致,可省略

实例:

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

{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"example",
  "expires_in":3600,
  "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
  "example_parameter":"example_value"
}

2、简化模式(Implicit)

不通过第三方应用的服务器,直接在浏览器中进行,不需要使用授权码。

(A) 用户通过用户代理访问客户端,客户端将其重定向到认证服务器

  • response_type:表示授权类型,必选项,此种模式固定为“token”
  • client_id:表示客户端ID,必选项
  • redirect_uri:表示重定向URI,可选项
  • scope:表示申请的权限范围,可选项
  • state:表示客户端当前状态,可选项

实例:

GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com

(B) 用户选择是否授权给客户端

(C) 如果用户授权,认证服务器将用户重定向到客户端事先指定的URI,并在URI的Hash部分包含访问令牌

  • access_token:表示访问令牌,必选项
  • token_type:表示令牌类型,必选项
  • expires_in:表示过期时间,单位为秒。如果省略,则其他方式必须设置
  • scope:表示申请的权限范围,可选项
  • state:表示客户端的状态

实例:

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

(D) 浏览器向资源服务器发送请求,但不包含Hash值

(E) 资源服务器返回一个网页,包含获取Hash值中令牌的代码

(F) 浏览器执行脚本,获取令牌

(G) 浏览器将令牌发送给客户端

3、密码凭证模式(Resource Owner Password Credentials)

用户必须向客户端提供用户名和密码,存在较大的风险。通常只有在认证服务器无法通过其他方式进行授权时,才会考虑使用此种模式。

(A) 用户向客户端提供用户名和密码凭证

(B) 客户端将用户名和密码凭证发送给认证服务器,并请求令牌

  • grant_type:表示授权类型,必选项,此种模式固定为“password”
  • username:表示用户名,必选项
  • password:表示密码,必选项
  • scope:表示权限范围,可选项

实例:

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=johndoe&password=A3ddj3w

(C) 认证服务器确认无误后,向客户端发放令牌

4、客户端凭证模式(Client Credentials)

由客户端直接向服务提供商进行认证,其实并不存在授权问题。

(A) 客户端向认证服务器提供身份凭证,并请求令牌

  • grant_type:表示授权类型,必选项,此种模式固定为“client_credentials”
  • scope:表示权限范围,可选项

实例:

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials

(B) 认证服务器确认无误后,向客户端发放令牌

5、刷新令牌

如果用户访问的时候,客户端所获取的访问令牌已经过期,则需要使用刷新令牌重新申请新的访问令牌。

客户端发送的HTTP请求,包括以下参数:

  • grant_type:表示授权类型,必选项,此种模式固定为“refresh_token”
  • refresh_token:表示之前收到的刷新令牌,必选项
  • scope:表示权限范围,不能够超出上次申请的范围。如果省略,则表示与上次申请的权限范围一致

实例:

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

参考文章:

阮一峰:理解OAuth 2.0

帮你深入理解OAuth2.0协议

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,873评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,483评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,525评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,595评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,018评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,958评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,118评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,873评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,643评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,813评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,293评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,615评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,306评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,170评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,968评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,107评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,894评论 2 278

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,111评论 18 139
  • 以此记录配置office365登录认证时遇到的那些坑。 需求: 想在自己APP中获取到用户office365账号的...
    断片记忆阅读 1,773评论 0 2
  • OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。...
    夕望有你阅读 274评论 1 2
  • OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。...
    谢谢写阅读 723评论 0 1
  • 美女发帖欲嫁年薪50万美元有钱人华尔街金融家神回复 下面要说的都是心里话 本人25岁,非常漂亮,谈吐文雅,有品位,...
    阳光阿四阅读 370评论 0 1