OAuth 2.0 概念及授权流程梳理
作者:东北小狐狸 发布时间:2023-06-28 02:41:28
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
客户端换取授权码
这个客户端可以是浏览器,
客户端将
client_id + client_secret + 授权模式标识(grant_type) + 回调地址(redirect_uri)
拼成url访问授权服务器授权端点
授权服务器返回登录界面,要求
用户登录
(此时用户提交的密码等直接发到授权服务器,进行校验)授权服务器返回授权审批界面,
用户授权
完成授权服务器
返回授权码到回调地址
Server Side
客户端使用授权码换token
客户端接收到授权码,并使用授权码 + client_id + client_secret访问授权服务器颁发token端点
授权服务器校验通过,颁发token返回给客户端
客户端保存token到存储器(推荐cookie)
Check Access Token
客户端使用token访问资源
客户端在请求头中添加token,访问资源服务器
资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
资源服务器校验成功,返回资源
这里的说明省去了一些参数,如scope(请求token的作用域)、state(用于保证请求不被CSRF)、redirect_uri(授权服务器回调uri),先理解概念,实现的时候再去要求
隐式授权模式(Implicit Grant)
隐式授权模式大致可分为两部分:
Client Side:用户+客户端与授权服务器的交互
Check Access Token:客户端与资源服务器之间的交互 + 资源服务器与授权服务器之间的交互
用一句话概括隐式授权模式授权流程
客户端让用户登录授权服务器换token,客户端使用token访问资源
Client Side
客户端让用户登录授权服务器换token
客户端(浏览器或单页应用)将
client_id + 授权模式标识(grant_type)+ 回调地址(redirect_uri)
拼成url访问授权服务器授权端点
授权服务器跳转用户登录界面,用户登录
用户授权
授权服务器
访问回调地址
返回token给客户端
Check Access Token
客户端使用token访问资源
客户端在请求头中添加token,访问资源服务器
资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
资源服务器校验成功,返回资源
密码模式(Resource Owner Password Credentials Grant)
密码模式大体上也分为两部分:
Client Side: 用户与客户端交互,客户端与授权服务器交互
Check Access Token:客户端与资源服务器之间的交互 + 资源服务器与授权服务器之间的交互
一句话概括用户名密码模式流程:
用户在客户端提交账号密码换token,客户端使用token访问资源
Client Side
用户在客户端提交账号密码换token
客户端要求用户登录
用户输入密码,客户端将表单中添加客户端的client_id + client_secret发送给授权服务器颁发token端点
授权服务器校验用户名、用户密码、client_id、client_secret,均通过返回token到客户端
客户端保存token
Check Access Token
客户端使用token访问资源
客户端在请求头中添加token,访问资源服务器
资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
资源服务器校验成功,返回资源
客户端模式(Client Credentials Grant)
客户端模式大体上分为两部分:
Server Side: 客户端与授权服务器之间的交互
Check Access Token: 客户端与资源服务器,资源服务器与授权服务器之间的交互
一句话概括客户端模式授权流程:
客户端使用自己的标识换token,客户端使用token访问资源
Server Side
客户端使用自己的标识换token
客户端使用client_id + client_secret + 授权模式标识访问授权服务器的
颁发token端点
授权服务器校验通过返回token给客户端
客户端保存token
Check Access Token
客户端使用token访问资源
客户端在请求头中添加token,访问资源服务器
资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
资源服务器校验成功,返回资源
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
来源:https://www.cnblogs.com/hellxz/p/oauth2_process.html


猜你喜欢
- 一、题目要求用原生Python实现knn分类算法。二、题目分析数据来源:鸢尾花数据集(见附录Iris.txt)数据集包含150个数据集,分为
- 本文实例讲述了python开发之基于thread线程搜索本地文件的方法。分享给大家供大家参考,具体如下:先来看看运行效果图:利用多个线程处理
- LRU缓存算法,指的是近期最少使用算法,大体逻辑就是淘汰最长时间没有用的那个缓存,这里我们使用有序字典,来实现自己的LRU缓存算法,并将其包
- 前言在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明。对此,ECMAScript规范明确了一点,
- 哪个Python版本?当我提及Python,所指的就是CPython 2(准确的是2.7).我会显式提醒那些相同的代码在CPython 3
- 今天,启动MySQL服务器失败,如下所示:[root@spark01 ~]# /etc/init.d/mysqld startStartin
- 1. 引言FLOPs 是 floating point operations 的缩写,指浮点运算数,可以用来衡量模型/算法的计算复杂度。本文
- 本文实例为大家分享了TensorFlow实现Logistic回归的具体代码,供大家参考,具体内容如下1.导入模块import numpy a
- 这篇文章主要介绍了Python argparse模块应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 最近,随着数据库的日益庞大,本来两个差不多的数据库,我开始发现我的数据库查询起来越来越比我朋友网站的慢了,经过初步对照,问题好像出在访问记录
- 本文实例讲述了PHP使用Face++接口开发微信公众平台人脸识别系统的方法。分享给大家供大家参考。具体如下:效果图如下:具体步骤如下:首先,
- Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 的设计具有很强的可读性,相比其他语言经常使用英文
- 日常维护中,经常会碰到线程被阻塞,导致数据库响应非常慢,下面就看看如何获取是哪个线程导致了阻塞的。1. 环境说明RHEL 6.4 x86_6
- Anaconda 是一个基于 Python 的数据处理和科学计算平台,它已经内置了许多非常有用的第三方库,装上Anaconda,就相当于把
- MySQL内部复制功能是建立在两个或两个以上服务器之间,通过设定它们之间的主-从关系来实现的。其中一个作为主服务器,其它的作为从服务器。本节
- 反向单位矩阵单位矩阵即对角线为 1,如下:那么反向的单位矩阵就是反对角线为 1:左右镜像操作这里采用 numpy 实现。方案 1import
- 众所周知,Python使用pip方法安装第三方包时,需要从https://pypi.org/资源库中下载,但是会面临下载速度慢,甚至无法下载
- 本文实例讲述了Python列表推导式与生成器表达式用法。分享给大家供大家参考,具体如下:和列表一样,列表推导式也采用方括号[]表示,并且用到
- 1.背景最近项目是国际项目,所以需要经常需要用到UTC时间和local时间的转换。所以整理了一下时间戳工具类,方便使用。这里主要用到的包就是
- 前言使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__方法在类的一个对象被建立时,马上