【身份安全】OAuth 2.0工作原理(一)

目录

  • OAuth 授权框架
    • 一、OAuth 角色
    • 二、协议流程
    • 三、应用注册(Application Registration)
      • 用户 ID(Client ID) 和 用户密码(Client Secret)
    • 四、权限授予
        • 1、授权码链接
        • 2、用户授权申请
        • 3、应用程序接收授权码
        • 4、应用程序请求访问令牌
        • 5、应用程序接收访问令牌
    • 五、Casdoor 运行原理
        • 1、应用向用户请求授权
        • 2、用户给应用授权
        • 3、API server 验证 APP 的授权认证
        • 4、API server 给 APP 颁发令牌
        • 5、APP 用令牌给资源服务器验证
        • 6、APP 使用令牌访问资源服务器资源
        • 回调网址
        • 代码
          • 后端代码
          • 前端代码

OAuth 授权框架

OAuth 是一个授权框架,它使应用程序能够在 HTTP 服务上获得对用户帐户的有限访问权限。它的工作原理是将用户身份验证委托给托管用户帐户的服务,并授权第三方应用程序访问该用户帐户。OAuth 2 为 Web 和桌面应用程序以及移动设备提供授权流程。


一、OAuth 角色

  • 资源拥有者(Resource Owner)
    资源所有者是授权应用程序访问其帐户的用户。应用程序对用户帐户的访问权限仅限于授予的授权范围(例如读取或写入访问权限)。

  • 客户端(Client)
    客户端是想要访问用户账户的应用程序。在它可以这样做之前,它必须得到用户的授权,并且授权必须由 API 验证。

  • 资源服务器(Resource Server)
    资源服务器托管受保护的用户帐户。

  • 授权服务器(Authorization Server)
    授权服务器验证用户的身份,然后向应用程序颁发访问令牌。

从应用程序开发人员的角度来看,服务的 API 既可以充当资源服务器角色,也可以充当授权服务器角色。我们将把这两个角色结合起来称为服务或 API 角色。


二、协议流程

在这里插入图片描述

过程步骤

  1. 应用向用户请求访问某服务资源的授权。
  2. 用户授权应用的请求,给 [授权许可]。
  3. 应用提供自身的 [身份验证] + [授权许可],请求 [访问令牌]。
  4. [身份验证] 通过且 [授权许可] 有效,颁发 [访问令牌](即 token)。
  5. 应用使用 [访问令牌] 请求资源服务器对应的资源。
  6. 若 [访问令牌] 有效,允许访问相应资源。
    在这里插入图片描述

三、应用注册(Application Registration)

在将 OAuth 与您的应用程序一起使用之前,您必须向该服务 API(授权服务器 + 资源服务器)注册您的应用程序。这是通过服务网站的开发人员或 API 部分中的注册表格完成的,您将在其中提供以下信息(可能还有关于您的应用程序的详细信息):

  • 应用名称
  • 申请网站(资源)
  • 重定向 URL(Redirect URI)或回调 URL(Callback URL)

重定向 URI 是服务在用户授权(或拒绝)您的应用程序后重定向用户的位置,因此是您的应用程序将处理授权代码或访问令牌的部分。

用户 ID(Client ID) 和 用户密码(Client Secret)

注册应用程序后,该服务将以客户端标识符和客户端密码的形式颁发客户端凭据。客户端 ID 是一个公开的字符串,服务 API 使用它来识别应用程序,还用于构建提供给用户的授权 URL。Client Secret 用于在应用程序请求访问用户帐户时向服务 API 验证应用程序的身份,并且必须在应用程序和服务 API 之间保密。


四、权限授予

在前面概述的抽象协议流程中,前四个步骤涵盖了获取授权授予和访问令牌。授权授予类型取决于应用程序请求授权所使用的方法,以及 API 支持的授权类型。OAuth 2 定义了三种主要的授权类型,每种类型在不同情况下都有用:

  • 授权码:与服务器端应用程序一起使用。
  • 客户端凭证:用于具有 API 访问权限的应用程序。
  • 设备代码:用于缺少浏览器或有输入限制的设备。

授权类型:授权码

授权码授予类型是最常用的,因为它针对服务器端应用程序进行了优化,其中源代码不公开,并且可以维护 Client Secret 的机密性。这是一个基于重定向的流程,这意味着应用程序必须能够与用户代理(即用户的网络浏览器)交互并接收通过用户代理路由的 API 授权代码。
在这里插入图片描述

【授权码】:用户给 APP,用于 APP 向 API server 申请资源访问令牌 token。
【令牌】:就是 token,API server 颁发给 APP,用于 APP 向资源服务器请求资源。


1、授权码链接

首先给用户提供授权码链接:

https://cloud.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read

拆解:

  • 授权端点https://cloud.com/v1/oauth/authorize
  • 应用程序的客户端 IDclient_id=CLIENT_ID(服务器 API 识别应用程序【知道用户是谁】)
  • 重定向 URLredirect_uri=CALLBACK_URL(服务在被用户授权后重定向 URL user-agent【API server 授权之后知道给谁发消息】)
  • 相应类型response_type=code(指定应用程序正在请求授权码)
  • 权限范围scope=read(指定应用程序访问级别为只读)

Casdoor 示例:

endpoint/login/oauth/authorize?client_id=xxx&response_type=code&redirect_uri=xxx&scope=read&state=xxx
  • client_id:用户 ID,可以在多个应用程序 APP 中。
  • redirect_uri:应用程序 APP 回调的 URL,通过这个信息,Casdoor 可以知道在授权后向哪里发送信息。
  • state:应用程序的名称。

2、用户授权申请

当用户单击该链接时,他们必须首先登录该服务以验证他们的身份(除非他们已经登录)。然后服务会提示他们授权或拒绝应用程序访问他们的帐户。


3、应用程序接收授权码

如果用户单击授权应用程序,该服务会将用户代理重定向到在客户端注册期间指定的应用程序重定向 URI 以及授权代码。重定向看起来像这样(假设应用程序是 dropletbook.com):

https://dropletbook.com/callback?code=AUTHORIZATION_CODE

4、应用程序请求访问令牌

应用程序通过将授权代码连同身份验证详细信息(包括 client secret)传递到 API 令牌端点,从 API 请求访问令牌。

示例请求:

https://cloud.com/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

5、应用程序接收访问令牌

如果授权有效,API 将向应用程序发送包含访问令牌(以及可选的刷新令牌)的响应。整个响应看起来像这样:

{"access_token": "ACCESS_TOKEN","token_type": "bearer","expires_in": 2592000,"refresh_token": "REFRESH_TOKEN", // 用于请求新的令牌"scope": "read","uid": 100101,"info": {"name": "Mark E. Mark","email": "mark@thefunkybunch.com"}
}

现在该应用程序已获得授权。它可以使用令牌通过服务 API 访问用户的帐户,仅限于访问范围,直到令牌过期或被撤销。如果发布了刷新令牌,如果原始令牌已过期,则可以使用它来请求新的访问令牌。


五、Casdoor 运行原理

1、应用向用户请求授权
endpoint/login/oauth/authorize?client_id=xxx&response_type=code&redirect_uri=xxx&scope=read&state=xxx
  • client_id:用户 ID,可以在多个应用程序 APP 中。
  • redirect_uri:应用程序 APP 回调的 URL,通过这个信息,Casdoor 可以知道在授权后向哪里发送信息。
  • state:应用程序的名称。

应用程序对用户说:

“嘿,现在我需要一些资源,我需要您的许可才能拿这些资源。您愿意跳转到这个 URL,填写您的用户名和密码吗?”

使用正确的 URL,您的应用程序将会让用户向此 URL 发起请求,授权请求已完成。


2、用户给应用授权

此步骤比较直接:用户会被重定向到上面的 URL,看到来自 Casdoor 的登录页面。通过在登录页面输入正确的用户名和认证信息,Casdoor 现在能成功识别用户,将发送 code 和 state 返回第 1 步中设置的回调 URL。

“用户打开网址并向 Casdoor 提供凭据。Casdoor 说:‘好~ 这是我在数据库中知道的用户(授权应用获取 code 和 state)。然后我将使用回调 URL 发送 code 和 state 返回应用(redirect_uri)。’”


3、API server 验证 APP 的授权认证

在这一步,您的应用程序已经有了来自第 2 步的代码,它将会告诉 Casdoor:

“嘿,现在用户同意给我 code,你想检查这个 code 并给我 access_token 吗?”


4、API server 给 APP 颁发令牌

在这一步,Casdoor 会通知应用程序:

“这个 code 应该是合法的,你一定就是那个正确的应用程序。这是 access_token。”


5、APP 用令牌给资源服务器验证

在这个步骤中,您的应用程序说:

“很好,刚刚获得了最新的 access_token,我现在可以使用它从资源服务器获得更多宝贵的东西!”

您的应用程序转向资源服务器:

“嗨朋友,想检查这个 access_token 吗?我从 Casdoor 得到了访问令牌,你想看看这是否与 Casdoor 的一致吗?”


6、APP 使用令牌访问资源服务器资源

资源服务器又告知您的应用程序:

“不错~ 它似乎就像我在 Casdoor 中的那个一样。Casdoor 说谁拥有这个 access_token 谁就可以拥有这些受保护的资源。现在,你可以自取这些资源了!”

这就是 Casdoor 如何与您的应用程序一起工作。


回调网址

SSO 登录成功之后会传信息的网址,会传递 code 和应用名称。
在这里插入图片描述
拿到 code 向 SSO 的 API 请求获得 access_token【后面就用 access_token 放到用户的 cookie 中使用】。


代码
后端代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

前端代码

在这里插入图片描述


by 久违

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

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

相关文章

大疆上云api直播功能如何实现

概述 流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下: 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流…

ESP-01模块连接手机热点问题及解决方法

在使用ESP-01模块连接手机热点时,可能会遇到一些问题。本文将详细介绍如何解决这些问题,并分享最终通过将WiFi切换到2.4GHz成功解决问题的经验。 一、问题描述 在尝试使用ESP-01模块连接手机热点时,遇到了连接失败的问题。以下是操作过程中…

NG-ZORRO中tree组件的getCheckedNodeList怎么使用

在 NG-ZORRO(Ant Design for Angular) 的 Tree 组件 中,getCheckedNodeList 方法用于获取当前选中的节点列表(包括半选状态节点)。以下是具体用法和示例: 基本用法 首先,确保你已通过 ViewChil…

业务流程先导及流程图回顾

一、测试流程回顾  1. 备测内容回顾  备测内容: 本次测试涵盖买家和卖家的多个业务流程,包括下单流程、发货流程、搜索退货退款、支付抢购、换货流程、个人中心优惠券等。 2. 先测业务强调  1)测试业务流程 …

从ChatGPT到AutoGPT——AI Agent的范式迁移

一、AI Agent的范式迁移 1. ChatGPT的局限性与Agent化需求 单轮对话的“工具属性” vs. 多轮复杂任务的“自主性” ChatGPT 作为强大的生成式AI,虽然能够进行连贯对话,但本质上仍然是“工具型”AI,依赖用户提供明确的指令,而无法自主规划和执行任务。 人类介入成本过高:提…

【Kafka】分布式消息队列的核心奥秘

文章目录 一、Kafka 的基石概念​主题(Topic)​分区(Partition)​生产者(Producer)​消费者(Consumer)​ 二、Kafka 的架构探秘​Broker 集群​副本机制​ 三、Kafka 的卓越特性​高…

【蓝桥杯14天冲刺课题单】Day 1

1. 题目链接:19937 艺术与篮球 该题目的难点主要在20240413这个日期需要结束程序跳出循环。最开始将该输出ans的位置放在了for循环之外,此时的日期已经循环完了2024年所有的日期,则最后会统计多而导致结果错误。 AC代码: #incl…

AI人工智能-Jupyter NotbookPycharm:Py开发

安装 命令: pip install jupyter 启动 命令: jupyter notebook 启动成功后,下面网址会默认自动打开当前用户的根目录。 其实这个页面显示的内容,是我们电脑目录C:\Users\当前用户\下的文件夹 我们平常做实验,希望在…

命悬生死线:当游戏遭遇DDoS围剿,如何用AI破局?

文章作者:腾讯宙斯盾DDoS防护团队 一、血色战场:DDoS攻击游戏产业的致命瞬间 全球黑色星期五 这是一场波及全球的“黑色星期五”,起初无人察觉,包括小林。 他刚下班到家就迫不及待打开电脑,准备体验期待已久的《黑神话…

使用HTML5和CSS3实现3D旋转相册效果

使用HTML5和CSS3实现3D旋转相册效果 这里写目录标题 使用HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现思路1. HTML结构2. CSS样式解析2.1 基础样式设置2.2 3D效果核心样式2.3 卡片样式 3. JavaScript交互实现3.1 旋转控制3.2 自动播放功能 技术要点总结项目亮点总…

【HTML 基础教程】HTML <head>

HTML <head> 查看在线实例 <title> - 定义了HTML文档的标题 使用 <title> 标签定义HTML文档的标题 <base> - 定义了所有链接的URL 使用 <base> 定义页面中所有链接默认的链接目标地址。 <meta> - 提供了HTML文档的meta标记 使用 <me…

macbook电脑如何清理键盘防止误触

M1芯片的MacBook电脑关机后按任意键开机&#xff0c;是苹果的功能设计。这样设计的目的是为了方便用户&#xff0c;让用户在想要使用电脑时能快速开机。但是清理电脑键盘的时候却成为了一种苦恼 以下是一些清理 MacBook 键盘防止误触的方法&#xff1a; 使用工具锁定键盘 Cle…

Rust 面向对象

Rust 面向对象 引言 Rust 是一种系统编程语言,以其高性能、内存安全和并发支持而受到关注。Rust 的面向对象特性是其强大功能之一,它允许开发者以面向对象的方式构建复杂的应用程序。本文将深入探讨 Rust 的面向对象编程(OOP)特性,包括类的定义、继承、封装和多态等概念…

Redis 源码硬核解析系列专题 - 第二篇:核心数据结构之SDS(Simple Dynamic String)

1. 引言 Redis没有直接使用C语言的标准字符串(以\0结尾的字符数组),而是自定义了SDS(Simple Dynamic String)。SDS是Redis的基础数据结构之一,广泛用于键值存储、命令参数等场景。本篇将深入剖析SDS的实现原理、优势以及源码细节。 2. 为什么不用C标准字符串? C字符串…

python-59-基于python内置库解析html获取标签关键信息

文章目录 1 html.parser1.1 初始化和基础使用1.1.1 handle_starttag(self, tag, attrs)1.1.2 handle_endtag(self, tag)1.1.3 handle_startendtag(self, tag, attrs)1.1.4 handle_data(self, data)1.1.5 handle_comment(self, data)1.2 解析HTML文档的流程2 百度搜索关键词链接…

Java的string默认值

在Java中&#xff0c;String类型的默认值取决于其定义和实例化的方式。 以下是关于String默认值的详细说明 未实例化的String变量‌ 如果定义一个String变量但未对其进行实例化&#xff08;即未使用new关键字或直接赋值&#xff09;&#xff0c;其默认值为:ml-search[null]。这…

高并发系统下的订单号生成服务设计与实现

目录 引言 订单号设计的关键考量因素 基础需求分析 唯一性保障 数据量预估 可读性设计 系统架构考量 分库分表兼容 可扩展性设计 技术选型与比较 性能优化 高可用性保障 实践案例&#xff1a;高并发系统订单号结构设计 结构详解 业务类型标识(2位) 唯一标识部分…

使用LLaMAFactory微调Qwen大模型

一、环境配置与工具安装 1. 硬件要求 GPU:至少1块NVIDIA GPU(推荐RTX 4090/A100/H100,显存≥16GB)。内存:≥64GB系统内存。存储:≥100GB硬盘空间用于模型与数据集存储。2. 软件依赖 Python 3.8+:需安装CUDA支持的PyTorch版本(如torch==2.0.1+cu117)。 依赖库:通过以…

2025-3-29算法打卡

一&#xff0c;回文判定 1.题目描述&#xff1a; 题目描述 给定一个长度为 nn 的字符串 SS。请你判断字符串 SS 是否回文。 输入描述 输入仅 11 行包含一个字符串 SS。 1≤∣S∣≤1061≤∣S∣≤106&#xff0c;保证 SS 只包含大小写、字母。 输出描述 若字符串 SS 为回…

Android 接 Twitter Share ,常见问题及解决方案

1. 应用未授权或授权失败 问题描述:当尝试分享内容到 Twitter 时,应用提示未授权,或者在授权过程中出现错误,无法获取授权码或访问令牌。解决方案 检查 Twitter API 密钥和密钥密码:确保在 Twitter 开发者平台创建应用后,获取的 API 密钥(Consumer Key)和 API 密钥密码…