Oauth2原理和讲解

微服务应用之OAuth2.0的四种授权方式 看完你就会懂oauth2.0的四种授权方式是如何工作的了 阅读详情

1,OAuth 2.0 的四种方式
概念:OAuth 2.0 是一种授权机制,主要用来颁发令牌(token)
核心: OAuth 的核心就是向第三方应用颁发令牌
1.1) 授权码(authorization-code)
1.2)隐藏式(implicit)
1.3)密码式(password):
1.4)客户端凭证(client credentials)

注意,不管哪一种授权方式,第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。

第一种授权方式:授权码
授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。

这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

第一步,A 网站提供一个链接,用户点击后就会跳转到 B 网站,授权用户数据给 A 网站使用。下面就是 A 网站跳转 B 网站的一个示意链接。

在这里插入图片描述

https://b.com/oauth/authorize?
response_type=code&
client_id=CLIENT_ID&
redirect_uri=CALLBACK_URL&
scope=read
上面 URL 中,response_type参数表示要求返回授权码(code),client_id参数让 B 知道是谁在请求,redirect_uri参数是 B 接受或拒绝请求后的跳转网址,scope参数表示要求的授权范围(这里是只读)。

在这里插入图片描述

第二步,用户跳转后,B 网站会要求用户登录,然后询问是否同意给予 A 网站授权。用户表示同意,这时 B 网站就会跳回redirect_uri参数指定的网址。跳转时,会传回一个授权码,就像下面这样。
在这里插入图片描述

https://a.com/callback?code=AUTHORIZATION_CODE
上面 URL 中,code参数就是授权码。
在这里插入图片描述

第三步,A 网站拿到授权码以后,就可以在后端,向 B 网站请求令牌。

在这里插入图片描述

https://b.com/oauth/token?
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
grant_type=authorization_code&
code=AUTHORIZATION_CODE&
redirect_uri=CALLBACK_URL
上面 URL 中,client_id参数和client_secret参数用来让 B 确认 A 的身份(client_secret参数是保密的,因此只能在后端发请求),grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码,code参数是上一步拿到的授权码,redirect_uri参数是令牌颁发后的回调网址。
在这里插入图片描述

第四步,B 网站收到请求以后,就会颁发令牌。具体做法是向redirect_uri指定的网址,发送一段 JSON 数据。
在这里插入图片描述

{
“access_token”:“ACCESS_TOKEN”,
“token_type”:“bearer”,
“expires_in”:2592000,
“refresh_token”:“REFRESH_TOKEN”,
“scope”:“read”,
“uid”:100101,
“info”:{…}
}
上面 JSON 数据中,access_token字段就是令牌,A 网站在后端拿到了。
在这里插入图片描述

第二种方式:隐藏式
有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)“隐藏式”(implicit)。

第一步,A 网站提供一个链接,要求用户跳转到 B 网站,授权用户数据给 A 网站使用。
在这里插入图片描述

https://b.com/oauth/authorize?
response_type=token&
client_id=CLIENT_ID&
redirect_uri=CALLBACK_URL&
scope=read
上面 URL 中,response_type参数为token,表示要求直接返回令牌。

第二步,用户跳转到 B 网站,登录后同意给予 A 网站授权。这时,B 网站就会跳回redirect_uri参数指定的跳转网址,并且把令牌作为 URL 参数,传给 A 网站。

在这里插入图片描述

https://a.com/callback#token=ACCESS_TOKEN
上面 URL 中,token参数就是令牌,A 网站因此直接在前端拿到令牌。

注意,令牌的位置是 URL 锚点(fragment),而不是查询字符串(querystring),这是因为 OAuth 2.0 允许跳转网址是 HTTP 协议,因此存在"中间人攻击"的风险,而浏览器跳转时,锚点不会发到服务器,就减少了泄漏令牌的风险。
在这里插入图片描述

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

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

第一步,A 网站要求用户提供 B 网站的用户名和密码。拿到以后,A 就直接向 B 请求令牌。
在这里插入图片描述

https://oauth.b.com/token?
grant_type=password&
username=USERNAME&
password=PASSWORD&
client_id=CLIENT_ID
上面 URL 中,grant_type参数是授权方式,这里的password表示"密码式",username和password是 B 的用户名和密码。

第二步,B 网站验证身份通过后,直接给出令牌。注意,这时不需要跳转,而是把令牌放在 JSON 数据里面,作为 HTTP 回应,A 因此拿到令牌。

这种方式需要用户给出自己的用户名/密码,显然风险很大,因此只适用于其他授权方式都无法采用的情况,而且必须是用户高度信任的应用。

第四种方式:凭证式
最后一种方式是凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌。

第一步,A 应用在命令行向 B 发出请求。
在这里插入图片描述

https://oauth.b.com/token?
grant_type=client_credentials&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET
上面 URL 中,grant_type参数等于client_credentials表示采用凭证式,client_id和client_secret用来让 B 确认 A 的身份。

第二步,B 网站验证通过以后,直接返回令牌。

这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。

令牌的使用
A 网站拿到令牌以后,就可以向 B 网站的 API 请求数据了。

此时,每个发到 API 的请求,都必须带有令牌。具体做法是在请求的头信息,加上一个Authorization字段,令牌就放在这个字段里面。
在这里插入图片描述

curl -H “Authorization: Bearer ACCESS_TOKEN”
“https://api.b.com”
上面命令中,ACCESS_TOKEN就是拿到的令牌。

更新令牌
令牌的有效期到了,如果让用户重新走一遍上面的流程,再申请一个新的令牌,很可能体验不好,而且也没有必要。OAuth 2.0 允许用户自动更新令牌。
在这里插入图片描述

具体方法是,B 网站颁发令牌的时候,一次性颁发两个令牌,一个用于获取数据,另一个用于获取新的令牌(refresh token 字段)。令牌到期前,用户使用 refresh token 发一个请求,去更新令牌。

https://b.com/oauth/token?
grant_type=refresh_token&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
refresh_token=REFRESH_TOKEN
上面 URL 中,grant_type参数为refresh_token表示要求更新令牌,client_id参数和client_secret参数用于确认身份,refresh_token参数就是用于更新令牌的令牌。

B 网站验证通过以后,就会颁发新的令牌。

写到这里,颁发令牌的四种方式就介绍完了。下一篇文章会编写一个真实的 Demo,演示如何通过 OAuth 2.0 向 GitHub 的 API 申请令牌,然后再用令牌获取数据。

【身份安全】OAuth 2.0工作原理(一) OAuth是一个授权框架,它使应用程序能够在 HTTP 服务上获得对用户帐户的有限访问权限。它的工作原理是将用户身份验证委托给托管用户帐户的服务,并授权第三方应用程序访问该用户帐户。OAuth 2 为 Web 和桌面应用程序以及移动设备提供授权流程。 阅读详情

相关推荐

OAuth1.0/2.0的机制原理讲解及开发流程

1、OAuth的简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的。(我喜欢简单明了,这里没看懂,没关系,接着往下面看) 2、OAuth的原理 (流程图) 我在图上分了四个步骤,下面是四步的讲解: 第一步:用户访问第三方网站,比如:就是你需要使用

XyWang95的博客 1757

OAuth2.0四种授权模式及实战

Oauth2.0具有多种授权许可机制协议:授权码许可机制、客户端凭据机制、资源拥有者凭据机制(密码模式)和隐式许可机制。在源码中即可看到四种模式的实现类,还有一个RefreshTokenGranter则是刷新令牌,用于access_token失效时刷新过期时间。假如现在我需要实现手机验证码登录或者微信扫码登录等功能的时候,我们该如何处理呢?我们可以继承AbstractTokenGranter实现自定义授权模式。手机短信验证码模式。

CODEING一场空的博客 1万+

【Spring底层原理高级进阶】【SpringCloud整合Spring Security OAuth2】深入了解 Spring Security OAuth2:底层解析+使用方法+实战

OAuth2(Open Authorization 2.0)是一种用于授权的开放标准协议,用于通过第三方应用程序访问用户在某个服务提供商上存储的资源,而无需共享用户的凭证(例如用户名和密码)。它允许用户授权给第三方应用程序访问受保护的资源,同时确保用户的凭证信息不被直接暴露给第三方应用程序。OAuth2协议的设计目标是简化授权流程和提高安全性,通过委托授权的方式和使用令牌来实现用户和第三方应用程序之间的安全通信。它已成为许多互联网服务提供商和开发者在构建应用程序时常用的授权标准。

终于等到你啦~欢迎来到我的知识空间 这里是苏泽的成神之路 9225

OAuth2.0 四种授权方式讲解

OAuth2通过将用户密码信息与第三方应用程序隔离,提高了应用程序的安全性。同时,OAuth2是一个开放的标准,可以与不同的应用程序、平台和设备兼容,易于理解和使用,可以快速集成到应用程序中。

让优秀成为一种习惯! 5985

OAuth2.0 全面介绍

OAuth 是一种授权协议, 通过他, 用户可以授权第三方应用访问自己保存在资源服务器上的资源。 OAuth 目前使用的版本是2.0。

oscar999的专栏 1929

【Golang】基于OAuth2.0微信扫码实现客户端用户登录(原理+代码实现+视频讲解)

OAuth 2.0是一种授权协议,用于授权第三方应用访问用户资源,而无需将用户的凭据(例如用户名和密码)直接提供给第三方应用。这种授权机制为用户提供了更好的安全性,同时允许用户更好地控制他们的数据。一个关于授权的开放网络标准 允许用户授权第三方应用访问用户存储在其他服务提供者上的信息 不需要将用户名和密码提供给第三方应用资源所有者(Resource Owner):通常是指用户,拥有访问受保护资源的所有权。(资源所有者,用户)

Jing_Hua 6619

OAuth 2原理讲解

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。 一、应用场景 为了理解OAuth的适用场合,让我举一个假设的例子。 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用

Just Do It ——张俊永 2250

五分钟带你玩转oauth2(二)还不了解微信登录原理?带你了解oauth2第三方登录

Oauth2 OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。 OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的规范标准。与以往的授权方式不同之处是 OAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就 可以申请获得该用户资源的授权,因此 OAuth 是开放的安全的。 业界提供了 OAuth 的多种实现,如 Java、PHP、Ruby 等各种语言开发包,大大节约了程序员的时间,因而OAuth是简易的

小鲍侃java 1790

OAuth 2.0的机制原理讲解及开发流程[OAuth开发]

一段时间没写关于OAuth的文章了,近期都忙于学习mysql,今天抽点时间讲下OAuth2.0的机制原理,及开发qq oauth2.0认证登录的流程,闲话少说,直入主题。。。 1、OAuth认证的简述、原理 这部分,我在  OAuth 1.0的机制原理讲解及开发流程[QQ OAuth开发] 一文中已经讲的很详细了,在此就略了,详细请查看: 点击进入 2、OAuth2.0的认

casun_li的专栏 1132

oauth2笔记

【1】OAuth 2.0 【2】OAuth2四种授权模式 【3】Spring OAuth2.0 【4】springcloud-OAuth 2.0 配置 【5】生成rsa密钥对 【6】WebSecurityConfigurerAdapter和ResourceServerConfigurerAdapter的区别 【7】oauth 同一用户多端登录 【8】常见问题 【1】OAuth 2.0 理解OAuth 2.0 1> OAuth 2.0为用户和应用定义了如下角色: 资源拥有者 资源服务器

shuangmu9768的博客 1万+

避开ns-3学习深坑:用sns3模块快速搭建GEO卫星通信仿真(附GitHub代码解读)

本文介绍了如何使用sns3模块快速搭建GEO卫星通信仿真环境,绕过复杂的ns-3底层细节。通过详细的Linux环境配置、sns3模块安装和示例代码解读,帮助开发者快速上手卫星通信仿真,并提供了常见问题的解决方案和性能优化技巧。

weixin_28720573的博客 441

OAuth1.0/2.0版本的机制原理讲解及开发流程

为什么80%的码农都做不了架构师?>>> ...

weixin_34259232的博客 224

NVIDIA DGX Spark (Ubuntu 24.04) 部署Isaac Sim与Isaac Lab:二进制安装与ROS2集成实战

本文详细介绍了在NVIDIA DGX Spark工作站(Ubuntu 24.04系统)上,通过预编译二进制包稳定部署Isaac Sim与Isaac Lab的完整实战流程。文章重点剖析了二进制安装相较于源码编译和pip安装的优势,有效规避了CUDA、PyTorch等关键组件的版本冲突陷阱,并逐步指导完成环境配置、Isaac Lab集成、Conda环境管理以及ROS2 Jazzy的集成,最终构建出完整的机器人仿真与强化学习开发平台。

kite3的博客 396

OAuth 2.0 解析:后端开发者视角的原理与流程讲解

为了彻底理清数据流向,我们将标准的 OAuth 角色拆解为具体的工程组件。用户 (Resource Owner):浏览器操作者,资源的真正拥有者。第三方 Client 前端:运行在用户浏览器中的第三方页面(如第三方 Client 后端:第三方部署在服务器侧的服务,持有,是最终要获取 Token 的主体。我方授权服务器 (AS - Authorization Server):负责验证身份、分发 Code 和 Token 的核心服务(如 IdentityService)。我方前端。

czlczl20020925的博客 902

汇川伺服Modbus-RTU通讯实战:从帧结构解析到西门子PLC配置

本文详细解析了汇川伺服与西门子PLC通过Modbus-RTU协议进行通讯的实战步骤,包括帧结构解析、硬件连接、参数设置及PLC程序配置。通过具体案例和常见问题排查指南,帮助工程师快速掌握工业自动化中的通讯技术,提升设备调试效率。

weixin_33670713的博客 456

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文提供《秦时明月》6.2魔改版从零开始的完整部署指南。详细讲解CentOS服务器环境准备、服务端文件部署与安装、关键端口开放及进程验证。重点涵盖安卓客户端APK的IP修改与重签名方法,并介绍了GM后台工具的访问与使用,助你快速搭建并管理专属游戏服务器。

garlic的博客 313

OAuth2 详细介绍!

OAuth2 , Spring Security OAuth2 , JWT

weixin_52834606的博客 1万+

怎么在豆包里做生成式引擎优化(GEO)

本文系统介绍了豆包平台生成式引擎优化(GEO)的全套方法体系。文章首先解析了豆包与传统搜索引擎的核心差异,强调其多模态理解和上下文感知特性,并指出GEO需从关键词匹配转向用户意图动态解析。随后详细阐述了GEO优化的三大核心策略:用户意图解析技术、实时内容适配框架和权威信号强化方法,配以技术实现路径和案例说明。最后提出GEO与SEO融合的未来趋势,建议企业构建统一知识库,实现全渠道声誉管理。全文包含大量实操代码和工具链指导,为企业在AI时代的内容优化提供系统解决方案。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 2387

构建安全的REST API:OAuth2和JWT实践

说到REST API,咱们先来搞清楚几个概念。REST(Representational State Transfer)是一种设计风格,它定义了一套规则,用于创建网络服务。通过使用HTTP协议的方法,如GET、POST、PUT、DELETE等,REST API允许应用程序或服务访问网络上的资源。举个例子,假如小黑现在要开发一个天气预报应用。这个应用需要从一个天气服务提供商那里获取数据。这时候,REST API就是小黑和天气服务提供商之间的桥梁。

宋小黑的博客 1745

【黑马点评】项目知识点及面经整理

【黑马点评】项目知识点及面经整理

m0_52031708的博客 6607

华为OD机试真题2025双机位C卷 Java&Go 实现【卡牌游戏】

小明正在尝试一种新的牌游戏。游戏规则只如下:首先,小明拿到一张写有数字m的牌。 然后,他会拿到另外n张牌,上面分别写有不同的数字,牌排成一排。小明的目标是从这排牌中找到一串连续的牌,这些牌上数字的总和可以被 m整除。你的任务是判断小明是否可以完成这个目标。

MISAYAONE的博客 394

OAuth2.0认证原理

OAuth2.0认证原理 一.OAuth是什么? OAuth的英文全称是Open Authorization,它是一种开放授权协议。OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和2010年4月的2.0版,1.0版本存在严重安全漏洞,而2.0版解决了该问题,下面简单谈一下我对OAuth2.0的理解。 二.OAuth2.0有什么用? 引用一下OAuth2.0中文文档中的介绍: 1.需要第三方应用存储资源所有者的凭据,以供将来使用,通常是

weixin_47073925的博客 8047

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

算法大师! 1156
上一篇: 日志系统新贵 Loki
下一篇: 使用Java 将PPT转换为PDF、XPS等格式
yonhu123java
博客等级 码龄14年 6粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值