面试题:说一下你对 OAuth2 协议原理的理解?

news2024/11/25 2:26:56

文章目录

  • OAuth2简介
  • 角色
  • 流程
  • 客服端注册
  • Client Type
  • 四种授权模式
  • 授权码模式
  • 隐藏式
  • 密码式
  • 凭证式
  • RefreshToken


OAuth2简介

OAuth 是一个开放授权协议标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的全部内容。

OAuth2 是 OAuth 协议2.0版本,不兼容1.0版本。RFC6749 文档描述了 OAuth2 协议的全部内容。本文将会基本 RFC协议文档去带大家理解OAuth2协议,如果读完以后感觉晦涩弄懂,可以结合 阮一峰大神这个博客去理解。

角色

例子:Ruby China这个网站支持使用github账号登录,当用户选择使用github登录的时候,需要用户先输入github账号密码登录github,然后询问用户是否授权rubyChina这个网站获取用户的信息。

https://ruby-china.org/account/sign_in

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

这就是一个第三方登录的一个例子, 下面列出的是OAuth2协议中所涉及到的几个角色以及描述。

在这里插入图片描述

流程

在这里插入图片描述

  1. 用户打开客户端以后,客户端要求用户给予授权。
  2. 用户同意给予客户端授权。
  3. 客户端使用上一步获得的授权,向认证服务器申请令牌。
  4. 认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
  5. 客户端使用令牌,向资源服务器申请获取资源。
  6. 资源服务器确认令牌无误,同意向客户端开放资源。

客服端注册

如果一个第三方应用想使用第三方登录,该第三方应用的开发者需要先到 Authentication Server去申请一个 client,一般需要:

  • 应用名称,
  • Home Page url
  • Redirect URI
  • 指定client type

注册完以后可以拿到 clientId 和 client secret

参考第三方网站开发文档,选择适合的授权模式去实现 OAuth2 第三方授权登录

例如如果你想要你自己的网站支持github登录的话,首先你要去github上面注册一个client:

在这里插入图片描述

Client Type

官方协议解释:
OAuth defines two client types, based on their ability to authenticate securely with the authorization server (i.e., ability to maintain the confidentiality of their client credentials,根据client申请方时候有能力去维护client的credentials信息分为 confidential和public两种。

  • confidential:Clients capable of maintaining the confidentiality of
    their credentials (e.g., client implemented on a secure server with
    restricted access to the client credentials), or capable of secure
    client authentication using other means

  • public: Clients incapable of maintaining the confidentiality of their
    credentials (e.g., clients executing on the device used by the
    resource owner, such as an installed native application or a web
    browser-based application), and incapable of secure client
    authentication via any other means

四种授权模式

OAuth2的核心是认证服务器向第三方颁发令牌,其根据不同的互联网应用场景,定义了一下四种允许第三方应用获取令牌的模式。分别是:

图片

假设用户A通过浏览器访问网站:https://client.example.com,而该网站需要用户A授权,去访问用户A在网站 http://server.example.com 上面存储的个人信息。

我们以这个例子来解释下面介绍的各种模式。下面所说的客户端指的是 https://client.example.com,授权服务器以及资源服务器指的是 http://server.example.com,假设它们在同一个服务器上。

一下四种模式涉及到一些代码名称,先给大家列出来:

图片

授权码模式

授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。
这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

图片

A)用户访问客户端(第三方应用),客户端引导(重定向)用户的代理(浏览器)去到授权服务器的授权页面,这个时候客户端会在URI上附上 clientId, redirectUri, requestScope以及 local state,例如:

GET HTTP/1.1
http://server.example.com/authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb&scope=read

B)授权服务器要求用户A输入用户密码认证身份,并询问用户A是否同意授权

C)假设用户同意授权,授权服务器使用 redirectUri (在authorization request中redirectUri或者客户端注册是的redirectUri)将用户导向客户端,并附上一个授权码code

https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

D)客户端拿到授权码code以后,在后台使用授权码向授权服务器发送post请求换取accessToken令牌,并附上在(A)这个步骤请求授权码的时候的redirectUri

POST HTTP/1.1
http://server.example.com/token
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb&clientId=xxx&clientSecret=xyzz

E)认证服务器认证客户端,检验授权码以及redirectUri,检验成功后发放 accesToken 以及 refreshToken 最后客户端就可以使用令牌向resourceServer请求资源了。

隐藏式

有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。

OAuth2 允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)“隐藏式”(implicit)

令牌直接存储到前端浏览器,是不太安全的。

图片

A)用户访问客户端(第三方应用),客户端引导(重定向)用户的代理(浏览器)去到授权服务器的授权页面,这个时候客户端会在URI上附上 clientId, redirectUri, requestScope以及 local state,例如:

GET HTTP/1.1
http://server.example.com/authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb&scope=read

B)授权服务器要求用户A输入用户密码认证身份,并询问用户A是否同意授权

C)假设用户同意授权,授权服务器使用 redirectUri (在authorization request中redirectUri或者客户端注册是的redirectUri)将用户导向客户端,并附上令牌 accessToken

https://client.example.com/cb?#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&token_type=example&expires_in=3600 

令牌的位置URL 锚点(fragment),而不是查询字符串,好像是为了避免中间人攻击啥的 (http)

D、E、G)看网上说是使用一段脚本能够将token从(C)重定向的URI抽取出来,具体怎么时候就不是很清楚了

最后客户端就可以使用令牌向resourceServer请求资源了。

密码式

OAuth2 允许用户把用户名和密码直接告诉该应用,该应用就使用你的密码申请令牌,这种方式称为"密码式"(password) 直接提供账号密码,风险很大,所以应当是用户高度新人客户端才会使用这种方式。

图片

客户端直接使用用户的账户密码去换取accessToken,发送的post请求:

POST 
http://server.example.com/token
body: grant_type=password&username=johndoe&password=A3ddj3w&clientId=xxx 

凭证式

客户端直接使用客户端凭证(client credentials)向认证服务器请求令牌,适用于没有前端的命令行应用。

图片

同样使用post请求:

POST 
http://server.example.com/token
body: grant_type=client_credentials&clientId=xxx&client_secret=SECRET

RefreshToken

图片

client请求token的时候,服务器一般会返回一个refreshToken,一般来说accessToken的过期时间很短,当accessToken过期了之后,授权服务器允许client通过refreshToken去再次请求一个新的accessToken。所以refreshToken的过期时间肯定是要比accessToken长。

refreshToken是可选的,如果对于安全要求比较高的话,可以不用。

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

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

相关文章

【算法】一个简单的整数问题(树状数组、差分)

题目 给定长度为 N 的数列 A,然后输入 M 行操作指令。 第一类指令形如 C l r d,表示把数列中第 l∼r 个数都加 d。 第二类指令形如 Q x,表示询问数列中第 x 个数的值。 对于每个询问,输出一个整数表示答案。 输入格式 第一行…

leetcode面试经典150题——33 最小覆盖子串(滑动窗口)

题目: 最小覆盖子串 描述: 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中…

MySQL双主双从数据库集群搭建

1 引言 在之前的文章中提到过相关搭建方法,具体请参考《MySQL主从数据库搭建》这篇文章,本文主要讲述双主双从,双主多从集群的搭建方式。 这里要问一个问题,为什么MySQL要搭建数据库集群呢?我想应该有以下几点原因&…

figma 基础使用 —— 常用方法

一、 导入组件 分成两种方式 (1)离线的包导入(iOS 常用组件.fig 直接拖拽到figma最近网页) (2)在插件市场下载https://www.figma.com/community 二、figma中使用标尺 快捷键:shift R 三、插…

爬虫学习 异步爬虫(五)

多线程 多进程 协程 进程 运行中的程序 线程 被CPU调度的执行过程,操作系统 运算调度的min单位 在进程之中,进程中实际运作单位 from threading import Thread#创建任务 def func(name):for i in range(100):print(name,i)if __name__ __main__:#创建线程t1 Thread(target …

SP3109 STRLCP - Longest Common Prefix 题解

SP3109 STRLCP - Longest Common Prefix 题解 某省某年省选原题出处,看来 CCF 出原题这事由来已久。 简化题意 让你维护一个字符串序列。支持单点修改。支持单点插入。支持询问两个子串的最长公共前缀。 解法 本篇题解前置芝士:无旋 Treap&#xff…

孔明棋,(n + 2) x (m + 2)的棋盘,中间n x m的区域都是棋子,求最后最少剩余几个棋子

题目 #include <iostream> using namespace std; int f(int n, int m) {int t, res;if (n > m){t n;n m;m t;}if (n 1)res (m 1) / 2;else if (n 2){if (m % 3 0)res 2;elseres 1;}else if (n 3){res 2;}return res; } int change(int x) {x % 3;if (x 0…

OpenHarmony亮相MTSC 2023 | 质量效率共进,赋能应用生态发展

11月25日&#xff0c;MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行。大会以“软件质量保障体系和测试研发技术交流”为主要目的&#xff0c;旨在为行业搭建一个深入探讨和交流的桥梁和平台。OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&a…

AI一键生成文案-免费AI一键生成文案的软件有哪些

AI一键生成文案的原理涉及自然语言处理&#xff08;NLP&#xff09;和机器学习技术。这种技术的核心是基于大量文本数据的模式识别和生成&#xff0c;通常使用深度学习模型&#xff0c;如循环神经网络&#xff08;RNN&#xff09;、长短期记忆网络&#xff08;LSTM&#xff09;…

六、Lua运算符

文章目录 一、Lua 运算符&#xff08;一&#xff09;算术运算符&#xff08;二&#xff09;关系运算符&#xff08;三&#xff09;逻辑运算符&#xff08;四&#xff09;其他运算符 二、运算符优先级 一、Lua 运算符 运算符是一个特殊的符号&#xff0c;用于告诉解释器执行特定…

【双指针】四数之和

四数之和 建议做过了解三数之和的思想再做这道题&#xff0c;思路是一样的~ 题目描述 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [num…

第1章 理解知识图谱(一)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

大模型的开源闭源

文章目录 开源&闭源开源和闭源的优劣势比较开源和闭源对大模型技术发展的影响开源与闭源的商业模式比较国内的大模型开源和闭源的现状和趋势 开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。 开源让技术共享&#xff0c;吸引了众…

【objectarx.net】table问题2:添加table后,保存时出错

添加table后&#xff0c;保存时出现以上对话框。 原因&#xff1a; tb.TableStyle db.Tablestyle; 对于这句代码&#xff0c;tb所在的数据库和db不是同一个。

数据库SQL小技巧大揭秘:IGNORE选项让你的数据处理更从容

点击上方蓝字关注我 在 MySQL 中&#xff0c;IGNORE 是一种在插入或更新数据时处理冲突的选项。具体来说&#xff0c;在 INSERT | UPDATE 语句中&#xff0c;IGNORE 的作用是在插入或更新数据时忽略特定的错误&#xff0c;而不导致整个操作失败。另外&#xff0c;IGNORE 选项还…

开发定制化抖音票务小程序的技术解析

通过定制化抖音票务小程序&#xff0c;可以为用户提供更加个性化的活动体验&#xff0c;同时也为企业和品牌提供了更多的营销机会。 一、小程序开发框架的选择 在开发定制化抖音票务小程序之前&#xff0c;选择合适的小程序开发框架至关重要。目前&#xff0c;主流的小程序框…

如何用Python批量删除视频的头尾(88)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 关注我&#xff0c;一起趣味学编程&#xff01; 今天我们继续用Python玩转视频。 还是用Python的第三方库moviepy。 如果你对此文章感兴趣的话&#xff0c;可以看看之前的…

mysql 命令行导入sql 数据,windows导入,强制导入

线上用了polarDB&#xff0c; 本地导入的时候&#xff0c;通过navicat 的备份导入和执行sql文件的方式导入都失败了 用命令行的方式可以导入sql 当我用windows 的cmd 导入的时候&#xff0c;会报一些命令行的错误。 那其实我检查了这个命令是没有问题的。 mysql -uroot -p hu…

文本生成超逼真歌曲,谷歌推出音乐模型Lyria

转换示例 谷歌旗下的DeepMind与视频平台YT合作&#xff0c;发布了目前最先进的音乐模型——Lyria。 为了突破传统音乐模型的生硬机器感&#xff0c;谷歌汇集了多个部门并与Charlie Puth、T-Pain、Troye Sivan等9位知名音乐人共同研发了Lyria。 Lyria可生成爵士、重金属、摇滚…

配置zabbix-proxy主动式

IP地址对应关系如下&#xff1a; zabbix-server122.9.8.21zabbix-proxy122.9.4.102zabbix-agent2116.63.9.109 一、 安装zabbix-server https://blog.csdn.net/qq_50247813/article/details/132131774 二、 安装zabbix-proxy a. 安装zabbix源 rpm -Uvh https://repo.zabbix…