OIDC OAuth2.0 协议及其授权模式详解|认证协议最佳实践系列【1】

news2024/11/27 6:13:39

OIDC / OAuth2.0 是一种开放的标准,可以帮助应用程序安全地访问用户的资源,而无需将用户的凭据(如用户名和密码)暴露给应用程序,我们可以通过标准协议,建立集中的用户目录和统一认证中心,将内外部业务系统的登录认证统一到认证中心,实现集中化的管理,从而避免每套业务系统都要搭建一套用户体系所造成的管理侧不便及安全侧的风险。

本文将带各位详细了解 OAuth 2.0 & OIDC 及其授权模式

01 协议介绍

1.1 OAuth 2.0 & OIDC

OAuth 2.0 是一个授权框架,使应用程序能够获得对 HTTP 服务上用户帐户的有限访问权限,例如 Facebook、GitHub 和 DigitalOcean。它通过将用户认证委托给托管用户帐户的服务,并授权第三方应用程序访问用户帐户来实现。

OpenID Connect (OIDC) 是建立在 OAuth 2.0 框架之上的简单身份层。它在 OAuth 2.0 提供的授权的基础上添加了认证。

初看上面这段话你可能很难理解,这里用白话解释下,OAuth 2.0 在设计之初,是为了 API 安全的问题,它是一个授权协议,而 OIDC 则在 OAuth2.0 协议的基础上,提供了用户认证、获取用户信息等的标准实现,当然我们也可以理解获取用户信息也是一个 API ,用 OAuth 2.0 也没问题的,考虑到读者的感受,在这里不要过于纠结,只要记住 OIDC 是完全兼容 OAuth2.0 的,我们现在也推荐用 OIDC

1.2 术语介绍

啥啥啥,写的这都是啥,小白看到这些脑袋都大了,我在这里重点说下 OIDC/OAuth2.0 协议交互时所参与的几个角色,等你对协议熟悉了,可以反过头来再看下相关的介绍,在接下来的授权模式介绍中,我们会结合这四个角色,介绍下不同授权模式的流程。

  • 资源持有者(End User / Resource Owner) 终端用户

  • 应用/客户端(Client)应用的前端,可以是 web 端、App 端、移动端应用

  • 资源服务器(Resource Server) Client 对应的后台

  • 认证服务器(OpenID Provider / Auhtorization Server)即 Authing

1.3 Client 类型介绍

OAuth2.0 / OIDC 中定义了 2 种 Client 类型:

我们在这里解释下:

Confidential Clients 机密型应用:能够安全的存储凭证(client_secret),例如有后端服务,你的前端是 Vue,后台是 Java ,那么可以理解为机密性应用,因为你的后端能够安全的保存 client_secret,而不会将 client_secret 直接暴露给用户,此时你可以使用授权码模式。

Public Clients 公共型应用:无法安全存储凭证(Client Secrets),例如 SPA 、移动端、或者完全前后端分离的应用,应当使用授权码 + PKCE 模式

1.4 OIDC 授权模式与选型建议

重点来啦!我们要了解授权模式,才能更好的针对系统类型进行授权模式的选型,避免由于授权模式选型不当所造成的开发工作增加和安全侧的漏洞。

  • 授权模式

  • 选型建议

02 授权模式详细介绍

2.1 授权码模式(Authorization Code)

授权码模式适合应用具备后端服务器的场景。授权码模式要求应用必须能够安全存储密钥,用于后续使用授权码换 Access Token。授权码模式需要通过浏览器与终端用户交互完成认证授权,然后通过浏览器重定向将授权码发送到后端服务,之后进行授权码换 Token 以及 Token 换用户信息。

整体上,有以下流程

  1. 在你的应用中,让用户访问登录链接,浏览器跳转到 Authing,用户在 Authing 完成认证。

  2. 浏览器接收到一个从 Authing 服务器发来的授权码。

  3. 浏览器通过重定向将授权码发送到你的应用后端。

  4. 你的应用服务将授权码发送到 Authing 获取 AccessToken 和 IdToken,如果需要,还会返回 refresh token。

  5. 你的应用后端现在知道了用户的身份,后续可以保存用户信息,重定向到前端其他页面,使用 AccessToken 调用资源方的其他 API 等等。

流程图如下

2.2 授权码 + PKCE 模式(Authorization Code With PKCE)

如果你的应用是一个 SPA 前端应用或移动端 App,建议使用授权码 + PKCE 模式来完成用户的认证和授权。授权码 + PKCE 模式适合不能安全存储密钥的场景(例如前端浏览器) 。

我们解释下 code_verifier 和 code_challenge。

code_verifier:在 [A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~" 范围内,生成43-128位的随机字符串。 code_challenge:则是对 code_verifier 通过 code_challenge_method 例如 sha256 转换得来的。

用大白话讲下就是在认证是用户携带的是加密后的 code_challenge ,在用户认证成功获取 Token 时,客户端证明自己的方式则是把 code_verifier 原文发送,认证中心收到获取 Token 请求时通过 code_verifier + code_challenge_method 进行转换,发现最终结果与 code_challenge 匹配则返回 Token ,否则拒绝。

整体上,有以下流程:

  1. 在你的应用中,让用户访问登录链接(包含 code_challenge ) ,浏览器跳转到 Authing,用户在 Authing 完成认证。

  2. 浏览器接收到一个从 Authing 服务器发来的授权码。

  3. 浏览器通过重定向将授权码发送到你的应用前端。

  4. 你的应用将授权码和 code_verifier 发送到 Authing 获取 AccessToken 和 IdToken,如果需要,还会返回 Refresh token。

  5. 你的应用前端现在知道了用户的身份,后续使用 Access token 换取用户信息,重定向到前端其他页面,使用 AccessToken 调用资源方的其他 API 等等。

流程图如下

2.3 客户端凭证模式(Client Credentials)

Client Credentials 模式用于进行服务器对服务器间的授权(M2M 授权),期间没有用户的参与。你需要创建编程访问账号,并将 AK、SK 密钥对交给你的资源调用方。

注意:Client Credentials 模式不支持 Refresh Token

整体上,有以下流程

  1. 资源调用方将他的凭证 AK、SK 以及需要请求的权限 scope 发送到 Authing 授权端点。

  2. 如果凭证正确,并且调用方具备资源权限,Authing 为其颁发 AccessToken。

流程图如下

2.4 隐式模式(Implicit)(不推荐)

隐式模式适合不能安全存储密钥的场景(例如前端浏览器),不推荐此模式,建议采用其他模式。在隐式模式中,应用不需要使用 code 换 token,无需请求 /token 端点,AccessToken 和 IdToken 会直接从认证端点返回

注意:因为隐式模式用于不能安全存储密钥的场景,所以隐式模式不支持获取 Refresh Token

整体上,有以下流程

  1. 在你的应用中,让用户访问登录链接,浏览器跳转到 Authing,用户在 Authing 完成认证。

  2. Authing 将浏览器重定向到你的应用回调地址,AccessToken 和 IdToken 作为 URL hash 传递。

  3. 你的应用从 URL 中取出 token。

  4. 你的应用可以将 AccessToken 与 IdToken 保存,以便后续使用,例如携带 AccessToken 访问资源服务器,携带 IdToken 请求服务端从而服务端能够辨别用户身份。

流程图如下

2.5 密码模式(Password)(不推荐)

不推荐使用此模式,尽量使用其他模式。只有其他模式都无法解决问题时才会考虑使用密码模式。如果使用密码模式,请确保你的应用代码逻辑非常安全,不会被黑客攻击,否则将会直接泄露用户的账密。一般用于改造集成非常古老的应用,否则绝对不要把它作为你的第一选择。

整体上,有以下流程

  1. 你的应用让用户输入账密信息。

  2. 你的应用将用户账密发送到 Authing 。

  3. 如果账密正确,Authing 返回 token 。

流程图如下

2.6 设备代码模式(Device Code)(几乎用不到)

对于一些连接到互联网的输入受限设备,设备不会直接验证用户身份,而是让用户通过链接或二维码转到手机或电脑上进行认证,从而避免了用户无法轻松输入文本所带来的糟糕体验。

Device Code Flow这个与前面几个不太一样,开始不再是由资源持有者发起,而是由客户端开始。甚至登录的方法与客户端还没有特别的关联。

大致流程说明如下

  1. 客户端发起向认证服务器取得 device_code 和user_code 。

  2. 客户端通过二维码或者其他方式将 user_code交给资源持有者。

  3. 资源持有者透过某个端点 (endpoint) 与user_code 进行认证。

  4. 客户端通过 device_code 轮训认证服务器是否有人认证,若有人认证则会返回 access_token 。

流程图如下

 一个设计良好的系统,都需要一个标准、安全、可扩展的用户认证协议,无论是 ToC 还是 ToE ,接来下我们还会针对具体的授权模式结合实际场景讲一下具体的模式。

本章总结

  1. 本章我们介绍了 OIDC 和 OAuth2.0 两个协议,在使用起来,这两个协议并没有太大的区别,OAuth2.0 是一个授权协议,OIDC 协议则是在 OAuth2.0 的提供的授权的基础上添加了认证。

  2. 授权模式,我们分别介绍了授权码模式(Authorization Code) 、授权码 + PKCE 模式(Authorization Code With PKCE) 、客户端凭证模式(Client Credentials) 、隐式模式(Implicit)(不推荐)、密码模式(Password) (不推荐)、设备代码模式(Device Code)(几乎用不到) 。

  3. 授权模式选择

  • 如果我们的应用是 WEB 端应用,那我们应该选择授权码模式(Authorization Code)

  • 如果我们是原生应用,例如 SPA ,移动端,那我们应该选择授权码 + PKCE 模式(Authorization Code With PKCE)

  • 如果我们是想把应用的 API 给第三方服务安全的调用,则需要选择客户端凭证模式(Client Credentials)

接下来我们还会详细介绍授权码模式(Authorization Code)、授权码 + PKCE 模式(Authorization Code With PKCE)、客户端凭证模式(Client Credentials)如何接入 Authing。敬请期待!

推荐阅读:

如何使用 Authing 实现 AWS CLI 单点登录?_Authing的博客-CSDN博客

如何增强企业数字敏捷性?|身份云研究院_Authing的博客-CSDN博客

插件开发版|Authing 结合 APISIX 实现统一可配置 API 权限网关_Authing的博客-CSDN博客

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

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

相关文章

健身的时候可以戴耳机吗、最适合健身时佩戴的耳机推荐

戴着耳机锻炼,听着动感的音乐,会让你心潮澎湃,瞬间感觉自己力大无穷。那什么样的耳机更适合在健身房锻炼时戴呢?首先稳固性和舒适度一定要比较好,毕竟在运动的过程中老是感觉到不适或者掉落,那真的是很令人…

计算机组成原理:3. 系统总线

更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验 文章目录3.1 总线的基本概念3.1.1 总线的定义3.1.2 总线的分类片内总线系统总线通信总线3.2 总线特性及性能指标3.2.1 总线特性3.2.2 总线性能指标3.2.3 总线标准3.3 总线结构3.3.1 单总线结构3.3.2 多总线结构…

AD域备份和恢复工具

Microsoft的本地Active Directory备份和恢复功能不适用于对象级备份和属性级还原。使用RecoveryManager Plus,您不仅可以备份和还原所有AD对象,还可以备份和还原其他基本AD元素,例如架构属性,组成员身份信息和Exchange属性。此外&…

字符串中<br>处理

需求: 后端返回的字符串中带有br换行符,前端需要处理行内及行尾的换行符。具体需求可分为以下两个: 若是字符串末尾有换行符,需要去掉。若是字符串内有换行符,有两种需求:①将换行符转换成逗号或其它符号&…

年薪30万,我也曾达到人生巅峰,入职字节一个月,却被无情被裁......

今年的金三银四并不像往年那样有铺天盖地的岗位和约不过来的面试机会,再看正在招聘的岗位,动不动就要求代码能力,能开发自动化测试平台,能对已有xxx框架二次开发,还要上机笔试,变态程度不亚于古代皇帝选妃了…

uni-app Some selectors are not allowed in component wxss解决方案

报错信息如下 Some selectors are not allowed in component wxss, including tag name selectors, ID selectors, and attribute selectors. 注意看尾巴, (./uni_modules/uni-load-more/components/uni-load-more/uni-load-more.wxss:65:29) 打开这个组件uni-lo…

工厂在智慧升级过程中,企业需要用到哪些系统呢?

今天我们优先来分析一下流程制造型企业的需求。流程制造行业智能工厂要实现智能化,必须包含生产管理、供应链管理、工艺管理、设备管理、质量管理等全生命周期业务流程,那么这个全生命周期业务流程相对应的平台就会有以下几大平台来分别实现智能化&#…

Linux驱动开发—最详细应用程序调用驱动程序解析

Linux下应用程序调用驱动程序流程 Linux下进行驱动开发,完全将驱动程序与应用程序隔开,中间通过C标准库函数以及系统调用完成驱动层和应用层的数据交换。驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对“/dev/xxx” (xxx 是具体的驱动文件名字) 的文…

深度分析2种最常用待办事项清单法+工具实操

建待办事项清单的方法有很多种,你可能已经熟悉了其中一种,但没有了如指掌,恐怕也没有想过哪种方法最适合自己,给大家整理当下职场最常用的两个代办清单事项方法,只需看这两个就够你用几年了。 一、四象限法 “四象限…

全面分析前端的网络请求方式(对ajax理解的勘误)

文章目录前言AjaxFetchAxios三者关系前言 在掘金看到一篇关于ajax和fetch以及aixos的文章,才发现自己对ajax的理解是错误的,一直以为ajax就是js中xhr对象,把他们两之间画上了等号,殊不知从根本上就理解错了。 这里就不对原生的xh…

疯狂的SOVA:Android银行木马“新标杆”

2021年8月初,一款针对Android银行APP的恶意软件出现在人们的视野中,ThreatFabric 安全研究人员首次发现了这一木马,在其C2服务器的登录面板,研究人员发现,攻击者将其称之为SOVA。 ** SO** ** V** ** A简介** 在俄语中…

Mac Maven环境搭建安装和配置详细步骤

一、Maven简介Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作。二、Mavende优点1、原来的项目中需要的jar包必须手动“复制”、”粘贴” 到WEB-INF/l…

产品经理必懂的技术知识

API 是不是经常听见程序猿小哥哥A说:“这个简单,直接调用现成的接口就可实现。 一会儿程序猿小哥哥B说:“你这个不行,我们的第三方服务接口不支持。” 此时你的心里活动:API ≈ 听不懂 啥子是接口哦?接口…

git合并分支

在复杂系统的开发过程中,我们经常需要通过不同的功能或环境分支来进行管理,那么开发阶段完成时,还需要进行合并,下边分享一下合并的流程:首先确保要合并的两个分支 本地分支与远程分支一致可以通过IDEA切换对应分支拉取…

【已解决】解决IDEA的maven刷新依赖时出现Connot reconnect错误

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习&#…

SAP分析云2023年第一季度亮点更新介绍

本文介绍了SAP分析云2023年第1季度的季度发布(QRC)新功能和增强功能。较于以往的版本,这次的更新在系统管理和服务管理、增强分析、业务内容交付、仪表盘和故事设计、Microsoft集成等方面做了产品的功能更新改进。那就和阿拓一起看看吧&#…

工作中,python真的有用吗?

普通上班族学Python有用吗? 那么,我也在这里提出一个问题:Python究竟适不适合办公人士来学习,以及学了之后究竟能不能给我的工作来带质一般的飞跃? 以我的亲身经历为例,我可以很负责的告诉大家&#xff0c…

Liunx服务器安装SVN

一、下载svn安装包链接:https://pan.baidu.com/s/1gkS0tef2kQP6nvXOS64hUw 提取码:cyuw二、SVN安装部署通过sftp将文件拉取到目的主机路径:/usr/package 跳转文件路径: cd /usr/package 执行解压命令:tar -zxvf subversion-1.14.2.tar.gz 执行…

Mysql的安装、语法、优化

1 数据库 数据库是存储数据,管理数据的仓库。 常见的数据库有两种: 关系型数据库:数据关系紧密。关系模型是二维表格模型,一个关系型数据库就是由二维表及其之间的关系组成的一个数据集合。 Oracle、MySQL、SQLServer、Access…

基础算法一:同向双指针

同向双指针——滑动窗口 讲解实例:LeetCode209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合…