OAuth2.0的四种授权方式

news2025/1/6 21:29:20

前言

OAuth 简单理解就是一种授权机制,它是在客户端和资源所有者之间的授权层,用来分离两种不同的角色。在资源所有者同意并向客户端颁发令牌后,客户端携带令牌可以访问资源所有者的资源。

OAuth2.0OAuth 协议的一个版本,有 2.0 版本那就有 1.0 版本,但OAuth1.0 已经不使用了,而且OAuth2.0 不向下兼容。

场景举例

最简单的就是小区单元楼里面的门禁系统,它就是使用OAuth授权的,朋友过来玩的时候,到楼下有门禁进不来,对于本小区住户来说,可以输入密码进入,因为朋友不是小区住户,直接给他密码不合适,他可以在门禁上面输入我住的住户号,比如 1204,此时,房间里面的门禁电话就会响,我可以拿起电话,与他通话,确认为我朋友后,按下电话上面的允许按钮,门禁就会打开,他就可以进来了。

我按下电话上的允许按钮,就相当于给我朋友一个token,这个token拥有类似密码的功能,但也不太相同,token 拥有权限范围,有时效性的,到期自动失效,而且这些属性无法修改。

涉及参数

在讲授权方式前,先了解授权过程中会涉及到的参数:

  • response_typecode 表示要求返回授权码,token 表示直接返回令牌
  • client_id:客户端身份标识
  • client_secret:客户端密钥
  • redirect_uri:重定向地址
  • scope:表示授权的范围,read 只读权限,all 读写权限
  • grant_type:表示授权的方式,
    • AUTHORIZATION_CODE(授权码)
    • password(密码)
    • client_credentials(凭证式)
    • refresh_token 更新令牌
  • state:应用程序传递的一个随机数,用来防止CSRF攻击。

授权方式

OAuth2.0 的授权简单理解其实就是获取令牌token的过程,OAuth 协议定义了四种获得令牌的授权方式authorization grant

  • 授权码(authorization-code
  • 隐藏式(implicit
  • 密码式(password
  • 凭证式(client credentials

不管使用哪一种授权方式,在申请令牌之前,都必须在系统中去申请身份唯一标识,客户端 IDclient ID
和客户端密钥client secret保证 token 不被恶意使用。

授权码

四种授权中授权码方式是比较复杂的,安全系数却是最高的,也比较常用。这种方式适用于兼具前后端的Web项目。
image.png

1、用户选择使用微信登录webweb 会向微信发起授权请求,接下来微信询问用户是否同意授权(手机弹窗确认)。

  • response_typecode 要求返回授权码
  • scope 参数表示本次授权范围;
  • redirect_uri 重定向的地址。
https://wx.com/oauth/authorize?
	response_type=code&
	client_id=CLIENT_ID&
	redirect_uri=http://login.web/callback&
	scope=read

2、用户同意授权后,微信 根据 redirect_uri重定向并返回授权码

http://login.web/callback?code=AUTHORIZATION_CODE

3、当web拿到授权码(code)时,带授权码和密匙等参数向微信申请令牌(access_token)。

  • grant_type表示本次授权为授权码方式 authorization_code
  • client_secret客户端密匙;
  • code上一步得到的授权码。
https://wx.com/oauth/token?
	client_id=CLIENT_ID&
	client_secret=CLIENT_SECRET&
	grant_type=authorization_code&
	code=AUTHORIZATION_CODE&
	redirect_uri=http://login.web/callback

4、最后微信收到请求后向 redirect_uri 地址发送 JSON 数据,其中的access_token 就是令牌。

{    
  "access_token":"ACCESS_TOKEN",
  "token_type":"bearer",
  "expires_in":2592000,
  "refresh_token":"REFRESH_TOKEN",
  "scope":"read",
  ......
}

隐藏式

如果是纯前端应用,无法使用授权码模式。令牌的申请与存储都需要在前端完成,隐藏式跳过了授权码这一步。前端应用直接获取 tokenresponse_type 设置为 token,要求直接access_token,跳过授权码,微信授权通过后重定向到指定 redirect_uri

https://wx.com/oauth/authorize?
	response_type=token&
	client_id=CLIENT_ID&
	redirect_uri=http:/login.web/callback&
	scope=read

这种模式安全性相对于授权码低一些。

密码式

用户在web页面直接输入自己的微信用户名和密码,web拿着信息直接去微信申请令牌,请求响应的 JSON结果中返回 access_tokengrant_typepassword 表示密码式授权。

https://wx.com/token?
	grant_type=password&
	username=USERNAME&
	password=PASSWORD&
	client_id=CLIENT_ID

这种授权方式是非常的危险,相当于把微信密码直接交给了web系统。如果采取此方式授权的应用一定要高度可信任的。

凭证式

凭证式和密码式比较相似,适用于那些没有前端的命令行应用,可以用最简单的方式获取令牌,在请求响应的 JSON 结果中返回 access_token

  • grant_typeclient_credentials 表示凭证式授权,
  • client_idclient_secret 用来识别身份。
https://wx.com/token?
	grant_type=client_credentials&
	client_id=CLIENT_ID&
	client_secret=CLIENT_SECRET

令牌使用

拥有令牌就可以调用微信的 API 请求数据了,每个请求微信的请求都必须带上 token,将 token 放在 http 请求头header的一个Authorization里。
image.png

令牌刷新

token 是有时效性的,一旦过期就需要重新获取,如果重走一遍授权流程,太过麻烦,一般在颁发令牌 token 时会一次发两个令牌,一个令牌用来请求 API,另一个负责更新令牌 refresh_token

  • grant_typerefresh_token 请求为更新令牌,
  • 参数 refresh_token 是用于更新令牌的令牌。
https://wx.com/oauth/token?
	grant_type=refresh_token&
	client_id=CLIENT_ID&
	client_secret=CLIENT_SECRET&
	refresh_token=REFRESH_TOKEN

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

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

相关文章

【计算机毕业设计】77.旅游资源网站源码

一、系统截图(需要演示视频可以私聊) 摘 要 本论文主要论述了如何使用JAVA语言开发一个旅游资源网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中&#xf…

MATLB|分布式能源的选址与定容IEEE30节点实现

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

Jmeter(四):请求默认值元件应用,模拟http请求实战,正则表达式提取器元件讲解

Jmeter(7):jmeter请求默认值元件应用 HTTP请求默认值 在公司内部进行测试的时候,一般测试环境访问的接口地址(服务器名称 或IP)、端口、协议一般都是不变的,但http请求取样器每个请求都要求写一遍 这些信息&#xff0…

购物网站系统

视频如下 go网站前台:关于我们、联系我们、公告信息、商品类型、商品信息、商品评论管理员: 1、管理关于我们、联系我们 2、增删改查公告类型、公告信息 3增删改查商品类型、商品信息 4、查看注册用户信息 5、查看用户充值信息 6、查看回复用户咨询 7、查看下单信息 8、发货、查…

微信支付API3 APP【统一下单 APIV3】

官方参考资料 签名:签名生成-接口规则 | 微信支付商户平台文档中心 签名生成:签名生成 - WechatPay-API-v3 统一下单接口:微信支付-开发者文档 如何查看证书序列号:证书相关 - WechatPay-API-v3 私钥和证书:私钥和…

EXCEL基础:数据透视表(按年龄分组统计与统计各部门的工资情况)

【按年龄分组进行统计】: 如下为原始数据,最后就是年龄字段: 选择数据单元格,在新表里插入【数据透视表】,若数据透视表的【字段列表】没有显示,可以按照1标注那里勾选, 按照2处的列、行和统计…

Pytorch:使用官网提供数据集的相关参数设置,以CIFAR10为例进行说明

文章目录前言一、Dataset定义-组成分类二、获取数据集1.参数说明2.相关Demo前言 本文记录笔者关于Dataset的相关学习记录,以Pytorch官网文档为主进行学习 一、Dataset 定义-组成 所谓Dataset,指的是我们在学习神经网络中要接触的数据集,一…

[附源码]Python计算机毕业设计SSM基于的楼盘销售系统的设计与实现(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

关于近期虚拟化学习遇到的问题总结

一、关于Intel VT-x/EPT. 不使用虚拟化的Intel VT-x/EPT 因为需要在Linux中使用kvm做虚拟化因此需要开放宿主虚拟机的虚拟权限 但是打开报错 首先想要开启虚拟化,你的cpu是一定要支持虚拟化的 如何查看呢,可以ctrlaltdel打开任务管理器 点击性能 可以看…

电子加速器原理与应用

辐射单位 射线能量ϵ\epsilonϵ,单位eVeVeV ϵhν\epsilon h\nuϵhν,普朗克常数hhh,电磁波频率ν\nuν 电子伏特eVeVeV:一个电子(电量为1.610C)经过1VVV的电位差加速后获得的动能。 1eV1.610−19J1.610−…

计及碳捕集电厂低碳特性的含风电电力系统源–荷多时间尺度调度方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

[附源码]Python计算机毕业设计SSM基于的楼盘销售管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Java基本微信小程序的适老化老人健康预警系统 springboot+vue

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

LinkedList(Java8)个人理解

问题:LinkedList 的 Node 怎么理解? Node 是 LinkedList 的私有静态内部类,作为链表结构的基本元素,可以看作是链条上的一个节(结)点。一个 node 对象中除了存储元素的值外,还存储着前一个 nod…

【软件测试】测试员vs测试工程师,你是测试员还是测试工程师?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 不是什么时候&#…

[Java] 序列化(Serialization)的本质是什么?在Java中怎么实现?为什么要了解序列化技术?序列化技术选型要点是什么?

文章目录前言序列化是什么?理解对象在内存中是如何存储的数据在进程内存中的分布图数据被序列化之后在内存中的分布图序列化/反序列化的本质?序列化在Java中的实现?1. JDK Serialization(不推荐使用)2. 第三方实现&…

本地完成Vue脚手架和Django建立连接

目录 在Vue中 setting.py中: urls.py中 首先把要连接的Django项目和Vue脚手架创建好 之后我们把整个Vue拖到Django的文件夹根目录下,于manage.py同级即可(图中data-work为我的Vue) 在Vue中 进入到vue.config.js文件夹下 添加as…

全栈Jmeter接口测试(三):jmeter利用察看结果树查看响应调试取样器(Debug Sampler),设置HTTP信息头管理器模拟请求头

Jmeter(5):jmeter利用察看结果树查看响应&调试取样器(Debug Sampler) 察看结果树选项介绍: 名称:本属性用于标识一个察看结果树元件,建议使用一个有意义的名称 注释:对于测试没有任何作用,仅用户记录用…

初级西班牙语教程

初级西班牙语教程 通过使用我的简化方法变得会话和流利的完整指南学习西班牙语 课程英文名:Spanish Made Simple Beginner Spanish 此视频教程共28.0小时,中英双语字幕,画质清晰无水印,源码附件全 下载地址 课程编号&#xff…

MySQL MVCC详解

为什么需要MVCC 在没有MVCC之前,是使用读写锁(共享锁/排它锁)来进行并发控制的,读锁和读锁之间不互斥,写锁和读锁互斥,写锁和写锁互斥。 但是频繁加锁会导致数据库性能低下,这时出现了一种不加…