什么是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是一款技术体系比较复杂的协议,综合应用了信息摘要、签名认证等安全性手段,并需要提供令牌以及背后的公私钥管理等功能。

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

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

相关文章

探索产业园的独特产业定位与价值

数字影像产业园的产业定位独特且全面,涵盖了数字贸易、数字服务、数字文旅和数字基建四大主导产业方向,体现了园区在数字化转型和产业升级方面的前瞻性和创新性。 一、数字贸易的推动者 数字影像产业园致力于推动数字贸易的发展,搭建全球化、…

mysql中的lead函数和over函数

文章目录 mysql中的lead函数和over函数作用需求场景实现方法group by分组和使用over函数分组有什么区别? mysql中的lead函数和over函数 作用 over函数是用来分组加排序的,然后等over函数分好组排好序之后,再使用lead函数去找当前分组内的下…

NUC980-OLED实现全中文字库的方法

1.背景 有一个产品,客户需要屏幕展示一些内容,要带一些中文,实现了OLED12864的驱动,但是它不带字库,现在要实现OLED全字库的显示 2.制作原始字库 下载软件pctolcd2002 设置 制作字库 打开原始文件 用软件自带的&…

“用友审批+民生付款”,YonSuite让企业发薪更准时

随着现代企业经营模式的不断创新和市场竞争的加剧,企业薪资管理和发放的效率、准确性和及时性已成为企业管理的重要一环。然而,在实际操作中,许多企业面临着薪资管理复杂、发放流程繁琐、数据不准确等难点和痛点。为了解决这些问题&#xff0…

山海鲸可视化自学2

如何使用iframe导入地图组件&#xff0c;并且与山海鲸内元素进行交互 以天地图为例 下面是个index.html文件&#xff0c;一定是index.html 在这里插入代码片 <!DOCTYPE html> <html><head><meta http-equiv"content-type" content"text…

【重磅消息】微软开源了自家的Florence-2,处理各种视觉任务的统一模型

在人工通用智能&#xff08;AGI&#xff09;系统的世界里&#xff0c;一个重要的转变正在发生&#xff0c;那就是利用多功能的、预先训练好的表征&#xff0c;在各种应用中表现出与任务无关的适应性。这种转变始于自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;现在…

机械硬盘和固态硬盘的区别及判断硬盘类型的方法

HDD&#xff08;机械硬盘&#xff09;和 SSD&#xff08;固态硬盘&#xff09;的主要区别 存储介质 HDD&#xff1a;使用磁性盘片&#xff08;磁盘&#xff09;和机械读写头SSD&#xff1a;使用闪存芯片 速度 HDD&#xff1a;读写速度较慢&#xff0c;因为需要机械读写头在…

新学期分班群发话术

尊敬的家长们&#xff1a; 我是XX学校X年级的班主任XXX老师。随着新学期的到来&#xff0c;我带着满心的期待和责任&#xff0c;向各位宣布一个重要的信息&#xff1a;本校即将开始新学年的分班工作。 分班的目的&#xff1a; 分班是为了适应不同学生的学习需求&#xff0c;确…

SaaS企业营销:PLG转型下SaaS企业如何成为赢家

在数字化浪潮的推动下&#xff0c;SaaS&#xff08;软件即服务&#xff09;行业正经历着前所未有的变革。特别是随着产品引领增长&#xff08;PLG&#xff09;模式的兴起&#xff0c;SaaS企业正面临着前所未有的机遇与挑战。如何在PLG转型中脱颖而出&#xff0c;成为行业赢家&a…

汇川学习笔记7 - 雕刻机项目

1、系统上电轴准备好之后&#xff0c;自动复回原点一次&#xff0c; 2、在雕刻机面板上有三个按钮用来控制画三种图形 3、注意cnc代码放置的文件夹 4、FILE0文件内容 5、FILE1文件内容 6、FILE2文件内容 7、程序代码下载地址 https://download.csdn.net/download/qq_6191667…

下载LLM

0.导入相关依赖 # 升级pip python -m pip install --upgrade pip# 下载速度慢可以考虑一下更换镜像源。 # -i https://pypi.tuna.tsinghua.edu.cn/simplepip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0…

无需科学上网:轻松实现国内使用Coze.com平台自己创建的Bot(如何实现国内免费使用GPT-4o/Gemini等最新大模型)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 如何在国内使用 Coze.com 创建的 Bot 📒📝 创建Bot📝 实现国内使用📝 测试⚓️ 相关链接 ⚓️📖 介绍 📖 Coze.com 是一个强大的平台,允许用户创建各种类型的 Bot。然而,许多国内用户可能会遇到访问问题,导致无法…

Centos7.9安装openldap

文章目录 一、背景二、正文2.1 openldap服务端必要软件安装2.1.1使用yum命令安装2.1.2安装libdb相关依赖2.1.3复制一个默认配置到指定目录下&#xff0c;并授权&#xff0c;这一步一定要做&#xff0c;然后再启动服务&#xff0c;不然生成密码时会报错2.1.4授权给ldap用户&…

windows系统共享文件时,有权限文件访问被拒绝

我们在使用windows操作系统的时候&#xff0c;需要复制或者更改网络中的共享文件。但是有时候会出现图下的情况&#xff1a;文件访问被拒绝 查看共享文件的安全属性&#xff0c;发现Everyone的权限是完全控制的 这个时候我们可以看到&#xff0c;这个共享文件图标右上方带了一把…

vue2实现一个简易实用的日历(可特殊标记多个日期)

效果如下&#xff1a; <template><div class"calendar"><div class"header"><button click"previousMonth"><</button><h2>{{ currentYear }}-{{ currentMonth }} </h2><button click"nex…

【SpringCloud】Nacos

Nacos简介 2018年6月&#xff0c;Eureka 2.0宣布闭源&#xff08;但1.X版本仍然活跃&#xff09;&#xff0c;同年7月&#xff0c;阿里Nacos宣布开源&#xff0c;并迅速成为国内开发者关注的焦点。作为Eureka的替代品&#xff0c;Nacos目前已经成为国内开发者的首选。 Nacos&…

通过物联网管理多台MQTT设备-基于全志T527开发板

一、系统概述 基于米尔-全志 T527设计一个简易的物联网网关&#xff0c;该网关能够管理多台MQTT设备&#xff0c;通过MQTT协议对设备进行读写操作&#xff0c;同时提供HTTP接口&#xff0c;允许用户通过HTTP协议与网关进行交互&#xff0c;并对设备进行读写操作。 二、系统架…

开源项目壮大和创新

开源项目壮大和创新 当谈论开源项目时&#xff0c;我们进入了一个充满活力和创新的领域&#xff0c;这里聚集了全球的开发者、科技爱好者和社区贡献者。开源项目不仅是技术发展的重要推动力&#xff0c;也是知识分享和合作精神的象征。在这篇文章中&#xff0c;我们将探讨一些…

error: ‘CV_YUV2BGR_UYVY‘ was not declared in this scope

遇到这个问题时&#xff0c;按照如下修改可解决问题。 //cv::cvtColor(yuvImg, rgbImg, CV_YUV2BGR_UYVY);cv::cvtColor(yuvImg, rgbImg, cv::COLOR_YUV2RGB_UYVY);

浅析Vite本地构建原理

前言 随着Vue3的逐渐普及以及Vite的逐渐成熟&#xff0c;我们有必要来了解一下关于vite的本地构建原理。 对于webpack打包的核心流程是通过分析JS文件中引用关系&#xff0c;通过递归得到整个项目的依赖关系&#xff0c;并且对于非JS类型的资源&#xff0c;通过调用对应的loade…