【OAuth2】用户授权第三方应用,流程详解及模式

目录

一、讲述

1. 是什么

2. 工作流程

3. OAuth2的好处

二、协议流程

1. 应用场景

2. 实例

3. 安全体现

4. 角色

5. 认证流程

三、授权模式

1. 授权码模式

2. 简化(隐式)模式

3. 密码模式

4. 客户端模式

每篇一获


一、讲述

1. 是什么

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。OAuth通过提供一个授权令牌而不是用户名和密码来访问他们存储在服务提供者的数据。

OAuth的核心是它的授权框架,允许基于代表资源所有者进行授权的访问控制。在OAuth术语中,资源所有者通常是指用户,而第三方应用则被称为客户端(Client),用户的数据被保存在服务提供者(Service Provider)处。

OAuth 1.0和OAuth 2.0是最常见的版本,它们在协议流程和安全性方面有所不同。OAuth 2.0是最新的版本,它提供了更多的灵活性和更强的安全性。

2. 工作流程

OAuth 2.0的工作流程通常包括以下几个步骤:

  1. 注册应用:在想要访问用户数据的服务提供者上注册你的应用。注册成功后,你会获得一个客户端ID和一个客户端密钥,这些是你的应用与服务提供者通信的凭证。

  2. 获得授权:当用户使用你的应用并同意授权时,你的应用会将用户重定向到服务提供者的授权页面。用户登录他们的账户并同意授权后,服务提供者会发放一个授权码给客户端。

  3. 交换令牌:客户端(应用)使用上一步获得的授权码,向服务提供者的令牌端点发送请求以交换访问令牌。在这一步中,客户端需要验证其身份,通常是通过提供客户端ID和客户端密钥来完成。

  4. 访问资源:客户端(应用)使用访问令牌向服务提供者请求用户的资源。服务提供者验证访问令牌的有效性,如果验证成功,服务提供者将向客户端提供请求的资源。

3. OAuth2的好处

在项目开发中,使用**OAuth2**主要有以下几个原因:

1. **安全性**:OAuth2提供了一种安全的方式来授权第三方应用访问用户的资源,而无需用户将用户名和密码直接提供给第三方应用。这大大降低了用户信息被泄露的风险。

2. **简便性**:用户只需要在一个地方(通常是一个中心化的身份提供者)进行身份验证,就可以访问所有支持OAuth2的应用,无需为每个应用单独注册和登录。

3. **灵活性**:OAuth2支持多种授权模式,可以满足不同类型的应用和场景的需求。例如,对于Web应用,可以使用授权码模式;对于移动应用,可以使用隐式授权模式;对于后台服务,可以使用客户端凭证模式。

4. **标准化**:OAuth2是一个开放的标准,被广泛接受和使用。使用OAuth2可以使应用更容易集成到其他系统中,提高开发效率。

因此,使用OAuth2可以帮助我们在保证安全性的同时,提高用户体验和开发效率。

二、协议流程

1. 应用场景

**OAuth2.0**是一个授权框架,它允许第三方应用在用户的许可下访问其私有资源。以下是一些OAuth2.0的应用场景:

1.  **Web应用授权**:这是最常见的OAuth2.0应用场景。在这种情况下,用户通过浏览器访问一个Web应用,该应用需要访问用户在另一个服务上的资源(例如,访问用户在Google Drive上的文件)。Web应用通过OAuth2.0获取用户的授权,然后使用该授权访问用户的资源。

2.  **移动应用授权**:在这种情况下,用户在移动设备上使用一个应用,该应用需要访问用户在另一个服务上的资源(例如,访问用户在Facebook上的朋友列表)。移动应用通过OAuth2.0获取用户的授权,然后使用该授权访问用户的资源。

3.  **后台服务授权**:在这种情况下,一个后台服务需要访问另一个服务上的资源,但没有用户直接参与。例如,一个服务器可能需要访问Google Cloud Storage上的数据。在这种情况下,后台服务可以使用OAuth2.0的客户端凭证模式获取授权。

4.  **设备授权**:在这种情况下,一个设备(例如,智能电视或游戏控制台)需要访问用户在另一个服务上的资源。因为设备可能没有方便的方式让用户输入用户名和密码,所以可以使用OAuth2.0的设备授权流程获取用户的授权。

2. 实例

  • 原生app授权:app登录请求后台接口,为了安全认证,所有请求都带token信息,如果登录验证、 请求后台数据。

  • 前后端分离单页面应用:前后端分离框架,前端请求后台数据,需要进行oauth2安全认证

  • 第三方应用授权登录,比如QQ,微博,微信的授权登录。(本系列课程应用场景讲解)

步骤解读:

第1步:浏览器打开Gitee码云,点击微信方式授权登录,重定向到微信授权服务页面等待获取授权码;

第2步:用户打开手机登录微信扫描“二维码”,点击“允许”授权,将重定向到客户端(Gitee)应用提供的URI;

第3步:客户端(Gitee)使用上一步获取的授权码,向微信授权服务器申请令牌(Token);

第4步:微信授权服务器对客户端(Gitee)进行认证以后,确认无误,同意发放令牌;

第5步:客户端使用令牌向资源服务器(微信)申请获取资源;

第6步:资源服务器(微信)确认令牌无误后,同意向客户端开放资源;

3. 安全体现

在项目开发中,**OAuth2**的安全性主要体现在以下几个方面:

1. **用户凭证保护**:OAuth2允许用户授权第三方应用访问其资源,而无需将用户名和密码直接提供给第三方应用。这意味着用户的登录凭证不会被泄露给可能存在安全风险的第三方。

2. **访问令牌**:OAuth2使用访问令牌(Access Token)来代表用户的授权。这些令牌是短期的,并且可以被撤销,这意味着即使令牌被盗,攻击者也只能在有限的时间内访问用户的资源。

3. **权限限制**:OAuth2允许用户选择授权第三方应用访问其资源的范围。例如,用户可以选择只授权应用访问其公开的个人信息,而不授权访问其私人信息。

4. **刷新令牌**:对于需要长期访问用户资源的应用,OAuth2提供了刷新令牌(Refresh Token)。刷新令牌可以用来获取新的访问令牌,而无需用户重新授权。这意味着即使访问令牌被盗,攻击者也无法获取刷新令牌,从而无法长期访问用户的资源。

5. **安全传输**:OAuth2要求所有的通信都必须通过安全的HTTPS协议进行,以防止令牌在传输过程中被窃取。

4. 角色

OAuth2.0协议中,主要定义了以下几种角色:

  1. 资源所有者(Resource Owner):通常是指用户,他们拥有可以通过OAuth2.0访问的资源。资源所有者可以授权客户端访问他们在资源服务器上的受保护资源。

  2. 客户端(Client):通常是指第三方应用,它代表资源所有者向资源服务器请求访问受保护资源的权限。客户端需要得到资源所有者的授权,并通过授权服务器获取访问令牌。

  3. 授权服务器(Authorization Server):它负责验证资源所有者的身份,并向客户端发放访问令牌。授权服务器是OAuth2.0协议中的关键角色,它保证了资源的安全访问。

  4. 资源服务器(Resource Server):它托管资源所有者的受保护资源。资源服务器可以接受和响应来自客户端的受保护资源请求,但前提是客户端必须拥有有效的访问令牌。

  5. 用户代理(User Agent):在OAuth2.0中,用户代理通常指的是用户使用的浏览器或其他类型的客户端软件。用户代理在OAuth2.0的授权流程中起到了重要的作用。

  6. 第三方应用(Third-Party Application):在OAuth2.0中,第三方应用通常被视为客户端(Client)。这是一个外部应用,它希望获取对资源所有者(通常是用户)在资源服务器上的受保护资源的访问权限。为了实现这一点,第三方应用需要通过授权服务器获取资源所有者的授权,并获得一个访问令牌。然后,第三方应用可以使用这个访问令牌向资源服务器请求访问受保护的资源。

这些角色共同构成了OAuth2.0的授权框架,使得用户可以安全、有效地将他们的资源授权给第三方应用访问。

5. 认证流程

(A)用户打开客户端以后,客户端要求用户给予授权。

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

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

三、授权模式

OAuth的优势在于它提供了一种安全的授权方式,而不需要用户分享他们的登录凭据,减少了用户凭据被第三方应用滥用的风险。同时,用户可以更精细地控制第三方应用对其私有资源的访问权限,并且可以随时撤销这些权限。

1. 授权码模式

(Authorization Code Grant):适用于有自己服务器的应用,可以安全存储客户端密钥。

**授权码模式(Authorization Code Grant)**是OAuth2.0中最常用的授权模式,主要适用于服务器端的Web应用。

适用场景:当第三方应用需要访问用户在资源服务器上的受保护资源时,可以使用授权码模式。这种模式特别适用于那些可以安全地存储客户端密钥和访问令牌的服务器端Web应用。

主要流程

  1. 用户访问第三方应用,第三方应用引导用户到授权服务器进行登录。

  2. 用户在授权服务器上登录并授权第三方应用访问其资源。

  3. 授权服务器将用户重定向回第三方应用,并在重定向的URL中附带一个授权码。

  4. 第三方应用从重定向的URL中获取授权码,并使用授权码和其客户端密钥向授权服务器请求访问令牌。

  5. 授权服务器验证授权码和客户端密钥,如果验证成功,则向第三方应用发放访问令牌。

  6. 第三方应用使用访问令牌向资源服务器请求访问用户的资源。

这种模式的优点是,访问令牌永远不会直接暴露给用户代理(例如浏览器),而是安全地存储在服务器端。这大大降低了访问令牌被盗用的风险。

2. 简化(隐式)模式

(Implicit Grant):适用于无法安全存储客户端密钥的客户端,如基于浏览器或移动应用的客户端。

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

这种方式把令牌直接传给前端,是很不安全的。因此,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。  

适用场景:当第三方应用无法安全地存储客户端密钥和访问令牌时,可以使用简化模式。这种模式特别适用于运行在浏览器中的客户端应用,因为这些应用无法安全地存储敏感信息。

主要流程

  1. 用户访问第三方应用,第三方应用引导用户到授权服务器进行登录。

  2. 用户在授权服务器上登录并授权第三方应用访问其资源。

  3. 授权服务器将用户重定向回第三方应用,并在重定向的URL的片段部分(#后面的部分)中附带一个访问令牌。

  4. 第三方应用从重定向的URL的片段部分中获取访问令牌,并使用该令牌访问用户的资源。

请注意,由于访问令牌直接暴露给用户代理(浏览器),所以简化模式的安全性较低。因此,现在更推荐使用授权码模式配合PKCE(Proof Key for Code Exchange)来保护前端应用。

3. 密码模式

(Resource Owner Password Credentials Grant):适用于用户对客户端高度信任的情况,用户将直接在客户端输入用户名和密码。

如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)。

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

适用场景:当用户对第三方应用有高度的信任,例如该应用是由服务提供商自己开发的,用户可以直接将用户名和密码提供给这个应用,然后应用可以使用这些凭证获取访问令牌。

主要流程

  1. 用户提供用户名和密码给第三方应用。

  2. 第三方应用使用这些凭证向授权服务器请求访问令牌。

  3. 授权服务器验证这些凭证,如果验证成功,就向第三方应用发放访问令牌。

  4. 第三方应用使用访问令牌访问用户在资源服务器上的受保护资源。

需要注意的是,由于这种模式涉及到用户直接将用户名和密码提供给第三方应用,因此存在一定的安全风险,只有在用户对第三方应用有高度信任的情况下才适用。

4. 客户端模式

(Client Credentials Grant):适用于客户端直接访问它自己在服务提供者上的资源,而不是代表用户。

适用于没有前端的命令行应用,即在命令行下请求令牌。一般用来提供给我们完全信任的服务器端服务。

适用场景:当一个应用需要访问另一个应用的受保护资源,而不涉及任何用户交互时,可以使用客户端模式。例如,一个后台服务可能需要访问另一个后台服务的API。

主要流程

  1. 客户端应用使用其自己的凭证(客户端ID和客户端密钥)向授权服务器请求访问令牌。

  2. 授权服务器验证这些凭证,如果验证成功,就向客户端应用发放访问令牌。

  3. 客户端应用使用访问令牌访问另一个应用的受保护资源。

每篇一获

学习OAuth2.0可以带来以下几个方面的收获:

1. **提高安全性**:OAuth2.0是一种安全的授权协议,它可以保护用户的敏感信息,如密码和访问令牌,不被直接暴露给第三方应用。这对于提高应用的安全性非常重要。

2. **简化开发**:OAuth2.0提供了一种标准的方式来处理授权和身份验证。这意味着开发者不需要从头开始开发这些功能,可以直接使用现有的库和服务。

3. **提高用户体验**:通过OAuth2.0,用户可以使用他们已经拥有的账户(如Google或Facebook账户)来登录第三方应用,而无需创建新的账户。这可以大大提高用户的体验。

4. **促进互操作性**:OAuth2.0是一个开放的标准,被广泛应用于各种应用和服务中。通过使用OAuth2.0,您的应用可以更容易地与其他应用和服务进行集成。

5. **提高开发效率**:理解OAuth2.0的工作原理可以帮助开发者更有效地使用这个协议,从而提高开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

蓝桥杯备赛 day 1 —— 递归 、递归、枚举算法(C/C++,零基础,配图)

目录 🌈前言 📁 枚举的概念 📁递归的概念 例题: 1. 递归实现指数型枚举 2. 递归实现排列型枚举 3. 递归实现组合型枚举 📁 递推的概念 例题: 斐波那契数列 📁习题 1. 带分数 2. 反硬币 3. 费解的…

手把手教你安装Kali Linux

Kali Linux操作系统 Kali Linux,一种基于Debian的Linux发行版,是用于渗透测试和网络安全领域的专业工具。它包含了大量的安全测试工具和漏洞扫描器,用于评估网络的安全性和防御能力。Kali Linux有一个友好的界面和易于使用的工具&#xff0c…

数字调制学习总结

调制:将基带的信号的频谱搬移到指定的信道通带内的过程。 解调:把指定信号通带内的信号还原为基带的过程。 1、2ASK调制 原理如下图所示,基带信号为单极不归零码,与载波信号相乘,得到调制信号。 调制电路可以用开关…

力扣-收集足够苹果的最小花园周长[思维+组合数]

题目链接 题意: 给你一个用无限二维网格表示的花园,每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 ,且每条边都与两条坐标轴之一平行。 给你一个整…

非对称加密与对称加密的区别是什么?

在数据通信中,加密技术是防止数据被未授权的人访问的关键措施之一。而对称加密和非对称加密是两种最常见的加密技术,它们被广泛应用于数据安全领域,并且可以组合起来以达到更好的加密效果。本文将探讨这两种技术的区别,以及它们在…

输电线路导线舞动在线监测装置_带气象监测-深圳鼎信

导线舞动是指输电线路上的导线在风的作用下产生的高频振动现象。如果导线舞动幅度过大,会给电网运行造成威胁,例如可能会导致导线相间放电、挂线等问题,长时间的高频振动还可能引发断线、杆塔倒塌等事故。为了保障电网的安全运行,…

DBAPI个人版如何升级到企业版

安装好企业版软件,并启动 注意要新建mysql数据库,执行新版本的ddl_mysql.sql脚本 在旧版本系统中分别导出数据源、分组、API,得到3个json文件 注意全选所有的数据导出 在新版本系统中导入数据源 在新版本系统中导入分组 进入分组管理菜单&…

【Vue3干货】template setup 和 tsx 的混合开发实践

前言 一般而言,我们在用Vue的时候,都是使用模板进行开发,但其实Vue 中也是支持使用jsx 或 tsx的。 最近我研究了一下如何在项目中混合使用二者,并且探索出了一些模式, 本文就是我在这种开发模式下的一些总结和思考&am…

华为配置策略路由(基于IP地址)示例

组网需求 如图1所示,汇聚层Switch做三层转发设备,接入层设备LSW做用户网关,接入层LSW和汇聚层Switch之间路由可达。汇聚层Switch通过两条链路连接到两个核心路由器上,一条是高速链路,网关为10.1.20.1/24;另…

基于大语言模型LangChain框架:知识库问答系统实践

ChatGPT 所取得的巨大成功,使得越来越多的开发者希望利用 OpenAI 提供的 API 或私有化模型开发基于大语言模型的应用程序。然而,即使大语言模型的调用相对简单,仍需要完成大量的定制开发工作,包括 API 集成、交互逻辑、数据存储等…

Databend 开源周报第 125 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 密码策略 Data…

智能优化算法应用:基于浣熊算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于浣熊算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于浣熊算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.浣熊算法4.实验参数设定5.算法结果6.参考文献7.MA…

麒麟V10arm桌面版的安装包在麒麟V10服务器版安装

安装过后,可执行程序可能运行不了,看起来就像没识别为可执行程序。在终端运行,会发现其实是缺少了某些库,比如libicui18n.so.66、libicuuc.so.66、libicudata.so.66和libm.so.6库版本不对。 报这个错:error while loa…

Unity VR Pico apk安装失败:INSTALL_FAILED_UPDATE_INCOMPATIBLE

我的报错: PICO4企业版。安装apk,报错“安装失败。(所属的Unity项目打包的apk,被我在同一台pico4安装了20次) 调试方法: PIco4发布使用UNITY开发的Vr应用,格式为apk,安装的时候发生…

Quartz持久化(springboot整合mybatis版本实现调度任务持久化)--提供源码下载

1、Quartz持久化功能概述 1、实现使用quartz提供的默认11张持久化表存储quartz相关信息。 2、实现定时任务的编辑、启动、关闭、删除。 3、实现自定义持久化表存储quartz定时任务信息。 4、本案例使用springboot整合mybatis框架和MySQL数据库实现持久化 5、提供源码下载 …

众和策略:12月新批国产网游版号数量过百

上星期五(22日),A股冲高回落,三大股指挨近午盘拉升走高,午后再度回落走低,沪指尾盘跌幅收窄。到收盘,沪指跌0.13%报2914.78点,深成指跌0.39%报9221.31点,创业板指跌0.37%…

构建外卖系统:从技术到实战

在当今高度数字化的社会中,外卖系统的开发变得愈发重要。本文将从技术角度出发,带领读者一步步构建一个基础的外卖系统,并涵盖关键技术和实际代码。 1. 技术选型 1.1 后端开发 选择Node.js和Express框架进行后端开发,搭建一个灵…

Kruskal算法求最小生成树(kruskal算法)

题目描述 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。 给定一张边带权的无向图 G(V,E),其中 V 表示图中点的集合&#xff…

【操作系统】探究进程奥秘:显示进程列表的解密与实战

​🌈个人主页:Sarapines Programmer🔥 系列专栏:Linux专栏:《探秘Linux | 操作系统解密》⏰诗赋清音:月悬苍穹泛清辉,梦随星河徜徉辉。情牵天际云千层,志立乘风意自飞。 ​ 目录 &a…