OAuth2学习中的一些高频问题的QA
关于OAuth2相信很多初学者都有一些疑问,胖哥将这些疑问一一收集了起来做成了QA,或许能帮助学习者。
OAuth2相关的QA
Q:OAuth2 的一些常用场景?
A: OAuth2主要用于API授权,是跨API服务之间授权的解决方案。它适用于单点登录(SSO)、微服务之间的授权鉴权、API开放平台等场景。
Q: 什么是OAuth2客户端?
A: 在OAuth2授权服务器上注册为客户端,并获得专属client_id
标识的才是OAuth2客户端。安卓应用、IOS应用、Web前端等客户端应用也要遵循这个原则,它们本身注册到OAuth2授权服务器才能成为OAuth2客户端,否则就不是OAuth2客户端,必须是它们本身,而不是支撑它们的后端服务。
Q:OAuth2 客户端为什么分为public和confidential两种类型,分别是什么场景?
A:rfc6749#section-2.1 根据OAuth2客户端自身是否有能力维护客户端凭据(client credentials)的私密性,是否能安全地通过授权服务器对客户端的资质进行认证将OAuth2客户端分为机密客户端和公共客户端。大部分的后端数据服务都应该被注册为机密客户端;无法保障自身凭据安全的都应该被注册为公共客户端,公共客户端是没有client_sercet
的,直接注册到OAuth2授权服务器的执行客户端,不通过后端应用进行访问令牌中继的都是公共客户端,例如在一些特定场景下需要直连授权服务器的Web应用、移动应用。
Q:OAuth2 的
access_token
和refresh_token
应该直接返回给前端吗?
A:能不能返回给前端取决于这个前端是不是直接在授权服务器的OAuth2客户端,如果不是,就不能持有access_token
和refresh_token
,access_token
和refresh_token
的签发目标只能是OAuth2客户端。如果暴露面放开,则很容易被盗用。
Q:非OAuth2客户端的客户端应用既然不能直接持有
access_token
和refresh_token
的话,应该如何获取授权状态?
A:当授权成功后,令牌和用户客户端侧可以借助于session或者cookie进行一个映射,当然也可以考虑计算出一个不透明令牌( Opaque Token )映射,具体根据业务考量。
Q:OAuth2中的
scope
是什么?
A:OAuth2是一个授权框架,授权自然要划定一个范围(scope),以保证OAuth2客户端在既定的范围内行事而不越界。它起到的作用和RBAC中的role
其实类似,都是用来限制资源的访问权限的。 role
针对的是资源拥有者(Resource Owner),而scope
针对的是OAuth2客户端。 当然有一个例外openid
,这个是OIDC 1.0的标识,算一个关键字。
Q:OAuth2 中的登录页面和授权确认页面能不能用前后端分离的方式?
A:很多开发者不希望点击授权的时候被302重定向到授权服务器提供的登录页面,但是你得明白一个道理, OAuth2客户端和授权服务器之间并不是一个完全信任的关系。外卖小哥给你送外卖,你肯定希望发放给他的是一个临时门禁通行码,而不是一个常用通行码。另外ajax无法安全地处理OAuth2授权流程中的302重定向问题,这也是一个技术问题。
**Q:OAuth2 **客户端能否做用户认证?
A:OAuth2本身并没有定义用户如何向OAuth2客户端认证身份,这里要和授权服务器上的用户认证区别开来。OAuth2客户端在完成授权时可以拿到授权凭据,但是并不能直接拿到用户信息,如果授权服务器提供了获取用户信息的资源接口,OAuth2客户端可以通过该接口尝试获取用户信息用来表明用户的身份,这取决于用户是否授权了OAuth2客户端这样做。OIDC 1.0补充定义了OAuth2客户端对用户进行认证的细节流程。
Q:OAuth2客户端认证是什么?
A:confidential类型的OAuth2客户端虽然在OAuth2授权服务器注册,它们要根据一些策略(Client Authentication Method)来向授权服务器证明自己是合法的客户端。这样它们才能调用一些OAuth2规定的端点,比如/oauth2/token
令牌端点、/oauth2/revoke
令牌撤销端点等等。关于OAuth2客户端认证的细节可以参考OAuth2客户端认证过滤器详解。
Q:OAuth2密码模式为什么被废除了?
A:准确地说目前密码模式在OAuth2.1中被移除了,包括OAuth0、okta等知名三方授权服务机构都对密码模式进行了移除处理。
密码模式诞生的时候,像React、Vue这种单页应用还没有兴起,甚至连框架都还没有呢。它更像一种为了解决遗留问题而采用的过渡方案。在传统应用中,用户习惯了把密码直接交给客户端换取资源访问权限,而不是跳来跳去去拉授权、确认授权。OAuth2诞生之时为了让用户从传统思维中慢慢转变过来就设计了这种模式。 它打破了委托授权的模式,降低了OAuth2的安全性。
更多的细节请参考我往期的相关文章。
Q:OAuth2中的资源服务器怎么讲?
A:只要包含了需要OAuth2客户端携带access_token
访问的资源接口的服务器都可以认为是资源服务器,包括OAuth2客户端、OAuth2授权服务器都可以根据业务和架构承担资源服务器的功能。从用户(资源所有者)角度来说,存放用户可以授权的资源接口的服务器都可以是资源服务器。资源服务器可以对访问令牌access_token
进行解码、校验,并确定本次请求是否合规。
Q:微服务是否可以不使用OAuth2?
当然可以,OAuth2只不过是目前微服务访问控制的解决方案之一,并不是唯一选项。
总结
这就是最近胖哥被问的比较多的一些问题,相信能够帮助各位。OAuth2的东西并不简单,经过近三年内断断续续的学习,胖哥才完完全全理解这个东西,所以各位学习者不要心急,学的枯燥的时候先晾一时间,学这个最重要的是理解它的概念和流程,这远比各种框架重要,OAuth2本身和语言是无关的。
关注公众号:Felordcn 获取更多资讯
OAuth2学习中的一些高频问题的QA的更多相关文章
- OAuth2学习及DotNetOpenAuth部分源码研究
OAuth2学习及DotNetOpenAuth部分源码研究 在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. 一.什么是OAuth2 OAuth是 ...
- 卷积在深度学习中的作用(转自http://timdettmers.com/2015/03/26/convolution-deep-learning/)
卷积可能是现在深入学习中最重要的概念.卷积网络和卷积网络将深度学习推向了几乎所有机器学习任务的最前沿.但是,卷积如此强大呢?它是如何工作的?在这篇博客文章中,我将解释卷积并将其与其他概念联系起来,以帮 ...
- PYTHON替代MATLAB在线性代数学习中的应用(使用Python辅助MIT 18.06 Linear Algebra学习)
前言 MATLAB一向是理工科学生的必备神器,但随着中美贸易冲突的一再升级,禁售与禁用的阴云也持续笼罩在高等学院的头顶.也许我们都应当考虑更多的途径,来辅助我们的学习和研究工作. 虽然PYTHON和众 ...
- 记录Python学习中的几个小问题
记录Python学习中的几个小问题,和C#\JAVA的习惯都不太一样. 1.Django模板中比较两个值是否相等 错误的做法 <option value="{{group.id}}&q ...
- 深度学习中的Data Augmentation方法(转)基于keras
在深度学习中,当数据量不够大时候,常常采用下面4中方法: 1. 人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data Augm ...
- Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)
Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...
- Java 需要记得、了解的关键词 (Java 学习中的小记录)
Java 需要记得.了解的关键词 (Java 学习中的小记录) 作者:王可利(Star·星星) 总结:本次随笔,仅且拿来平时翻阅记忆用
- Java学习中,常用的命令管理(Java 学习中的小记录)
Java学习中,常用的命令管理 作者:王可利(Star·星星) 一.Window中常见的dos命令 在哪里操作dos命令: Win7 ---> 开始 ---->所有程序---& ...
- Java基础学习中一些词语和语句的使用
在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...
随机推荐
- Python 图_系列之基于<链接表>实现无向图最短路径搜索
图的常用存储方式有 2 种: 邻接炬阵 链接表 邻接炬阵的优点和缺点都很明显.优点是简单.易理解,对于大部分图结构而言,都是稀疏的,使用炬阵存储空间浪费就较大. 链接表的存储相比较邻接炬阵,使用起来更 ...
- c++对c的拓展_using
using 声明:使指定标识符可用 注意:与其他同名标识符有作用域冲突时产生二义性即报错 using 编辑指令: 使整个命名空间标识符可用 注意:与其他同名标识符作用域发生冲突使时优先使用局部变量 ...
- numpy教程03---ndarray的运算
欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...
- python---virtualenv创建管理虚拟环境
virtualenv创建虚拟环境 安装包virtualenv pip install virtualenv 常用命令 # 为项目创建虚拟环境 cd project_dir virtualenv env ...
- linux运行二进制文件编写方式
chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本 注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test. ...
- 学习HTML第二天
今日内容: HTML标签:表单标签 CSS HTML标签:表单标签 表单项标签: input:可以通过type属性值,改变元素展示的样式 type属性: text:文本输入框,默认值 placehol ...
- 邮件html页编写指南
前言 写过邮件的html一般都用table来布局,为什么呢?原因是大多数的邮件客户端(比如Outlook和Gmail),会过滤经过多次的邮件编写实践及度娘的指导,我发现,编写自制兼容outlook与f ...
- HTML中的Hack手段之条件注释
通常WEB的好处就是可以跨平台,但这个世界偏偏有个另类,就是IE浏览器.在平常做HTML设计时,有时需要为IE的表示差异而不得不使用一些Hack手段.条件注释就是这类手段之一. 条件注释是IE浏览器的 ...
- 攻防世界-MISC:gif
这是攻防世界新手练习区的第七题,题目如下: 点击下载附件1,得到一个压缩包,解压后得到一些图片 嗯,黑白相间(又是懵逼的时候),又跑去看WP了,说是打开文件出现多个黑白,让人联想到二进制,白色图片代表 ...
- 一文看懂二层接口、三层接口、PVID及VLANIF
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 文章来源:朱仕耿个人博客 一位同事问了个关于二层和三层端口的概念及区分,以及关于VLANIF. ...