前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >理解OAuth 2.0

理解OAuth 2.0

作者头像
用户1212940
发布于 2022-05-11 10:17:15
发布于 2022-05-11 10:17:15
80500
代码可运行
举报
文章被收录于专栏:LambdaLambda
运行总次数:0
代码可运行

一、什么是Oauth2

Oauth是一个关于授权(authentication)的开发网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用。Oauth2.0是Oauth协议的延续版本,但不向后兼容Oauth1.0,即完全废止了Oauth1.0。

二、应用场景

  • 第三方应用授权登录: 在app或网页接入一些第三方应用时,时常会需要用户登录另一个合作平台,比如QQ、微信、微博的授权登录。
  • 前后端分离单页面应用(spa):前后端分离框架,前端请求后台数据,需要进行Oauth2安全认证,比如使用vue、react后台h5开发的app。

三、名称定义

  • Third-party application:第三方应用程序,本文中又称 "client" ,比如打开知乎,使用第三方登录,选择qq登录,这时候知乎就是客户端。
  • HTTP service:HTTP服务提供商,本文中简称 "服务提供商" ,即上例的qq。
  • Resource Owner:资源所有者,本文中又称"用户"(user),即登录用户。
  • User Agent:用户代理,本文中就是指浏览器。
  • Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。
  • Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

四、运行流程

  1. 用户打开客户端以后,客户端要求用户给予授权。
  2. 用户同意给予客户端授权。
  3. 客户端使用上一步获取的授权,向认证服务器申请令牌。
  4. 认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
  5. 客户端使用令牌,向资源服务器申请获取资源。
  6. 资源服务器确认令牌无误,同意向客户端开发资源。

上面六步中,第二步是关键,即用户怎样才能给予客户端授权。有了这个授权之后,客户端就可以获取令牌,进而凭令牌获取资源。

下面我们讲解下客户端获取授权的四种模式。

五、客户端的授权模式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。Oauth2.0定义了四种授权方式:

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

5.1 授权码模式(authorization code)

该模式是功能最完整、流程最严密的授权模式,它的特点就是通过客户端的后台服务器,与 "服务提供商" 的认证服务器进行互动。

步骤如下: (A)用户访问客户端,后者将前者导向认证服务器。(单击QQ登录)

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

(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的 "重定向URI" (redirecton URI),同时附上一个授权码。

(D)客户端授权授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一个是在客户端的后台服务器上完成,用户不可见。

(E)认证服务器核对了授权码和重定向URI,确定无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

下面是上面这些步骤所需要的参数: A步骤中,客户端申请认证的URI,包含以下参数:

  • 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

C步骤中,服务器回应客户端的URI,包含以下参数:

  • code:表示授权码,必选项。该码的有效期应该很短,通常设为 10 分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样的包含这个参数。

下面是一个例子:

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

D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:

  • grant_type:表示使用的授权模式,必选项,此处的值固定为:authorization_code
  • code:表示上一步获取的授权码,必选项
  • redirect_uri:表示重定向URI,必选项,且必须与A步骤的该参数值保持一致。
  • 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步骤中,认证服务器发送的HTTP回复,包含以下参数:

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

下面是一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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"
 }

从上面代码可以看到,相关参数使用JSON格式发送(Content-Type: application/json)。此外,HTTP头信息中明确指定不得缓存。

5.2 简化模式

简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了 "授权码" 这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

(A)客户端将用户导向认证服务器。

(B)用户决定是否给于客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。

(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。

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

(F)浏览器执行上一步获得的脚本,提取出令牌。

(G)浏览器将令牌发给客户端。 下面是上面这些步骤所需要的参数。

A步骤中,客户端发出的HTTP请求,包含以下参数:

  • 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

C步骤中,认证服务器回应客户端的URI,包含以下参数:

  • 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

在上面的例子中,认证服务器用HTTP头信息的Location栏,指定浏览器重定向的网址。注意,在这个网址的Hash部分包含了令牌。

根据上面的D步骤,下一步浏览器会访问Location指定的网址,但是Hash部分不会发送。接下来的E步骤,服务提供商的资源服务器发送过来的代码,会提取出Hash中的令牌。

5.3 密码模式

密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向 "服务提供商" 索要授权。

这种模式中,用户必须把自己的密码给客户端,但是客户端不得存储密码。这通常在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法使用情况下,才能考虑使用这种模式。

它的步骤如下:

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

(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。

(C)认证服务器确认无误后,向客户端提供访问令牌。

B步骤中,客户端发出的HTTP请求,包含以下参数:

  • 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步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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"
 }

整个过程中,客户端不得保存用户的密码。

5.4 客户端模式

客户端模式(Client Crendentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商" 进行认证。严格的说,客户端模式并不属于 OAuth框架所要解决的问题。这种模式中,用户直接向客户端注册,客户端已自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

它的步骤如下: (A)客户端向认证服务器进行身份认证,并要求一个访问令牌。

(B)认证服务器确认无误后,向客户端提供访问令牌。

A步骤中,客户端发出的HTTP请求,包含以下参数:

  • granttype:表示授权类型,此处的值固定为:clientcredentials,必选项。
  • 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步骤中,认证服务器向客户端发送访问令牌,下面是一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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,
 "example_parameter":"example_value"
 }

六、更新令牌

如果用户访问的时候,客户端的 "访问令牌" 已经过期,则需要使用 "更新令牌" 申请一个新的访问令牌。

客户端发出更新令牌的HTTP请求,包含以下参数:

  • granttype:表示使用的授权模式,此处的值固定为:refreshtoken,必选项
  • 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

到这里我们已经对OAuth2.0有个一个初步的认知,并且对它提供的授权模式有了一定的了解,接下来我们将使用 SprintSecurity提供的OAuth的具体实现做进一步讲解。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
计算机编程领域最伟大的20个发明
小伙伴们这个咱们应该知道。 1 第一台计算机:“差分机”(1821年) “差分机”是1821年由英国政府委托科学家巴贝奇设计而成的,这台机器能提高乘法速度和改进对数表等数字表的精确度。但由于其过高的设
老九君
2018/03/01
1.9K0
计算机编程领域最伟大的20个发明
计算机基础理论
**计算机发展史,是介绍计算机发展的历史。计算机发展历史可分为1854年-1890年、1890年-20世纪早期、20世纪中期、20世纪晚期-现在,四个阶段。
HammerZe
2022/05/09
3260
计算机基础理论
现在有多少人在学习计算机编程?学习只为当码农吗?
事实上很多人不太了解编程这个行业,要么一股脑往前冲,要么就是一无所知,而那些一知半解的人往往也都走向了一无所知这条路。计算机编程对于现代社会发展的重要性已经不言而喻了。现代生产更多需要自动化,不仅能够代替人类更多重复性劳动,而且使得工艺质量也得到质的飞跃。实际上计算机编程已经成为人们生产生活中不可缺少的重要核心工具。
刘金玉编程
2020/03/11
4420
计算机发展史
大家好,今天我们要聊的不是魔法,也不是外星科技,而是你每天都在用的——计算机。它是你打游戏、刷社交媒体,甚至在你老婆叫你修电脑时充当“拯救者”的神奇工具。你可能觉得计算机就是个“黑盒子”,但实际上,它的历史是一部“计算机界的励志大片”,从零开始,打破常规,最终蜕变成了你口袋里的高科技小伙伴。好啦,准备好了吗?让我们穿越时空,看看这个“电子怪兽”是怎么一步步成长的。
找Bug
2025/01/19
1210
计算机发展史
给计算机专业大一新生的一些学习规划建议
(零) 每个时代都会悄悄犒赏努力学习的人。 没有人生来就是主角,所有主角都是从龙套开始,一步一步脚印,把自己的路走出万丈光芒。 不少人在高中时候,尤其是高三的时候,会听老师说:高中是最辛苦的,辛苦了这阵,等考上了大学,想怎么玩就怎么玩! 这只是善意的谎言,不要当真。 假如你考上的是重点院校,你会发现很多人都在奋发学习,在这种氛围下你需要努力学习,才不会落后于你身边的同学。 假如你考上很普通的学校,会发现确实有很多人在玩。因为学校本来就普通,你更需要努力学习。 有些大一新生刚开始,可能在学习上会感到很不习
海天一树
2018/04/17
2.1K0
给计算机专业大一新生的一些学习规划建议
【计算机组成原理】详谈计算机发展历程
从今天开始,我们将开始学习一门新的课程——计算机组成原理(Computer Organization, CO)。
蒙奇D索隆
2024/09/07
2820
【计算机组成原理】详谈计算机发展历程
夜深了才敢说这 3.8 个关于程序媛的小秘密
这是哈佛大学天文学家皮克林发出的招聘,当时 Computer 专指从事复杂的数学计算工作的人。
HyperAI超神经
2019/12/01
4300
计算机基础(1)——计算机体系结构和组成
我们从计算机系统篇章开始学习计算机的基础知识,了解计算机中相关软件和硬件的名称,掌握计算机基本的运行与组成原理,让我们对计算机有一个比较清晰的基本认识与概念。
绿水长流z
2025/01/03
2880
计算机基础(1)——计算机体系结构和组成
5 位改变世界的女性程序员
就纯粹的数字而言,这确是真的。美国劳工统计局的数据显示,73% 的美国计算机科学工作者是男性,只有 27% 是女性程序员。一般来说在整个计算机编程技术领域,女性的代表性确实不足。
肉眼品世界
2022/04/19
6170
5 位改变世界的女性程序员
计算机编程基础
编程:就是计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。
梨涡浅笑
2020/10/27
6200
计算机编程语言
计算机编程语言是程序设计的重要工具,在计算机中存储与处理及执行,具有特定的语法结构。计算机编程语言也是人机之间通信的桥梁。
用户10352932
2023/07/08
2360
他们都因为互联网创业暴富了!你知道哪些大佬们利用计算机编程创业吗?
21世纪是计算机科学技术鼎盛发展的时代。曾经听说过多少人一夜之间,因为做了某一个跟计算机有关的事情,而一夜暴富。尤其是在app刚刚盛行的时代。只要是投入到app的开发的所有的人都富起来了。当然更多的人是把握不住这个机会的,能把握住这样子机会的人是非常少有的当然也是要非常有实力的人。由此可见,掌握计算机编程技术的人们更容易获得这一种一夜暴富的机会。当然对于今天来说已经有太多的人掌握了,这一类技术。因此,一旦多了之后就不会显得那么的珍贵,相应的技术产品价值当然也是一落千丈。
刘金玉编程
2019/08/05
6450
1.计算机发展阶段 计算机发展历史 机械式计算机 机电式计算机 电子计算机 逻辑电路与计算机 二极管 电子管 晶体管 硅 门电路 计算机 电磁学计算机二进制
再后来有了一些数学理论的发展,纳皮尔棒/计算尺则是借助了一定的数学理论,可以理解为是一种查表计算法.
noteless
2018/09/11
2.5K0
1.计算机发展阶段  计算机发展历史      机械式计算机 机电式计算机 电子计算机 逻辑电路与计算机  二极管 电子管 晶体管  硅 门电路 计算机 电磁学计算机二进制
附录A 计算机的0和1 1.0 一切皆是映射ABPLTZ1.1 二进制01与易经阴阳1.2 向上抽象封装一层1.3 编程之初:从机械计算机到能接受指令的计算机小结参考资料
计算机领域中的所有问题,都可以通过向上一层进行抽象封装来解决.这里的封装的本质概念,其实就是”映射“。
一个会写诗的程序员
2018/08/20
8130
附录A 计算机的0和1 1.0 一切皆是映射ABPLTZ1.1 二进制01与易经阴阳1.2 向上抽象封装一层1.3 编程之初:从机械计算机到能接受指令的计算机小结参考资料
创客是什么?你了解创客吗?你在使用计算机编程做创新吗?
随着我国科教兴国战略的逐渐深入,我们越来越重视科学技术,因为科学技术是第一生产力!然而,想要有更好的科技必须要有更好的教育。因此,教育是科技的先驱力量,只有重视教育才能拥有科技人才。
刘金玉编程
2019/08/05
3K0
编程语言简史《一》
在19世纪英国,诗人拜伦的女儿阿达·洛夫莱斯,在1842至1843年间,投入了9个月的时间,翻译了意大利数学家路易吉·米那比亚关于查尔斯·巴贝奇最新计算机设计 — 分析机的备忘录。
通往ICT之路
2024/05/10
2280
编程语言简史《一》
比尔盖茨/UNIX之父/Donald Knuth/Dijkstra等全球IT大师的编程名言
如果建筑工人盖房子的方式跟程序员写程序一样,那第一只飞来的啄木鸟就将毁掉人类文明。
一个会写诗的程序员
2020/05/08
1K0
1.1_计算机发展历程
计算机系统 = 硬件 + 软件两大部分组成,硬件(计算机的实体),包括:主机、外设(鼠标、键盘、显示器)。软件就是我们看得见但是摸不着的,操作系统就是软件,微信、微博也是软件。
用户11290648
2025/01/13
1490
1.1_计算机发展历程
第01步《番外篇》第1章认识计算机世界第1课~第4课
新人一半的问题都是因为粗心大意所致,遇到问题时不妨先认真自检一下,或者使用谷歌搜索一下,大部分问题谷歌都能给出建议或线索。
LIYI
2023/02/14
2770
计算机的发明,离不开这些数学家的奠基(6k字)
科学Sciences导读:公号对话框发送“计算机数学家”获取6k字11图6页PDF计算机的发明,离不开这些数学家的奠基。关键词:计算机(computer),数学家(mathematician)。QinlongGEcai微信被封,转向自用、科普文章、学术论文OAJ电子刊免费开放获取。
秦陇纪
2020/11/05
1.6K0
计算机的发明,离不开这些数学家的奠基(6k字)
推荐阅读
相关推荐
计算机编程领域最伟大的20个发明
更多 >
LV.0
宁波市职业技术教育中心学校教师
目录
  • 一、什么是Oauth2
  • 二、应用场景
  • 三、名称定义
  • 四、运行流程
  • 五、客户端的授权模式
    • 5.1 授权码模式(authorization code)
    • 5.2 简化模式
    • 5.3 密码模式
    • 5.4 客户端模式
  • 六、更新令牌
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档