大话Oauth2.0(一)从概念到实践

Oauth2.0本身:

Oauth2.0是一种授权协议,当然也归属为安全协议的范畴,在实际执行的时候就是保护互联网中不断增长的大量WEB API的安全访问。OAuth2.0共包含四种角色,分别是资源所有者、第三方应用(也称为客户端client)、授权服务器和资源服务器。如下图所示,某公司A开发了一个微信小程序(第三方应用)可以帮助我(资源所有者)美化微信服务器(资源服务器)上面的头像,我在用这个微信小程序开发的美化头像功能的时候,首先要给微信小程序授权(授权服务器),这个微信小程序才能访问我的头像,实际上访问的时候微信小程序就是通过WEB API来调用的。授权的过程中我是不可能把我的账号密码给它的,这样的前提下就会有另外方式的授权,也就是上面介绍的现在国际通用的标准OAuth2.0。

image

OAuth2.0协议流程描述了四种角色之间的交互过程,如下图所示。

image

上面的序列图一共分为以下6个步骤:

(1)第三方应用请求资源所有者授权。

(2)资源所有者同意给第三方应用授权。

(3)第三方应用使用步骤2中获得的授权,向授权服务器申请令牌。

(4)授权服务器对第三方应用进行认证并确认无误后,同意发放令牌。

(5)第三方应用使用步骤4中发放的令牌向资源服务器申请获取资源。

(6)资源服务器确认令牌无误后,向第三方应用开放资源访问。

关于更详细的Oauth2.0流程介绍,也可以参考《架构修炼之道》第2章 "开放之道" 内容。

第三方开发者ISV的实践:

如果按照开发语言类型来区分可以有JAVA、.net、PHP等不同的ISV应用类型,但语言分类对于授权的场景意义不大,因为虽然是不同的语言但大家都是遵守Oauth2.0协议。在授权上区分ISV接入流程我们则需要按照ISV应用有无Web Server来区分。有Web Server的归为一类,走Server-side flow;没有Web Serve的归为另外一类,走Client-side flow流程。

本文先介绍Server-side flow流程,共包含3个步骤。

步骤一:****拼接授权URL

以京东宙斯开放平台为例

https://open-oauth.jd.com/oauth2/to_login?app_key=XXXXX&response_type=code&redirect_uri=XXXXX

有三个必填参数,分别是app_key,response_type,redirect_uri,下面是该三个参数的具体含义。

名称 是否必填 参数值
app_key ISV在宙斯开放平台创建应用的时候由系统分配
response_type 固定值code,默认采用code换取token的方式
redirect_uri ISV的应用访问地址,创建应用的时候由ISV配置

PS:左右滑动查看完整列表

注:如果是通过开放平台直接使用,ISV可以不用拼接该授权URL,会由开放平台一方的系统自动读取ISV的应用地址然后拼接好返回给客户端,后文在平台一方的实践介绍中有叙述。

步骤二:****引导用户登录授权

引导用户登录,并为ISV应用进行授权。

步骤三:****获取CODE

在用户登录并点击授权之后宙斯会将授权码CODE返回到回调地址上,比如https://redirect_uri?code=CODE&...

ISV获取到CODE之后就可以执行步骤四。

步骤四:****用CODE换取ACCESSTOKEN

https://open-oauth.jd.com/oauth2/access_token?app_key=XXXXX&app_secret=XXXXX&grant_type=authorization_code&code=XXXXX,这里的code是通过步骤三获取到的。

名称 是否必填 参数值
app_key ISV在宙斯开放平台创建应用的时候由系统分配
app_secret 宙斯开放平台分配给当前app_key对应的应用的秘钥
grant_type 固定为authorization_code
code 步骤三中获取到的值

返回值示例:

{

access_token: "a3207b6b5ad04249ad1dbf6a98248bea",//所需要的access_token

expires_in: 3600000,//单位ms,该access_token的过期时间

refresh_token: "4ecbbab0e9e443159c518da1d10741ad"//再不需要用户重新授权的情况下,用于获取新的access_token

}

access_token是有有效期的,这一点是从安全角度来考虑的,因为如果access_token没有时效性,一旦泄露则会被攻击者长期使用。好比我们的个人密码需要定期修改一样。比如笔者跟公司签订了五年期的合同,在这个五年时间内公司要求我们的内部ERP系统的密码需要三个月更新一次,这样避免了密码一旦泄露造成了长期的安全风险。在订购类型的第三方IT工具类应用中access_token是用户授权之后ISV的应用才能获取到的,比如用户购买了该ISV的一款SASS软件为期6个月。如果这6个月时间内出于安全考虑需要更新access_token的值,肯定不能让用户再授权一次,这样体验非常不友好。此时refresh_token就派上了用场,ISV可以利用refresh_token去请求开放平台获取新的access_token的值。

当用户授权ISV之后会获取到一个accestoken,对于ISV来讲accestoken相当于登录成功了ISV软件之后的PIN。此时ISV需要将这个用户的accestoken会话保存下来,可以加密存储到cookie中,也可以放到ISV软件服务端的session中。ISV软件后续访问平台的接口要求必须都要有该accestoken,这样会话状态被保存下来之后则会使得ISV应用调用平台接口更加的便利,实际上相当于用户登录了一个普通的WEB应用之后,每次这个WEB应用服务端程序都能获取到该用户的会话信息一样。

平台一方的实践:

我作为一个用户需要授权给我当前将要使用的软件服务商,这样软件服务商才可以被允许去访问我的数据。理论上我是需要每次都进行授权动作才能完成软件的使用,那么我们平时会发现比如在微信中使用第三方小程序的时候我只在第一次访问的时候进行了授权动作,以后使用的时候并没有要求我再次进行授权,这是如何实现的呢。再比如下图所示,在用户点击立即使用的时候也会遇到同样的场景:初次使用和再次使用。

image

这就需要作为平台一方来实现控制逻辑,同时这个也建立在用户在平台使用的基础之上。平台一方在第一次用户授权之后会按照Oauth2.0的规范生成一个accesstoken,随后将该accesstoken与当前用户的pin进行绑定存储到数据库中,如下图所示。当然该授权关系是有时效的(这个时效需要依据平台的实际环境来确定)。当用户再次来通过平台去访问该软件的时候,平台会根据当前登录的用户pin去判断先前已经保存的绑定关系,如果有绑定关系则允许用户直接使用软件,在返回的startUrl中是一个带有code的ISV软件的启动地址,如果没有绑定关系则会直接利用第三方开发者已经接入的规范的Oauth2.0协议流程,返回的startUrl中是一个授权的页面地址,由第三方开发者去引导用户进行授权。

image

总结

本文先后从概念到开发者实践以及平台一方的实践去介绍了Oauth2.0。它是一个基于HTTP的协议,如果采用授权码类型比如本文中所述的Server-side flow则要求必须有Web Server,我们也正是按照该流程去介绍如何实践的。

想了解Oauth2.0的同学请持续关注,未完待续... 文章第一时间发布在公众号

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

推荐阅读更多精彩内容