什么是OAuth2分布式授权协议?

2024-06-21 17:52
文章标签 协议 分布式 授权 oauth2

本文主要是介绍什么是OAuth2分布式授权协议?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天我将和大家一起探讨在系统安全领域非常常见的一种授权协议,这就是OAuth2协议,这个协议通常用于对请求访问进行安全控制。在引入这个协议之前,让我们先来回顾两个基本概念,一个是认证,一个是授权。这两个概念比较容易混淆,它们的英文也比较类似,分别是Authentication和Authorization。

我们首先需要明确,所谓认证,解决的是“你是谁”这一个问题,也就是说对于每一次访问请求,系统都能判断出访问者是否具有合法的身份标识。

一旦明确 “你是谁”之后,下一步就可以判断“你能做什么”,这个步骤就是授权。通用的授权模型通常都是基于权限管理体系的,也就是说是对资源、权限、角色和用户的一种组合处理。

如果我们将认证和授权结合起来,就构成了对系统中资源进行安全性管理的一种最常见的解决方案,也就是说先判断资源访问者的有效身份,然后再来确定他是否具备对这个资源进行访问的合法权限,如下图所示:


我们今天要介绍的OAuth2协议本质上是一种授权协议,解决的是分布式环境下开放和消费第三方接口中的授权问题。为了更好的理解OAuth2协议的应用场景,我们来看一个例子。

在提倡互联网医疗的大背景下,假设说你要开发一个中医问诊平台,该平台可以根据用户存储在康美大药房(一家知名的中医在线购药平台)中的中药饮片购买记录来智能地计算用户所可能具有的中医症状,并自动推荐相关的中医专家。这样的话,用户为了使用问诊服务,就必须让该问诊平台读取自己在康美大药房上的药品购买记录。

在这个场景中,难点在于只有得到用户的授权,康美大药房才会同意问诊平台读取用户的药品购买记录。那么问题就来了,问诊平台怎么样才能获得用户的授权呢?一般想到的方法是用户将自己的康美大药房用户名和密码告诉问诊平台,然后问诊平台就可以通过用户名和密码登录到康美大药房并读取用户的购药记录,整个过程如下图所示:


上图中的方案虽然可行,但显然存在几个严重的缺点:

  1. 问诊平台为了开展后续的服务,会保存用户在康美大药房上的密码,这样很不安全。
  2. 问诊平台拥有了获取用户存储在康美大药房上所有资料的权力,用户没法限制问诊平台获得授权的范围和有效期。
  3. 用户只有修改密码,才能收回赋予问诊平台的权力,但是这样做会使得其他所有获得用户授权的类似问诊平台的第三方应用程序全部失效。
  4. 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据产生泄漏。

既然这个方案有这么多问题,那么有没有更好的办法呢?答案是肯定的,OAuth2协议的诞生就是为了解决这些问题。

针对上述场景,我们实际上已经引出了OAuth2协议中所具备的四个核心角色,如下图所示:


在上图中,我们注意到:

  1. OAuth 2协议中把需要访问的接口或服务统称为资源(Resource), 每个资源都有一个拥有者(Resource Owner),也就是案例中的用户。
  2. 案例的中医问诊平台代表的是一种第三方应用程序(Third-party Application),通常被称为客户端(Client)。客户端在获得资源所有者的授权后可以去访问对应的资源。
  3. 康美大药房在案例中的角色是服务提供商,拥有一个资源服务器(Resource Server)和一个授权服务器(Authorization Server)。其中资源服务器存放着用户资源,案例中的用户购药记录就是一种用户资源。而授权服务器则对资源拥有者的身份进行认证,完成授权审批流程,并最终颁发一个访问令牌(Access Token)

进到这里,你可能会问,所谓的访问令牌是什么?令牌是OAuth2协议中非常重要的一个概念,本质上也是一种代表用户身份的授权凭证,但与普通的用户名和密码信息不同,令牌具有针对资源的访问权限范围和有效期,如下所示就是常见的一种令牌信息:

{

    "access_token": "b7c2c7e0-0223-40e2-911d-eff82d125b80",

    "token_type": "bearer",

    "refresh_token": "40ee99d5-90f6-43ce-920f-383a619fc806",

    "expires_in": 43199,

    "scope": "webclient"

}

  1. 上述信息中的access_token 就是OAuth2的令牌,当访问每个受保护的资源时,用户都需要携带这个令牌以便进行验证
  2. 针对token_type,OAuth2协议中有很多中可选的令牌类型,包括bearer类型、mac类型等,这里指定的是最常见的一种类型,就是bearer类型;
  3. expires_in属性用于指定access_token的有效时间,当超过这个有效时间的时候,access_token将会自动失效
  4. refresh_token的作用在于,当access_token 过期之后,重新下发一个新的access_token;
  5. scope指定了可访问的权限范围,这里指定的是访问Web资源的“webclient”

介绍完令牌之后,你可能会好奇这样一个令牌究竟有什么用?接下来,就让我们来看一下如何基于令牌来完成基于OAuth2协议的授权工作流程,整个流程如下图所示:


上图流程中包含了以下6个核心步骤:

  1. 客户端请求用户的授权,请求中一般包含资源的访问路径、对资源的操作类型等信息
  2. 用户同意给予客户端授权,并将这个授权发送给客户端
  3. 客户端向授权服务器请求访问令牌。此时,客户端需要向授权服务器提供上一步获取的授权信息,以及客户端自身的有效身份凭证
  4. 授权服务器验证通过后,向客户端返回访问令牌
  5. 客户端携带访问令牌访问资源服务器上的资源。在令牌的有效期内,客户端可以多次携带令牌去访问资源。
  6. 资源服务器验证令牌的有效性以及是否过期,验证通过后才能开放服务。

在整个工作流程中,最为关键的是第二步,只有获取了这个授权之后,客户端才可以获取令牌,进而凭令牌获取资源。那么用户如何才能获取客户端授权呢?在OAuth 2.0中,定义了四种授权方式,即授权码模式(Authorization Code)、简化模式(Implicit)、密码模式(Password Credentials)和客户端模式(Client Credentials):


这里我们先来介绍最常用的授权码模式。授权码模式功能最完整,流程也最严密,该模式的特点就是通过客户端系统的后台服务器,与服务提供商的授权服务器进行交互,如下图所示:


上图中的的几个步骤说明如下:

  1. 用户访问客户端,客户端会将用户导向授权服务器。
  2. 用户选择是否给予客户端授权。
  3. 假设用户给予授权,授权服务器将用户导回客户端事先指定的回调地址,同时附上一个授权码。
  4. 客户端收到授权码,并附上回调地址,向授权服务器申请令牌。这一步是在客户端系统的后台服务上完成的,对用户不可见。
  5. 授权服务器核对授权码和回调地址,确认无误后,向客户端发送访问令牌。

授权码模式的特点在于当用户同意授权后,授权服务器不是马上返回最终的令牌,而是一个授权码,需要客户端携带授权码去换令牌,这就需要客户端自身具备与授权服务器进行直接交互的后台服务。

讲完授权码模式,我们再来看另一种比较常用的密码模式。相较授权码模式,密码模式比较简单,也更加容易理解,它的工作流程如下图所示:


在密码模式下,用户向客户端提供用户名和密码,然后客户端将用户名和密码发给授权服务器并请求令牌,授权服务器确认无误后,就会向客户端发放令牌。以目前主流的微服架构而言,当我们发起HTTP请求时,关注的是如何通过HTTP协议透明而高效的传递令牌,授权码模式下通过回调地址进行授权管理的方式就不是很实用,密码模式反而更加简洁高效。

到这里为止,我们已经把OAuth2协议的主题内容都介绍到了。你可能也已经注意到,虽然说OAuth2协议解决的是授权问题,但它也应用到了认证的概念,因为只有验证了用户的身份凭证,我们才能完成对他的授权。所以说,OAuth2是一款技术体系比较复杂的协议,综合应用了信息摘要、签名认证等安全性手段,并需要提供令牌以及背后的公私钥管理等功能。

这篇关于什么是OAuth2分布式授权协议?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081921

相关文章

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A