【分布式技术专题】「授权认证体系」深度解析OAuth2.0协议的原理和流程框架实现指南(授权流程和模式)

简介: 在传统的客户端-服务器身份验证模式中,客户端请求服务器上访问受限的资源(受保护的资源)时,需要使用资源所有者的凭据在服务器上进行身份验证。资源所有者为了给第三方应用提供受限资源的访问权限,需要与第三方共享它的凭据。这就导致一些问题和局限:

背景介绍

在传统的客户端-服务器身份验证模式中,客户端请求服务器上访问受限的资源(受保护的资源)时,需要使用资源所有者的凭据在服务器上进行身份验证。资源所有者为了给第三方应用提供受限资源的访问权限,需要与第三方共享它的凭据。这就导致一些问题和局限:

  • 安全问题:第三方应用需要存储资源所有者的凭据以供将来使用,该凭据通常是明文密码,服务器需要支持密码身份认证,尽管密码认证有固有的安全缺陷。
  • 权限宽泛:第三方应用获得了对资源所有者的受保护资源的过于宽泛的访问权限,从而导致资源所有者不能限制对资源的有限子集的访问时限或权限。
  • 影响范围:资源所有者不能撤销某个第三方的访问权限而不影响其它第三方,并且必须更改他们的密码才能做到。

OAuth通过引入授权层以及从资源所有者角色分离出客户端角色来解决这些问题。在OAuth中,客户端请求对受资源所有者控制且托管在资源服务器上的资源的访问权限,并授予一组不同于资源所有者所拥有的凭据。

OAuth1.0协议

OAuth 1.0协议(RFC5849)作为一个指导性文档发布,是一个小的特设团体的工作成果。本标准化规范在OAuth 1.0的部署经验之上构建,也包括从更广泛的IETF社区收集到其他用户案例和可扩展性需求。本规范是为HTTP(RFC2616)协议设计的。在任何非HTTP协议上使用OAuth不在本规范的范围之内。

访问令牌

  • 作为使用资源所有者的凭据访问受保护资源的替代,客户端获得一个访问令牌———一个代表特定作用域、生命周期以及其他访问权限属性的字符串。
  • 访问令牌由授权服务器在资源所有者认可的情况下颁发给第三方客户端。客户端使用访问令牌访问托管在资源服务器上的受保护资源。

案例分析

例如,终端用户(资源所有者)可以许可一个打印服务(客户端)访问她存储在图片分享网站(资源服务器)上的受保护图片,而无需与打印服务分享自己的用户名和密码,而是,她直接与图片分享网站信任的服务器(授权服务器)进行身份验证,该服务器颁发给打印服务具体的委托凭据(访问令牌)。

OAuth2.0

OAuth 2.0是用于授权的行业标准协议。OAuth 2.0专注于简化客户端开发人员,同时为web应用程序、桌面应用程序、移动电话和客厅设备提供特定的授权流程。该规范及其扩展正在IETF OAuth工作组内开发。OAuth 2.1是一项正在进行的工作,它将OAuth 2.0和许多常见扩展合并到一个新名称下。

OAuth 2.0授权框架允许第三方应用程序获取对HTTP服务的有限访问权限通过编排审批交互来代表资源所有者在资源所有者和HTTP服务之间,或者通过允许第三方应用程序以自己的名义获得访问权限。

OAuth2.0与OAuth1.0

OAuth 2.0协议不向后兼容OAuth 1.0。这两个版本可以在网络上共存,实现者可以选择同时支持他们。然而,本规范的用意是新的实现按本文档的规定支持Auth 2.0,OAuth 1.0仅用于支持现有的部署。OAuth 2.0协议与OAuth 1.0协议实现细节没有太多关联。熟悉OAuth 1.0的实现者应该理解本文档,而非对有关OAuth 2.0的结构和细节做任何假设。

OAuth2.0协议体系的Roles角色

OAuth定义了四个角色

OAuth2.0主要包含了四个角色类,如下图所示。

资源所有者

能够授予对受保护资源的访问权限的实体。当资源所有者是一个人时,它被称为终端用户。

资源服务器

承载受保护资源的服务器,能够接受并使用访问令牌响应受保护的资源请求。

客户端

发出受保护资源请求的应用程序资源所有者及其授权。“客户端”一词就是这样不暗示任何特定的实现特征(例如,应用程序是在服务器、桌面还是其他设备上执行设备)。

授权服务器

服务器向客户端发出访问令牌验证资源所有者并获取授权,授权服务器可以和资源服务器是同一台服务器,也可以是分离的个体。一个授权服务器可以颁发被多个资源服务器接受的访问令牌。


传统的客户机-服务器身份验证模型的问题

在传统的客户机-服务器身份验证模型中请求访问受限的资源(受保护的资源),服务器通过使用资源所有者的服务器进行身份验证凭证。以便提供第三方应用程序访问受限制的资源,资源所有者与之共享其凭据第三方。这就产生了一些问题和限制。

  • 需要第三方应用程序来存储该资源供将来使用的所有者凭据,通常是一个密码以明文。
  • 服务器需要支持密码身份验证,尽管密码固有的安全弱点。
  • 第三方应用程序对资源的访问过于广泛所有者受保护的资源,使资源所有者没有任何的有限子集限制持续时间或访问的能力资源。
  • 资源所有者不能撤销对单个第三方的访问不得撤销所有第三方的访问权限,并且必须通过修改第三方密码。
  • 任何第三方应用程序的泄露都会导致的泄露终端用户的密码以及受其保护的所有数据密码。

协议流程

上图中所示的抽象OAuth 2.0流描述了这四个角色之间的交互包括以下步骤:

  1. 客户端向资源所有者请求授权。授权请求可以直接发给资源所有者,或者更好的方式是通过授权服务器作为中介进行间接请求。
  2. 客户端收到授权许可,这是代表资源所有者授权的凭证,使用本规范中定义的四种许可类型之一,或者使用扩展许可类型来表示。
    • 授权许可类型取决于客户端请求授权所使用的方法,以及授权服务器支持的类型。
  3. 客户端与授权服务器进行身份认证,并展示授权许可来获取访问令牌。
  4. 授权服务器验证客户端的身份,并验证授权许可的有效性。如果有效,授权服务器颁发访问令牌。
  5. 客户端向资源服务器请求受保护的资源,并出示访问令牌进行身份验证。
  6. 资源服务器验证访问令牌的有效性,如果有效,则处理该请求。

使用授权服务器作为中介可以确保授权过程的可靠性和一致性,还可以提供额外的保护措施来防止潜在的安全漏洞。因此,建议客户端在获取授权许可时使用授权服务器作为中介

认证授权类型

授权许可是一个代表资源所有者授权(访问受保护资源)的凭据,客户端用它来获取访问令牌。本规范定义了四种许可类型——授权码、隐式许可、资源所有者密码凭据和客户端凭据——以及用于定义其他类型的可扩展性机制。

授权码模式

授权码通过使用授权服务器做为客户端与资源所有者的中介而获得。客户端不是直接从资源所有者请求授权,而是引导资源所有者至授权服务器,授权服务器之后引导资源所有者带着授权码回到客户端。

在引导资源所有者携带授权码返回客户端前,授权服务器会鉴定资源所有者身份并获得其授权。由于资源所有者只与授权服务器进行身份验证,所以资源所有者的凭据不需要与客户端分享。

授权码提供了一些重要的安全益处,例如验证客户端身份的能力,以及向客户端直接的访问令牌的传输而非通过资源所有者的用户代理来传送它而潜在暴露给他人(包括资源所有者)

隐式许可模式

隐式许可是一种针对在浏览器中使用JavaScript等脚本语言实现的客户端进行优化的简化的授权码流程。在隐式许可流程中,不再颁发授权码给客户端,而是直接颁发一个访问令牌作为资源所有者的授权。这种许可类型是隐式的,因为没有中间凭证(如授权码)被颁发,后者通常用于获取访问令牌。

在隐式许可流程中,授权服务器不对客户端进行身份验证,有时候可以通过验证用于传送访问令牌的重定向URI来验证客户端身份。访问令牌可能会暴露给资源所有者,或者被其他应用程序具有资源所有者的用户代理权限的访问。

隐式许可的优势和劣势

隐式许可提高了一些客户端(例如,嵌入在浏览器中的应用程序)的响应速度和效率,因为它减少了获取访问令牌所需的往返次数。然而,使用隐式许可时,需要权衡便利性和安全影响,特别是在存在授权码许可类型的情况下。这是因为,在某些安全方面,授权码许可类型更为可靠和安全。

资源所有者密码凭据

资源所有者密码凭据(即用户名和密码)可以直接用于获取访问令牌的授权。这种方式应当在资源所有者和客户端之间具有高度信任时使用,例如当客户端是设备的操作系统的一部分,或者是一个高度特权的应用程序,以及当其他授权许可类型(例如授权码)不可用时。

虽然这种授权类型需要直接使用资源所有者凭据进行客户端访问,但资源所有者凭据只会被用于一次请求,然后被交换为访问令牌。通过凭据和长期有效的访问令牌或刷新令牌的互换,这种许可类型可以消除客户端存储资源所有者凭据供将来使用的需要。

客户端凭据

当授权范围限于客户端控制下的受保护资源或事先与授权服务器商定的受保护资源时客户端凭据可以被用作为一种授权许可。典型的当客户端代表自己表演(客户端也是资源所有者)或者基于与授权服务器事先商定的授权请求对受保护资源的访问权限时,客户端凭据被用作为授权许可。

相关文章
|
安全 算法 网络协议
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
837 27
|
NoSQL 算法 安全
分布式锁—1.原理算法和使用建议
本文主要探讨了Redis分布式锁的八大问题,包括非原子操作、忘记释放锁、释放其他线程的锁、加锁失败处理、锁重入问题、锁竞争问题、锁超时失效及主从复制问题,并提供了相应的优化措施。接着分析了Redis的RedLock算法,讨论其优缺点以及分布式专家Martin对其的质疑。此外,文章对比了基于Redis和Zookeeper(zk)的分布式锁实现原理,包括获取与释放锁的具体流程。最后总结了两种分布式锁的适用场景及使用建议,指出Redis分布式锁虽有性能优势但模型不够健壮,而zk分布式锁更稳定但部署成本较高。实际应用中需根据业务需求权衡选择。
|
人工智能 自然语言处理 搜索推荐
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
ViDoRAG 是阿里巴巴通义实验室联合中国科学技术大学和上海交通大学推出的视觉文档检索增强生成框架,基于多智能体协作和动态迭代推理,显著提升复杂视觉文档的检索和生成效率。
1022 8
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
|
机器学习/深度学习 数据可视化 PyTorch
深入解析图神经网络注意力机制:数学原理与可视化实现
本文深入解析了图神经网络(GNNs)中自注意力机制的内部运作原理,通过可视化和数学推导揭示其工作机制。文章采用“位置-转移图”概念框架,并使用NumPy实现代码示例,逐步拆解自注意力层的计算过程。文中详细展示了从节点特征矩阵、邻接矩阵到生成注意力权重的具体步骤,并通过四个类(GAL1至GAL4)模拟了整个计算流程。最终,结合实际PyTorch Geometric库中的代码,对比分析了核心逻辑,为理解GNN自注意力机制提供了清晰的学习路径。
872 7
深入解析图神经网络注意力机制:数学原理与可视化实现
|
机器学习/深度学习 缓存 自然语言处理
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
1563 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
|
传感器 人工智能 监控
反向寻车系统怎么做?基本原理与系统组成解析
本文通过反向寻车系统的核心组成部分与技术分析,阐述反向寻车系统的工作原理,适用于适用于商场停车场、医院停车场及火车站停车场等。如需获取智慧停车场反向寻车技术方案前往文章最下方获取,如有项目合作及技术交流欢迎私信作者。
1043 2
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
871 3
|
运维 NoSQL 算法
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
993 0
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS