OAuth2 工作流程详解

news2024/12/29 10:29:09

我们之前谈到了使用saml作为SSO单点登录认证。本文讲解oauth2.0协议,oauth2.0协议避免了客户端直接访问受保护资源

什么是OAuth

OAuth是一种安全的开放协议,用于在不相关的服务之间授权用户。换句话说,它使一个服务能够访问托管在其他服务上的资源,而无需共享用户凭证,如用户名和密码。

OAuth使用委托实现认证与访问

  1. 一个服务(客户端)代表用户从另一个服务(资源服务器)访问资源。
  2. 用户不必与客户端共享其凭据。

Parties involved:

  1. 资源所有者/用户: 授予访问由第三方提供商托管的受保护资源的权限的人
  2. 客户端: 代表用户访问由第三方提供商托管的资源的web应用程序
  3. 授权服务器: 与客户端联系的第三方服务器,它向用户显示提示,让用户授权客户端代表用户进行操作
  4. 资源服务器: 托管用户受保护资源的第三方服务器

OAuth2 Web应用流程

OAuth2协议可以用于不同类型的应用程序,但它最常用于web、移动和桌面应用程序。本节将讨论在web应用程序中部署OAuth2,也称为web应用程序流(或授权代码授予)。

一个简化的Web应用流程如下图所示:
在这里插入图片描述

该流程基本上是客户端(web应用程序)和服务器(OAuth2提供者)之间的通信和信息交换,它由三个步骤组成:

  1. 认证
  2. 获取token
  3. 获取受保护的用户信息

在实现这个流程之前,web开发人员通常必须向OAuth2提供商注册他们的web应用程序,并提供以下信息:

  1. 应用程序名称
  2. 应用程序托管在哪里
  3. URI端点(也称为重定向URI或回调URL)

注册后,OAuth2提供者将向注册者提供以下信息:

  1. Client ID:用于唯一标识web应用程序的公共凭证,类似于用户名
  2. Client secret:传递给服务器的私有凭证,类似于密码
  3. Authorization server UR:客户端请求授权的URL
  4. Access token URL:客户端用来交换访问令牌授权码的URL
  5. Resource server URL:客户端使用访问令牌访问受保护资源的URL,也可以与授权服务器相同

下面详解每一步

Step 1: Authorize

第一步,授权,通常在登录过程开始时调用。在此步骤中,web应用程序向用户请求权限,以授权访问其托管在第三方OAuth2提供商上的帐户。

Client - request permission
首先,web应用程序用以下信息构造一个URL:

  • Response Type - 告诉授权服务器使用什么字段返回code值
  • Client ID - web应用程序标识
  • Redirect URI - where to redirect the user back to
  • Scope - 指定web应用程序希望访问用户配置文件的哪一部分
  • State - 是web应用程序提供的一个随机生成的字符串,授权服务器将简单地将其传递回去,以便web应用程序可以验证以减少欺诈

样例

https://api.authorization-server.com/authorize
  ?response_type=code
  &client_id=123
  &redirect_uri=https://your-web-app.com/redirect
  &scope=photos
  &state=1234-zyxa-9134-wpst

然后,用户被重定向到该URL,授权服务器将向用户显示一个提示,询问他们是否要授权此应用程序的请求:
在这里插入图片描述
Authorization Server - redirect back

用户授权web应用访问自己的第三方账号后,授权服务器会通过重定向URL将用户重定向回web应用,重定向URL包含以下信息:

  • Code: web应用程序期望从服务器获得的短期授权代码
  • State:先前从客户端传递的状态凭证

重定向样例

https://your-web-app.com/redirect
  ?code=123456
  &state=1234-zyxa-9134-wpst

Step 2: Fetch Access Token

第二步是将授权代码交换为访问令牌。
Client - exchange
web应用程序向授权服务器的令牌端点发送一个HTTP POST请求,内容如下:

  • Grant Type - 再次告诉授权服务器要使用哪个流或授权(对Web应用程序流使用authorization_code)
  • Code -web应用程序从授权服务器接收到的授权代码
  • Redirect URI - where to redirect the user back to
  • Client ID - 与授权步骤中使用的客户端标识符相同
  • Client Secret - OAuth2提供者在注册期间提供的密码

样例

https://api.authorization-server.com/token
  grant_type=authorization_code
  &code=123456
  &redirect_uri=https://your-web-app.com/redirect
  &client_id=123
  &client_secret=456

Authorization Server - grant token
令牌端点将验证请求中的所有参数,确保代码没有过期,并且客户端ID和密钥匹配。如果一切正常,它将生成一个访问令牌,并在响应中返回它!

假设授权代码有效,授权服务器将生成访问令牌并将其返回给客户端。

样例

{
  "access_token": "KtsgPkCR7Y9b8F3fHo8MKg83ECKbJq31clcB",
  "expires_in": 3600,
  "token_type": "bearer"
}

OAuthLib 集成与实现

Step 1: Authorize
OAuthLib提供了一个WebApplicationClient类来实现上面描述的Web应用程序流。注册OAuth2提供者并获得客户端ID后,在web应用程序中创建WebApplicationClient的新实例。

from oauthlib.oauth2 import WebApplicationClient

client_id = 'xxxxx'
client = WebApplicationClient(client_id)

为了方便Web应用程序流中的授权步骤,WebApplicationClient类提供了一个prepare_request_uri()方法,该方法接受授权服务器URL及其相应的凭据来形成一个完整的URL。

authorization_url = 'https://api.authorization-server.com/authorize'

url = client.prepare_request_uri(
  authorization_url,
  redirect_uri = 'https://your-web-app.com/redirect',
  scope = ['read:user'],
  state = 'D8VAo311AAl_49LAtM51HA'
)

print url

https://api.authorization-server.com/authorize
  ?response_type=code
  &client_id=xxxxx
  &redirect_uri=https://your-web-app.com/redirect
  &scope=read:user
  &state=D8VAo311AAl_49LAtM51HA

The web application can redirect the user to this URL. At this point, the authorization server will present a prompt, asking the user to authorize the request.

Step 2: Fetch Access Token
同样,在此步骤中,在用户批准请求之后,将使用包含授权代码和状态的响应将其重定向回客户机。

在提取并验证状态值的准确性之后,web应用程序可以利用WebApplicationClient的prepare_request_body()方法构造从授权服务器获取访问令牌所需的URL。

data = client.prepare_request_body(
  code = 'yyyyyyy',
  redirect_uri = 'https://your-web-app.com/redirect',
  client_id = 'xxxxx',
  client_secret = 'zzzzzzz'
)

print data

grant_type=authorization_code
  &client_id=xxxxx
  &client_secret=zzzzzzz
  &code=yyyyyyy
  &redirect_uri=https//your-web-app.com/redirect

此时,我们可以利用Requests库向OAuth2提供程序提供的令牌URL发送HTTP POST请求。

token_url = 'https://api.authorization-server.com/token'
response = requests.post(token_url, data=data)

OAuthLib的WebApplicationClient类还提供了一个parse_request_body_response()方法来帮助我们将响应数据作为Python字典来管理。例如,我们可以传递响应。文本到这个方法,它将把字典保存在client.token中:

client.parse_request_body_response(response.text)

The value of client.token might look something like this:

{
   'access_token': 'KtsgPkCR7Y9b8F3fHo8MKg83ECKbJq31clcB',
   'scope': ['read:user'],
   'expires_at': 1619473575.641959,
   'expires_in': 3599,
   'token_type': 'bearer'
}

https://medium.com/@ratrosy/building-a-basic-authorization-server-using-authorization-code-flow-c06866859fb1

https://github.com/mchesler613/OAuth2-Integration-with-OAuthlib-and-GitHub

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

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

相关文章

Flutter 笔记 | GetX

官网:https://pub.dev/packages/get 中文文档:https://github.com/jonataslaw/getx/blob/master/README.zh-cn.md 关于 GetX 现在Flutter的状态管理方案很多,redux、bloc、state、provider、Getx。 provider是官方提供的状态管理解决方案&…

小程序分包详解

一:什么是小程序分包 分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。 二:为什么使用分包 小程序第一版 推出 小程序代码包不能超过1MB 大小&…

java SSM 教代会审批管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 教代会管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码 和数据库,系统主要采用…

计算机网络开荒2-应用层

文章目录 一、网络应用体系结构2.1 客户机/服务器结构(Client-Server,C/S)2.2 点对点结构(Peer-to-peer,P2P)2.3 混合结构(Hybrid) 二、网路应用的进程通信2.1 套接字Socket2.2 应用层协议的内容 三、网络应用的需求与传输层服务四、Web4.1 HTTP4.1.1 HTTP连接类型4.1.1.1 非持…

mysql慢sql优化实战:in order by优化处理

背景 线上查询慢的问题日益突出,专门写一个帖子记录一下处理过程,会定期更新优化处理方案 套餐余量统计查询菜单,数据库查询时间一分钟五十秒,优化之后耗时109毫秒,性能提升很大.所有时间统计均以数据库层面进行统计.用户使用层面因为有数据传输、带宽、业务逻辑处理等因素…

只要7分钟,教你从0-1搭建BI系统,这份大佬整理的指南免费送!

在BI行业干了快十年了,做过制造业供应链的BI项目,也跟过零售电商、房地产、银行的BI建设,经常有朋友咨询关于BI建设的内容,今天总结了一套BI项目建设指南,直接分享给大家,觉得不错记得点赞收藏。 通常情况…

实战【金融评分卡】

金融评分卡 网站:百融、同盾 1.导入 信贷评分卡是一种用于评估个人或企业申请贷款的工具,就像-个评分表-样。我们可以把它看作是银行或金融机构用来判断某人是否有资格获得贷款的一-种方式。 想象一下,你是一个银行家,有很多人向你申请贷款,比如个人贷…

cas单点登录-服务端部署

一.需求描述 公司开发系统越来越多,每个系统都有自己的登录认证流程,给用户很繁琐的体验,统一认证单点登录迫在眉睫 二.流程图 三.本地运行cas服务端 1.拉取cas服务端代码,切换到对应分支(我使用的是6.4.x&#xff…

proxmox7.4 安装后配置

关于proxmox7安装和配置的博文,倒是不少。可惜鱼龙混杂,踩了不少坑,如今实践成功后,做一分享。 proxmox7.4安装(与安装linux系统类似) 1.去官网https://proxmox.com/en/downloads 下载安装镜像,注意: 下…

iTOP-3588开发板Android12源码定制开发uboot开发

uboot 开发-Uboot 源码是 v2017.09 版本。目前在该平台上已经支持 RK 所有主流在售芯片。支持 的功能主要有:  支持 RK Android 固件启动;  支持 Android AOSP 固件启动;  支持 Linux Distro 固件启动;  支持 Rockchip miniloader 和 SPL/TPL 两种 Pre-loader 引导…

对比才知差距!海尔“精华洗”用实验告诉用户

《怪诞关系学》一书中讲到,人生来会与他人做比较,对比是天性,竞争是必然。用高深点的话讲,人是通过对比身边的事物和同类来定位自身的,只有对比才知道差距有多大。“仰观宇宙之大,俯察品类之盛”&#xff0…

Python如何批量合并70个doc和docx文件

目录 一、问题的提出 二、算法分析 三、代码展示 四、注意事项 有一位朋友发来70多个数名命名的doc和docx文件,问我有没有vba代码,可以把这些文件按照数字大小的顺序合并。我试着用了chatgpt,搞了一串vba代码行不通,于时我就找…

【PyQt5】(01)PyQt的详细介绍

文章目录 前言一、PyQt的前世今生1.1 PyQt6、PyQt5和PyQt41.2 商业版和开源版1.3 支持的操作系统 二、 PyQt的优点三、PyQt的应用场景总结 前言 PyQt是使用Python语言编写的QT库的界面工具包。QT是一个跨平台的C应用程序开发框架,可以用于创建高性能、高可靠性、图形…

高频面试八股文用法篇(六) 说说反射及其作用

目录 什么是反射? 反射的作用 反射的优缺点 反射的用途 什么是反射? 动态语言。 当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。Java 并不是动态语言,但是它却又一个非常突出的动态相关的机制&am…

Permission denied, please try again.

如果你是容器或者二进制安装启动的gitlab,在克隆代码一直有这样的问题 正克隆到 h5... git192.168.0s password: Permission denied, please try again. 服务ipgit 192.168.40.15 gitlab192.168.40.17 1、 docker run -d --name gitlab -p 80:80 -p 224:22 -p 4…

基于springboot的在线学习平台

源码获取,V:qq2056908377 采用技术 项目整体采用传统的B/S架构和MVC设计模式,开发语言选用JavaHTMLJavascript,技术上采用SpringBoot、Mybatis等开发框架,数据库采用MySQL 5.7。 功能介绍 平台分为用户端和管理两个系…

1.8 基于Java配置方式使用Spring MVC

一、基于Java配置方式使用Spring MVC 实现步骤 1、创建Maven项目 Maven项目 - SpringMvcDemo02 2、添加相关依赖 在pom.xml文件里添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/…

chatgpt赋能python:如何用Python创建一个成功的项目

如何用Python创建一个成功的项目 无论是初学者还是有经验的开发者&#xff0c;Python语言的丰富生态系统和易于使用的语法使得它在项目开发领域中成为了一种非常流行的选择。但是&#xff0c;要构建一个好的Python项目需要很多工作&#xff0c;需要一些经验和技巧。在这篇文章…

LeetCode_二叉树_BFS_中等_117.填充每个节点的下一个右侧节点指针 II

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 …

数据共享传输:台式机和笔记本同步文件!

为什么要在台式机和笔记本同步文件&#xff1f; “我想在台式机和笔记本同步文件。因为我工作时使用笔记本&#xff0c;在家里使用安装了Windows 10系统的台式机&#xff0c;我想要在笔记本和台式机之间同步应用程序、游戏、文档等。有没有一种可以在台式机和笔记本同步文件的…