关于OAuth2.0的一些基本知识

news2025/1/21 2:56:45

本文记录下关于OAuth2.0的一些基本知识

文章目录

  • 什么是 OAuth2.0
  • OAuth2.0 架构
  • 术语介绍
  • Web 服务器
  • 用户代理
  • 本机应用程序
  • 本文小结


什么是 OAuth2.0

OAuth 是一种开放的授权协议,它是目前最流行的授权机制。它允许将存储在一个站点上的资源共享到另一个站点,而无需使用该站点的凭据。这类定义一般都比较抽象,要理解起来不是太容易。所以这里我们通过一个实际应用的类比来说明一下这个场景,你会发现,其实OAuth2.0的原理并不复杂。

首先,假设我在微信上注册了账号,然后加了一些好友,并且有一些聊天记录。

然后,我正在访问一个网站/应用。这里假设正在访问 www.jiyik.com 。这个网站有一项功能是可以获取微信号上的好友和聊天,然后对这些信息进行一个统计分析的功能(当然,本站是没有这项功能的)。

个人感觉这项功能不错,就想使用它。有一种方式是我可以把个人的微信账号和密码告诉这个应用。应用可以通过账号密码获取到好友信息和聊天记录。但是这样我感觉很不安全,如果我以后不想再继续使用了,那我还得再去修改账号和密码。那样就会很麻烦了。所以这里就需要一种方式可以使得我将一些权限授权给该网站,使其可以不用账号和密码就可以获取到这些信息。这种授权方式就是 OAuth2.0。当我不再想使用该功能的时候,我就可以把权限收回或者使授权失效。

所以说一个完整的OAuth2.0 的流程需要涉及到三个实体。

  • 资源服务商 (微信,Google,Facebook等)
  • 第三方网站/应用
  • 用户

在这里插入图片描述
当有另一个第三方的网站要使用微信账号登录其系统时,同样我们也可以通过授权的方式登录这个第三方的网站。这样就实现了同一个微信账号可以多个不同的网站进行登录。这也是一种单点登录,这也是为什么最初经常会将其和SSO单点登录搞混的原因。

通过上面的场景,我们大概也能清楚OAuth2.0的基本的原理了。下面我们通过整体介绍一下其架构,来更深入的了解其工作原理。


OAuth2.0 架构

OAuth2.0 架构

在这里插入图片描述

整个的流程是这样的。

  1. 首先,用户使用 Google、微信 等第三方应用程序访问资源。
  2. 第三方网站会带着客户端ID和客户端密钥重定向到资源服务的授权登录界面。
  3. 用户会接收到一个Google或微信的授权登录界面。用户需要在该界面进行授权。
  4. 用户使用身份验证应用程序登录。客户端 ID 和客户端密钥对于授权服务器上的客户端应用程序是唯一的。
  5. 身份验证服务器使用授权代码将用户重定向到重定向统一资源标识符 (URI)。这个地址是第三方网站在接入资源服务的认证服务时提交给认证服务的,当用户授权成功后,会被重定向到该网址。
  6. 用户访问位于客户端应用程序中重定向 URI 的页面,该页面此时会带有一个用于验证的Code。
  7. 客户端应用程序将获得身份验证Code、客户端 ID 和客户端密钥,并将它们发送到授权服务器。
  8. 身份验证应用程序向客户端应用程序返回访问令牌。
  9. 一旦客户端应用程序获得访问令牌,用户开始使用客户端应用程序访问资源所有者的资源。

整个OAuth2.0的流程就是这样的。这其中会涉及到一些HTTP的知识点,关于HTTP可以参考我们的 HTTP教程。

OAuth2.0会涉及到很多术语和概念,下面我们对这些术语概念进行一些解释。


术语介绍

验证

身份验证是识别一个用户的过程,通常是基于用户个人的用户名和密码。通过用户名和密码来验证该用户是否是一个合法的资源持有者。另外,搜索公众号互联网架构师后台回复“2T”,获取一份惊喜礼包。

联合身份验证

许多第三方网站/应用都有自己的用户名和密码。某些应用程序依赖于其他服务来验证用户的身份。联合身份管理系统提供对多个系统的单一访问。这称为联合身份验证。

授权

授权是允许某人做某事的过程。它需要有效用户的身份来检查该用户是否被授权。

委托授权

委托授权是将自己的凭据提供给其他用户以代表该用户执行某些操作的过程。

角色

OAuth 定义了以下角色

在这里插入图片描述

  • 资源所有者 - 资源所有者被定义为能够授予访问其在资源服务器上托管的自己数据的能力的实体。当资源所有者是个人时,称为最终用户。
  • 客户端应用程序 - 客户端是一个应用程序,它发出受保护的资源请求以代表资源所有者执行操作。
  • 资源服务器 - 资源服务器是可用于访问用户信息的 API 服务器。
  • 认证服务器 - 认证服务器从资源所有者那里获得许可并将访问令牌分发给客户端,以访问由资源服务器托管的受保护资源。

Web 服务器

Web 服务器是一个计算机系统,它使用 HTTP协议 将网页传送给用户。只要应用程序想要访问资源服务器,客户端ID和密钥就存储在web应用程序服务器上。将客户端ID和密钥存储在 Web 应用程序服务器上的目的是保密。

在这里插入图片描述
在上图中,资源所有者允许机密客户端访问托管在资源服务器上的数据,其中客户端 ID 和密钥保存在服务器上并且是保密的。

客户端 ID 和密钥对于授权服务器上的客户端应用程序是唯一的。

资源服务器是一个服务器,它承载着 Google、微信等资源。这些资源存储在资源服务器上,供客户端应用程序访问,资源所有者拥有这些资源。

然后,授权服务器使用客户端 Web 应用程序访问资源所有者的资源。


用户代理

用户代理应用程序由用户设备中的客户端应用程序使用,它可以是一个脚本语言,例如在浏览器中运行的 JavaScript。所以说我们可以将用户代理应用程序存储在 Web 服务器上。下图显示了客户端用户代理应用程序的架构。

在这里插入图片描述

  1. 首先,用户使用 Google、微信 等身份验证应用程序访问资源所有者的资源。
  2. 接下来,用户应用程序提供客户端 ID 和客户端密钥,从而登录到授权服务器。
  3. 然后,用户代理应用程序提供一个在浏览器中运行的 JavaScript 应用程序实例并链接到 Web 服务器。
  4. 授权服务器允许使用客户端凭据从资源服务器访问资源。
  5. 资源服务器包含由资源所有者拥有的资源。

本机应用程序

本机应用程序可以用作桌面或手机应用程序的实例,它使用资源所有者凭据。它是安装在资源所有者设备上的客户端应用程序。

应用程序使用的身份验证凭据包含在应用程序代码中。因此,不要使用在外部用户代理中运行的本机应用程序。

在这里插入图片描述

  • 首先,用户使用 Google、微信 等身份验证应用程序访问资源所有者的资源。
  • 接下来,本机应用程序使用客户端 ID 和客户端密钥登录到授权服务器。本机应用程序是桌面或手机应用程序的实例,它安装在用户计算机上,并将客户端密钥存储在计算机或设备上。
  • 授权服务器允许使用客户端凭据从资源服务器访问资源。
  • 资源服务器包含由资源所有者拥有的资源。

本文小结

以上我们介绍了OAuth2.0 的整体流程,以及这中间涉及到的一些术语和概念我们分别进行了介绍。这要求我们对 HTTP协议 的原理要稍微有些了解。通过上面的介绍其实我们可以看到,整个过程较为核心的部分就是对 访问令牌的获取。

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

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

相关文章

享元模式——实现对象的复用

1、简介 1.1、概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。例如,在一个文本字符串中存在很多重复的字符,如果每个字符都用一个单独的对象来表示,将会占用较多的内存…

打印Winform控件实现简陋版的分页打印(C#)

本文的代码可以从这里获取:winformDemo.rar 张祥裕/分享的资源名称 - Gitee.com 作者的水平有限,如有错误,望指正。 为了简单起见,纸张大小,打印机等信息按照默认的来,本文的实现方案是:打印Pa…

超全整理,Jmeter性能测试-常用Jmeter第三方插件详解(超细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Jmeter作为一个开…

【回眸】备考PMP考点汇总 三(距离考试还有20天)

目录 前言 【回眸】备考PMP考点汇总 三(距离考试还有20天) 29、管理质量 30、获取资源 31、建设团队 32、管理团队 33、管理沟通 34、实施风险应对 35、实施采购 36、管理相关方参与 37、监控项目工作(10%) 38、实施整…

php://filter绕过死亡exit

文章目录 php://filter绕过死亡exit前言[EIS 2019]EzPOP绕过exit 参考 php://filter绕过死亡exit 前言 最近写了一道反序列化的题,其中有一个需要通过php://filter去绕过死亡exit()的小trick,这里通过一道题目来讲解 [EIS 2019]EzPOP 题目源码&#…

*CTF 2023 web jwt2struts 题解wp

jwt2struts 根据题目名字猜测,这题考察jwt和Struts2 包里面果然有一个cookie 验证了,是jwt eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiZXhwIjoyMDA2MjI1MjgxfQ.F7vOtdqg48M1DYK4tVZywTipIYDqKfsBSju7ekLSecU 我们的目标应该是把user改…

深蓝学院C++基础与深度解析笔记 第13章 模板

1. 函数模板 ● 使用 template 关键字引入模板&#xff1a; template<typename T> //声明&#xff1a;T模板形参void fun(T); // T 函数形参template<typename T> //定义void fun(T) {...}– 函数模板不是函数 –…

安全学习DAY12_信息打点-Web应用信息搜集

信息打点-Web应用 文章目录 信息打点-Web应用业务资产企业查信息的目的 Web应用信息搜集Web网站域名搜集WEB单域名WEB子域名OneForAll&#xff08;子域名收集工具&#xff09; WEB网站架构资产WEB指纹识别资产 常用查询平台汇总查企业信息查备案信息查公众号信息域名注册查询IP…

【Linux】进程篇Ⅱ:进程开始、进程终止、进程等待、程序替换

文章目录 五、fork 函数&#xff0c;创建进程写时拷贝 六、进程终止1. 退出码2. 如何终止程序 七、进程等待1. 概念2. wait 函数waitpid 函数 &#x1f53a; 3. 阻塞等待 八、程序替换1. execl2. execv3. execlp4. execvp5. execle &#x1f53a;6. execvpe 、execve 一个简易的…

vmware的window中安装GNS3

1.向vmware中的windows虚拟机传送文件 点击虚拟机-安装VMwaretools 安装在虚拟机上面 此图标代表已经成功&#xff0c;将文件复制到虚拟机上里面 2.安装 安装gns3&#xff0c;需要先安装winpcap&#xff08;检查网卡&#xff09;和wireshark&#xff08;对winpcap上数据进行抓…

16- C++多态-4 (C++)

第五章 多态 5.1 多态的引入 思考&#xff1a;在之前实现的英雄模型中&#xff0c;假如实现某个接口可以传入一个英雄&#xff0c;在该接口中可以对英雄的力量、敏捷和智力进行加强&#xff0c;请问该接口的参数该如何设计&#xff1f; 以上解决办法利用了C中的多态&#xf…

51单片机定时器/计数器

目录 1、定时器/计数器0/1介绍 1.1 定时器介绍 1.2 单片机定时/计数器原理 2、定时器/计数器0和1的相关寄存器 2.1 定时器/计数器控制寄存器TCON 2.2 定时器/计数器工作模式寄存器TMOD 2.3 定时器/计数器工作模式 2.3.1 模式0(13位定时器/计数器) 2.3.2 模式1(16位定…

CSDN如何输入公式

方法分三步&#xff1a; 1&#xff09;预先设置MathType的复制剪切选项 2&#xff09;将MathType已经编写好的公式复制到CSDN 3&#xff09;把复制的公式文本&#xff0c;首尾的“\[”和“\]”符号替换成“$$”和“$$” 1&#xff09;预先设置MathType的复制剪切选项 2&#x…

海量数据存储组件Hbase

hdfs hbase NoSQL数据库 支持海量数据的增删改查 基于Rowkey查询效率特别高 kudu 介于hdfs和hbase之间 hbase依赖hadoopzookeeper&#xff0c;同时整合框架phoenix(擅长读写),hive&#xff08;分析数据&#xff09; k&#xff0c;v 储存结构 稀疏的&#xff08;为空的不存…

Qt实现思维导图锦集

序号简述文章导航1思维导图树形结构、不重叠且均匀分布、支持折叠和展开核心树2菜单按钮风格、菜单提示风格、侧滑菜单、侧滑功能窗口UI设计3支持JPEG、PNG、XML、JSON、PDF、SVG格式文件数据导入导出4支持撤销回撤功能、显示节点操作流程、点击可跳转历史撤销回撤5思维导图横向…

哈工大计算机网络课程网络安全基本原理详解之:消息完整性与数字签名

哈工大计算机网络课程网络安全基本原理详解之&#xff1a;消息完整性与数字签名 这一小节&#xff0c;我们继续介绍网络完全中的另一个重要内容&#xff0c;就是消息完整性&#xff0c;也为后面的数字签名打下基础。 报文完整性 首先来看一下什么是报文完整性。 报文完整性…

C++模拟实现反向迭代器

1.代码实现 1.有了解正向迭代器的应该知道&#xff0c;比如list的正向迭代器其实本质是一个类&#xff0c;而有些人想模拟实现反向迭代器&#xff0c;依旧想再创建一个类&#xff0c;但是库里面想要的是&#xff0c;你给我一个迭代器&#xff0c;我就能给你反馈一个反向迭代器…

信号槽中的函数重载

信号槽中的函数重载 QT4的方式QT5的方式函数指针重载函数QT5信号函数重载解决方案 总结 QT4的方式 Qt4中声明槽函数必须要使用 slots 关键字, 不能省略。 信号函数&#xff1a; 槽函数&#xff1a; mainwondow: cpp文件&#xff1a; #include "mainwindow.h"…

C/C++多线程操作

文章目录 多线程C创建线程join 和detachthis_thread线程操作锁lock_guardunique_lock 条件变量 condition_variablewaitwaitfor C语言线程创建线程同步 参考 多线程 传统的C&#xff08;C11标准之前&#xff09;中并没有引入线程这个概念&#xff0c;在C11出来之前&#xff0c…

C语言:反转一个单链表

Lei宝啊&#xff1a;个人主页 题目&#xff1a; 描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 接口&#xff1a; struct ListNode* reverseList(struct ListNode* head){} 示例&#xff1a; 输入&#xff1a; head [1…