OAuth 2.0 概念及授权流程梳理

2023-05-16

本文可以转载,但请注明出处https://www.cnblogs.com/hellxz/p/oauth2_process.html

OAuth2 的概念

OAuth是一个关于授权的开放网络标准,OAuth2是其2.0版本。

它规定了四种操作流程(授权模式)来确保安全

应用场景有第三方应用的接入、微服务鉴权互信、接入第三方平台、第一方密码登录等

Java王国中Spring Security也对OAuth2标准进行了实现。

OAuth2授权模式

OAuth2定义了四种授权模式(授权流程)来对资源的访问进行控制

  • 授权码模式(Authorization Code Grant)
  • 隐式授权模式(Implicit Grant)
  • 用户名密码模式(Resource Owner Password Credentials Grant)
  • 客户端模式(Client Credentials Grant)

无论哪个模式(流程)都拥有三个必要角色:客户端授权服务器资源服务器,有的还有用户(资源拥有者),下面简单介绍下授权流程

授权码模式(Authorization Code Grant)

授权码模式是OAuth2目前最安全最复杂的授权流程,先放一张图,稍做解释

如上图,我们可以看到此流程可大致分为三大部分

  • Client Side:用户+客户端与授权服务器的交互
  • Server Side:客户端与授权服务器之间的交互
  • Check Access Token:客户端与资源服务器之间的交互 + 资源服务器与授权服务器之间的交互

整体上来说,可以用一句话概括授权码模式授权流程

客户端换取授权码,客户端使用授权码换token,客户端使用token访问资源

接下来对这三部分进行一些说明 :

前提条件:

  • 第三方客户端需要提前与资源拥有方(同时也是授权所有方)协商客户端id(client_id),客户端密钥(client_secret)
  • 文中暂时未将scope、state等依赖具体框架的内容写进来,这里可以参考Spring Security OAuth2的实现

Client Side

客户端换取授权码

这个客户端可以是浏览器,

  1. 客户端将client_id + client_secret + 授权模式标识(grant_type) + 回调地址(redirect_uri)拼成url访问授权服务器授权端点
  2. 授权服务器返回登录界面,要求用户登录(此时用户提交的密码等直接发到授权服务器,进行校验)
  3. 授权服务器返回授权审批界面,用户授权完成
  4. 授权服务器返回授权码到回调地址

Server Side

客户端使用授权码换token

  1. 客户端接收到授权码,并使用授权码 + client_id + client_secret访问授权服务器颁发token端点
  2. 授权服务器校验通过,颁发token返回给客户端
  3. 客户端保存token到存储器(推荐cookie)

Check Access Token

客户端使用token访问资源

  1. 客户端在请求头中添加token,访问资源服务器
  2. 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
  3. 资源服务器校验成功,返回资源

这里的说明省去了一些参数,如scope(请求token的作用域)、state(用于保证请求不被CSRF)、redirect_uri(授权服务器回调uri),先理解概念,实现的时候再去要求

隐式授权模式(Implicit Grant)

隐式授权模式大致可分为两部分:

  • Client Side:用户+客户端与授权服务器的交互
  • Check Access Token:客户端与资源服务器之间的交互 + 资源服务器与授权服务器之间的交互

用一句话概括授权码模式授权流程

客户端让用户登录授权服务器换token,客户端使用token访问资源

Client Side

客户端让用户登录授权服务器换token

  1. 客户端(浏览器或单页应用)将client_id + client_secret + 授权模式标识(grant_type)+ 回调地址(redirect_uri)拼成url访问授权服务器授权端点

  2. 授权服务器跳转用户登录界面,用户登录
  3. 用户授权
  4. 授权服务器访问回调地址返回token给客户端

Check Access Token

客户端使用token访问资源

  1. 客户端在请求头中添加token,访问资源服务器
  2. 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
  3. 资源服务器校验成功,返回资源

密码模式(Resource Owner Password Credentials Grant)

密码模式大体上也分为两部分:

  • Client Side: 用户与客户端交互,客户端与授权服务器交互
  • Check Access Token:客户端与资源服务器之间的交互 + 资源服务器与授权服务器之间的交互

一句话概括用户名密码模式流程

用户在客户端提交账号密码换token,客户端使用token访问资源

Client Side

用户在客户端提交账号密码换token

  1. 客户端要求用户登录
  2. 用户输入密码,客户端将表单中添加客户端的client_id + client_secret发送给授权服务器颁发token端点
  3. 授权服务器校验用户名、用户密码、client_id、client_secret,均通过返回token到客户端
  4. 客户端保存token

Check Access Token

客户端使用token访问资源

  1. 客户端在请求头中添加token,访问资源服务器
  2. 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
  3. 资源服务器校验成功,返回资源

客户端模式(Client Credentials Grant)

客户端模式大体上分为两部分:

  • Server Side: 客户端与授权服务器之间的交互
  • Check Access Token: 客户端与资源服务器,资源服务器与授权服务器之间的交互

一句话概括客户端模式授权流程

客户端使用自己的标识换token,客户端使用token访问资源

Server Side

客户端使用自己的标识换token

  1. 客户端使用client_id + client_secret + 授权模式标识访问授权服务器的颁发token端点
  2. 授权服务器校验通过返回token给客户端
  3. 客户端保存token

Check Access Token

客户端使用token访问资源

  1. 客户端在请求头中添加token,访问资源服务器
  2. 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
  3. 资源服务器校验成功,返回资源

OAuth2授权模式的选型

考虑到授权场景的多样性,可以参考以下两种选型方式

  • 按授权需要的多端情况
  • 按客户端类型与所有者

后记

学习OAuth2有一段时间了,把学到的知识分享出来,行文中难免有错误,如果发现还请留言指正,谢谢合作

参考文章与资料:

https://time.geekbang.org/course/intro/84 作者:杨波

https://blog.csdn.net/sinat_25295611/article/details/84980987 作者:Kayfen

How OAuth 2.0 works and how to choose the right flow 作者:Lorenzo Spyna

本文可以转载,但请注明出处https://www.cnblogs.com/hellxz/p/oauth2_process.html

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

OAuth 2.0 概念及授权流程梳理 的相关文章

随机推荐

  • 远程桌面打开mayavi,基于VirtualGL + Turbovnc

    实现内容 xff1a 远程桌面打开mayavi xff0c 基于VirtualGL 43 Turbovnc 参考链接 xff1a 链接1 下面是复制过来的内容 xff0c 附加上我的注释 xff1a Setup VirtualGL and
  • twisted笔记三:當Deferred遇上Thread(转载)

    Deferred不會自動實現將阻塞過程轉為非阻塞過程 xff0c 雖然它已經有那樣的機制但還是要你去多走一步 要將阻塞過程轉為真正的非阻塞過程 xff0c 那麼只有借用線程 但至於線程調用你不用太擔心 xff0c twisted已為你準備好
  • pyspider安装与初次使用的那些坑

    pyspider是一个python的爬虫框架 xff0c 安装过程遇到不少坑 xff0c 在这里总结一下 安装 安装只需要简单用pip安装就可以了 pip install pyspider 测试 使用 pyspider 或 pyspider
  • FreeRTOS学习笔记(二)——内核机制

    文章目录 0x01 临界段Cortex M内核快速关中断指令关中断开中断进入和退出临界段的宏进入临界段退出临界段临界段代码应用 0x02 空闲任务与阻塞延时的实现空闲任务的创建实现阻塞延时阻塞等待总结 0x03 多优先级通用方法 xff1a
  • scrapy并发爬虫

    通过CrawlerProcess import scrapy from scrapy crawler import CrawlerProcess class MySpider1 scrapy Spider Your first spider
  • pyqt5使用pyinstaller打包项目为exe

    一 打包 1 生成index spec pyinstaller F w i logo ico index py 不显示cmd pyinstaller F c i logo ico index py 建议先用 c xff0c 这样如果打包不成
  • freshclam更新clamav病毒库失败(connection failed)

    有大佬能帮帮我吗 xff1f
  • 查杀linux服务器木马,定时查杀病毒并隔离

    接收到了阿里云服务器的安全告警 xff0c 主要文件是 usr bin sshd root aa xff0c 使用以下三种方法解决 一 使用clamav 一 xff09 下载 下载方式 xff1a xff08 1 xff09 下载压缩文件
  • 外部传参的3种方式

    运行jar包时 xff0c 希望通过外部传参并获取 xff0c 框架为spring boot xff0c 有3种方式解决 前两种需要设置环境变量 spring boot 的 64 Value 64 Component public clas
  • 批量替换文件名为指定日期并删除.svn文件

    bin bash cur date 61 34 96 date 43 Y m d 96 34 cur date 61 2 批量替换该文件夹下的所有文件日期为指定日期 function replace name for file in 96
  • log4j2内置变量

    问题概述 xff1a 在log4j2 xml中中想通过 变量名 直接获取变量 xff0c 但是直接输出了 符 xff0c 并没有获取到项目中的变量 目录 一 log4j2官方配置 二 常见变量 1 bundle配置文件 2 sys系统变量
  • 构建Docker容器集群(九)

    Docker容器集群构建 使用自定义网桥连接跨主机容器 Docker默认的网桥是docker0 它只会在本机连接所有的容器 举例来说容器的虚拟网卡在主机上看一般叫做veth 而docker0网桥把所有这些网卡桥接在一起 xff0c 如下所示
  • ubuntu虚拟桌面

    用户可以自定义启动号码如 xff1a vncserver 2 注意 2前面一定要有空格 杀死vncserver进程 vncserver kill 1 这里你启动vncserver时是什么端口号要对应上 1 第一种方法 xff1a 使用geo
  • markdown编辑希腊字母

    字母名称大写markdown原文小写markdown原文alphaAA alphabetaBB betagamma Gamma gammadelta Delta deltaepsilonEE epsilon varepsilonzetaZZ
  • Linux下WRF Domain Wizard使用教程(PART2: 使用教程及 遇到的种种BUG)

    当用命令run DomainWizard打开WRFDW后 如图所示 第一步 第一栏是你的虚拟机的名称 第二栏是WPS所在的目录 第三行是WPS所需要的静态地理数据的位置 第四栏是你WRFDW项目存放的位置 这里我新创建了个domain 点击
  • Keras学习之tensor张量

    本文参考Keras中文官方网站 xff1a http keras cn readthedocs io en latest other regularizers tensor 张量 指的是指广泛的数据类型 xff0c 它是 n n 维的 n
  • 栈和排序

    题目描述 给你一个1 gt n的排列和一个栈 xff0c 入栈顺序给定 你要在不打乱入栈顺序的情况下 xff0c 对数组进行从大到小排序 当无法完全排序时 xff0c 请输出字典序最大的出栈序列 输入描述 第一行一个数n 第二行n个数 xf
  • ubuntu系统samba共享权限设置,一清二楚

    samba共享设置 在root权限下 xff0c 进入root权限的方法 su或者 sudo su root 创建系统用户 useradd m user 设置用户密码 passwd user 创建smb密码 smbpasswd a user
  • curl安装

    一 xff1a windows下安装curl 1 下载windows版本curl安装包 根据你电脑的系统选择32位或64位 因为我的电脑是64位的 所以我选择64位的安装包 curl下载地址 xff1a https curl haxx se
  • OAuth 2.0 概念及授权流程梳理

    本文可以转载 xff0c 但请注明出处https www cnblogs com hellxz p oauth2 process html OAuth2 的概念 OAuth是一个关于授权的开放网络标准 xff0c OAuth2是其2 0版本