OAuth2.0的四种授权方式

2023-05-16

前言

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OAuth2.0的四种授权方式 的相关文章

随机推荐

  • HIVE分区表指定location加载不到数据解决方案

    指定了表的location但是select不出来数据 xff0c 而目录确实存在hdfs上 xff0c 如图所示 xff08 我这里面是2级分区 xff09 解决方案 xff1a 1 Alter table test6 add partit
  • LINUX SHELL遍历日期(指定输入两个日期)

    LINUX SHELL遍历日期 xff0c 昨天写一个让我删了 xff0c 写的也太坑了 xff0c 很简单的东西墨迹那么长一串羞愧不已 xff01 bin bash first 61 1 second 61 2 while 34 firs
  • 虚拟机文件过多,如何删除?vmdk文件能删除吗?

    最近发现虚拟机使用一段时间后产生了很多文件 xff0c 不知道哪些文件有用还是没有用 xff1f 能否直接删除 xff1f 有没有高手能告诉我一下 xff1f 其中很多是 vmdk文件 xff0c 看看前面的部分能否删除 xff1f
  • 【直观理解】为什么梯度的负方向是局部下降最快的方向?

    推荐阅读时间 xff1a 8min 15min 主要内容 xff1a 为什么梯度的负方向是局部下降最快的方向 xff1f 刚接触梯度下降这个概念的时候 xff0c 是在学习机器学习算法的时候 xff0c 很多训练算法用的就是梯度下降 xff
  • RichEdit扩展控件–ekRichEdit简介

    原文地址 xff1a http www uieasy com cn blog p 61 419 易酷软件发布了RichEdit扩展控件ekRichEdit 此版本实现了在IM等聊天窗口中所需要的基本功能 xff0c 可以满足IM软件对Ric
  • 如何选择VC界面库产品

    客户经常来信询问该如何选择界面库产品 xff1a 你们的产品跟其他同类产品相比有什么优势 xff1f 你们的DSkinLite界面库跟DirectUI界面库有什么不同 xff0c 哪个产品更适合我们公司 xff1f 在此我们对这些问题做详细
  • 游戏大厅类软件 Demo系列(二)

    游戏大厅类软件 DSkinLite界面库Demo系列 xff08 二 xff09 游戏大厅类软件是UIEASY开发团队制作的又一个软件demo xff0c 此次发布只是一个雏形 xff0c 我们还将继续完善此Demo xff0c 使其各项功
  • 窗口控件透明效果的实现--DSkinLite界面库使用技巧

    DSkinLite 界面库使用技巧 二 窗口控件透明效果 界面设计中 xff0c 很多效果需要借助透明效果来实现 不幸的是 xff0c Windows 标准控件基本不支持透明效果 因此我们需要自己来实现透明效果 一般来说所谓控件透明 xff
  • DSkinControl( For MFC) 控件- dsCtrlComboBox

    原文地址 xff1a http www uieasy cn blog p 61 513 传统的combobox 在使用方面有很多限制 xff0c 很难满足我们combobox类型控件的需求 主要表现中combobox内置的listbox难以
  • 图像典型特征描述子Haar

    以下文章摘录自 xff1a 机器学习观止 核心原理与实践 京东 xff1a https item jd com 13166960 html 当当 xff1a http product dangdang com 29218274 html 由
  • oracle触发器执行用户和v$session的查询

    oracle触发器 xff0c 由针对表的动作触发 xff0c 其执行用户为当前表的所有者 xff0c 所以在触发器中涉及的权限问题 xff0c 应该和触发器所基于的表的所有者有关 对于v session的查询 xff1a 要明确的是 xf
  • springboot打包docker镜像部署

    springboot打包docker镜像部署 环境准备 机器 vultr一台 centos7 资源下载 jdk8 maven git yum install git docker yum install docker io 环境搭建 jdk
  • 深度学习基础——简单了解meta learning(来自李宏毅课程笔记)

    知乎同名账号同步发布 目录 一 初步了解二 和ML的差异三 应用了解 一 初步了解 我们以分类问题为例 xff0c 以前 xff0c 学习的目的是学习一个二元分类器 f f f xff1b 现在 xff0c 学习的
  • docker删除镜像及容器

    问题 清理服务器相关无用docker镜像及容器 删除镜像image 要删除 Docker 中的镜像 xff0c 可以使用 docker rmi 命令 请注意 xff0c 删除镜像前请确保不再需要它 xff0c 并且已经停止了使用该镜像的所有
  • 云技术:弹性计算ECS

    云计算 xff08 Cloud Computing xff09 被业界看作继大型计算机 个人计算机 互联网之后的第四次IT产业革命 xff0c 正日益成为未来互联网与移动技术相结合的一种新兴计算模式 云计算提供了IT基础设施和平台服务的新模
  • 如何在 docker 容器中安装 ROS

    本文记录在 docker ubuntu 18 04 环境下安装 ROS xff08 机器人操作系统 xff09 的过程 目录 文章目录 目录安装 ROS参考文献 安装 ROS 安装步骤如下 xff1a span class token co
  • DOCKER个人遇见小问题

    1 在写dockerfile的时候使用了echo的方式向文件里面写入 基本格式是 echo 34 想要写入的操作 34 gt gt gt 路径 dockerfile 1 因为是要向文件里面进行一个写操作同时希望建立容器的时候执行这个操作 所
  • Tips and Tricks for Visual Question Answering: Learnings from the 2017 Challenge阅读笔记

    本文提出了一种基于深度神经网络的VQA模型 xff0c 并报告了一套广泛的实验来确定每个设计选择的贡献和替代设计的性能 它提供了关于VQA模型各个组件重要性的指示器 xff0c 一 Summary of findings 1 使用一个sig
  • Ubuntu系统用VNCViewer连不上远程的解决办法

    有时Ubuntu重启电脑重新联网之后 xff0c 用VNCViewer远程时提示timeout 解决办法 点击Ubuntu电脑系统的设置按钮 xff0c 进入共享选项卡 检查远程登录是不是已经开启 xff0c 屏幕共享是不是活动状态 屏幕共
  • OAuth2.0的四种授权方式

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