OAuth协议

OAuth是一种授权协议。假设用户在图像服务器保存许多图片,用户需要在打印网站访问图像服务器的图片,通过OAuth协议可以在打印网站不知道图像服务器用户名和密码的情况下访问图像服务器的图片。测试

OAuth 1.0


角色

  • user:用户,资源所有者。
  • Service Provider:服务提供者。
  • Consumer:服务消费者,客户端。

协议流程

1.0协议流程.png

(A) Consumer向Service Provider申请Request Token。
(B) Service Provider验证Consumer身份后,返回一个未授权的Request Token。
(C) Consumer将用户导向Service Provider。
(D) Service Provider让用户授权。
(E) 用户授权后,Service Provider向Consumer返回已授权的Request Token。
(F) Consumer向Service Provider申请Access Token。
(G) Service Provider验证Access Token和Consumer身份后,向Consumer发布Access Token。

上述流程的请求和响应参数如下:

  1. 申请request token,对应步骤(A):
oauth_consumer_key
oauth_signature_method
oauth_signature
oauth_timestamp
oauth_nonce
oauth_version
oauth_callback
  1. Service Provider返回未授权的Request Token
oauth_token
oauth_token_secret
oauth_callback_confirmed
  1. Consuemer将用户导向Service Provider
oauth_token
  1. Service Provider在用户授权后重定向到Consumer,并返回已授权的request token
oauth_token
oauth_verifier
  1. Consumer使用request token向Service Provider申请access token
oauth_consumer_key
oauth_token
oauth_signature_method
oauth_signature
oauth_timestamp
oauth_nonce
oauth_version
oauth_verifier
  1. Service Provider验证request token后,返回access token给Consumer
oauth_token
oauth_token_secret

Nonce and Timestamp

oauth_nonce,它是用来防止重放攻击的,Service Provider应该验证唯一性,不过保存所有的oauth_nonce并不现实,所以一般只保存一段时间(比如最近一小时)内的数据。

如果不验证oauth_timestamp,那么一旦攻击者拦截到某个请求后,只要等到限定时间到了,oauth_nonce再次生效后就可以把请求原样重发,签名自然也能通过,完全是一个合法请求,所以说Service Provider必须验证oauth_timestamp和系统时钟的偏差是否在可接受范围内(比如十分钟),如此才能彻底杜绝重放攻击。

OAuth 2.0


角色

  • resource owner:用户,资源所有者。
  • resource server:资源服务器。
  • client:客户端,想访问用户保存在资源服务器的资源。
  • authorization server:授权服务器,在得到用户授权后,向客户端发布访问令牌。资源服务器和授权服务器可以在同一台服务器上。
  • user-agent:用户代理,指浏览器或app客户端。

协议流程


(A) 客户端向用户请求授权。
(B) 客户端收到一个authorization grant,表示客户端已经被授权。
(C) 客户端使用authorization grant,向授权服务器申请access token
(D) 授权服务器认证客户端身份以及authorization grant后,向客户端发布access token
(E) 客户端使用access token向资源服务器申请受保护的资源。
(F) 资源服务器验证access token。如果有效,发送请求的资源。

Authorization Grant

Authorization Grant是客户端已经获得资源所有者授权的凭证。客户端使用authorization grant向授权服务器换取access token。OAuth 2.0提供了四种authorization grant:Authorization CodeImplicitResource Owner Password CredentialsClient Credentials

Authorization Code

本文主要讲Authorization Code,它是OAuth 2.0推荐使用的方式,其具体实现流程如下:



(A) 客户端将用户导向授权服务器。
(B) 授权服务器认证资源所有者(通过user-agent),并让用户决定是否对客户端授权。
(C) 如果用户同意授权,授权服务器重定向user-agent回到客户端,并返回一个authorization code和state。
(D) 客户端使用authorization code向授权服务器申请access token。授权服务器验证code和客户端身份。
(E) 授权服务器验证code和客户端身份,通过后,将会返回access token和一个可选的refresh token。

上述过程的请求和响应参数说明:

  1. 授权请求,对应(A)

    • respondse_type:响应类型,填code,必填。
    • client_id:客户端标识,必填。
    • redirect_id:重定向URI,选填。
    • scope:授权项,选填。
    • state:用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验。
  2. 授权响应,对应(B)

    • code:用于换取access token,必填。
    • state:第三方程序发送时用来标识其请求的唯一性的标志。
  3. access token请求,对应(D)

    • grant_type:填"authorization_code",必填。
    • code:用于换取access token,必填。
    • redirect_uri:与(A)步骤的值一致。
    • client_id:客户端唯一标识符。
  4. access token响应,对应(E)

    • access_token:访问令牌,用于访问受保护的资源,必填。
    • refresh_token:用于更新access_token,选填。
    • expires_in: 令牌有效期,必填。
    • token_type:令牌类型,必填。

注意:
为什么要分两步授权,一步行不行,即客户端一次将所有信息发给授权服务器,且授权服务器得到用户授权后直接向客户端发布access token?
不行,因为向用户申请授权的时候,是经过user-agent。只有一步的话,user-agent也会拿到access token。

刷新access token

access token是有时效性的,当access token失效或过期后,客户端可以使用refresh token向授权服务器申请新的access token。
请求参数:

  • grant_type:填"refresh_token",必填。
  • refresh_token:用于申请access_token,必填。
  • scope:授权范围,选填。

响应参数:和(E)相同。

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

推荐阅读更多精彩内容