OAuth,JWT ,OIDC你们搞得我好乱啊

hi,这里是桑小榆,这次分享的不是生活文,而是技术文。

基于OAuth2.0协议的授权认证,初次接触授权认证知识的时候,出现了不少热门名词,“OAuth”,“JWT”,“OIDC”,这简直让人头大,晕头转向甚至学了又不知道自己学了啥,网络上看见相关的文章也是一头雾水,要么是部分知识,要么是讲着讲着莫名其妙蹦出一个陌生词。

b0b2fc9441e860585a514df7da575868.png

▲图/ 来源《功夫》

所以这次,本着大道至简的思想,和大家一起探讨,如果有看不懂的地方,那就是我没理解或者讲明白。本篇不包含源码,先以理论基础理解作为铺垫,后篇将会以源码实操的方式进行帮助理解。

首先我们回顾传统的授权方式,基本是通过账号,密码的方式进行授权认证,授予第三方也是通过共享密码的方式进行授权。随着信息化的普及,系统越来越庞大,人人对于网络触手可及,这就容易带来安全隐患。

第一,用户授权第三方通过共享密码,此处密码也是明文的,显然很不安全。

第二,我们给第三方的权限其实也就一小部分,如果通过密码共享,则第三方通过你的密码可以获取所有的权限,这是不安全的。

第三,我们授权了第三方应用之后,我们是无法撤回权限的。只能通过更改密码,那么我们授权的第三方都会受影响,非常麻烦且需要重新授权。

基于以上传统授权方式的缺陷,于是引入了OAuth协议。协议,顾名思义就是大家(国际互联组织)共同达成的一种标准的规则。这种协议,例如大家耳熟能详的IP协议,TCP协议等都是共同制定的一种标准协议,防止各个国家或企业拥有自己的协议就容易造成协议泛滥,使用受限且对接繁杂。

OAuth协议,也属于网络层的协议,为了保护资源安全而存在。既然是协议,那必然需要一种传输介质,使得挨家挨户都认识,且需要携带能够识别身份的信息,那就是JWT(Json Web Token),也就是我们常说的Token令牌,关于JWT内容将在下篇探讨。

那么,OAuth协议包含了哪些内容呢?

首先是四个主要的参与角色。

Resource Owner:资源所有者,对资源具有授权能力的人,也就是用户。

Resource Server: 资源服务器,保存用户信息的服务器并且能够验证令牌是否合法(比如说微信服务器,保存你的微信头像,昵称等)。

Client:客户端,第三方应用,它获得用户的授权后便可以去访问用户的信息。比如哔哩哔哩。

Authorization Server:授权服务器,它将认证用户的身份,为用户提供授权审批流程,并最终颁发授权令牌(Access Token)。发送令牌给第三方的服务器(可以和资源服务器是同一个)

通过OAuth协议的几个参与者,我们可以总结OAuth的作用,是让用户的权限,安全可控的授予第三方应用,第三方应用获取到用户授予的权限之后,与资源服务器进行交互。

其次,OAuth 支持四种授权模式。

由于客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。因此OAuth支持获得令牌的方式有四种。

授权码模式(authorization code)

授权码模式是比较标准的模式,微信、GitHub、哔哩哔哩等知名应用就是使用的这种模式,因为通过授权码的方式可以有效的隐藏令牌不被泄露,安全性更高。

具体授权码如何操作,我们可以举个实际的例子:

4efa73ac294eef27c1bffaab45ffa726.png

▲图/ 来源B站登录界面

比如,我们想登录哔哩哔哩网站,哔哩哔哩提供了第三方登录方式,微信,微博或者QQ登录。

1.当我们选择微信登录的时候,哔哩哔哩会提供一个跳转链接,我们点击的时会跳转到微信授权服务器。

//接口服务
https://open.weixin.qq.com/connect/qrconnect
?appid=wxafc256bf83583323
&redirect_uri=https%3A%2F%2Fpassport.bilibili.com%2Flogin%2Fsnsback%3Fsns%3Dwechat%26state%3D8b90df300a6711edbeb2d280ef8fddbc%26source%3Dnew_main_mini
&response_type=code&scope=snsapi_login
&state=authorize#wechat_redirect参数解释:
appid:是微信端开放的授权标识,相当于client_id。
refirect_uri:回跳地址,微信生成授权码code之后就会在这个链接上回传给哔哩哔哩。
response_type:授权类型,此处为授权码类型。
scope:授权范围,此处为是授权给哔哩哔哩的授权api。
state:校验参数,校验用户信息是否被篡改。

2.我们扫码之后,微信服务器会询问我们是否授权哔哩哔哩(将获取你的昵称、头像)。

3.当我们点击允许的时候,微信授权服务器就会针对当前操作的用户返回一个授权码给代理用户,代理用户就是指的浏览器,因为是浏览器帮我们去询问授权的。

4.确认授权之后,代理用户(浏览器)就会把这个授权码通过重定向地址传回给哔哩哔哩。

5.哔哩哔哩拿着这个授权码和其他重要认证信息向微信授权服务器请求令牌。

6.微信授权服务器接收并识别这个授权码之后发送一个令牌给哔哩哔哩。

7.哔哩哔哩拿着这个令牌就去获取微信资源服务器读取用户资料。

40f94c5089a3be9289cdf261a6664ff5.png

▲图/ 授权码模式图解

隐式模式(不推荐使用),适合没有后台的第三方。

他的使用方式,我们还通过哔哩哔哩登录的例子说明。

//接口服务
https://open.weixin.qq.com/connect/qrconnect
?appid=wxafc256bf83583323
&redirect_uri=https://www.blibli.com/callback
&response_type=token&scope=snsapi_login
&state=authorize#wechat_redirect

1.登录哔哩哔哩时,会提供一个微信登录的链接,我们点击之后会跳转到微信授权服务器。

2.进入之后,微信服务器会询问我们是否授权哔哩哔哩,并确认授权给哔哩哔哩。

3.此时,微信授权服务器直接把令牌发送给了哔哩哔哩,哔哩哔哩根据令牌获取用户的信息。

我们发现,这个模式是没有哔哩哔哩后台认证与微信授权服务交互的过程,仅仅是拿到令牌之后返回到了哔哩哔哩的前台。这种方式我们很容易通过链接进行存储和伪造授权,是不安全的。

密码模式,适合传统的账户密码系统改造为OAuth授权,以及用户在很信任第三方的情况下使用。

//接口服务
https://open.weixin.qq.com/connect/qrconnect
?appid=wxafc256bf83583323
&grant_type=password
&username=sunny_100kmiles&rpassword=imluckyboy
&scope=snsapi_login
&state=authorize //wechat_redirect

1.该模式登录哔哩哔哩时,哔哩哔哩会使用我们的账号密码直接向微信授权服务器索要令牌。

2.微信授权服务器接收到账号密码之后匹配成功则会发送令牌给哔哩哔哩。

3.哔哩哔哩根据令牌获取我们的信息,但如果更改了密码之后也需要重新刷新令牌。

客户端模式,适合没有前端的第三方,也没有用户的参与。仅仅是授权服务器与资源服务器之间的交互。

//接口服务
https://open.weixin.qq.com/connect/qrconnect
?appid=wxafc256bf83583323
&grant_type=client_credentials
&client_secret=xxxxxxxx

综合以上四个授权模式,有些敏锐的小伙伴会发现,第一种整体来看较为复杂,为何要使用授权码code去微信授权服务器获取token(令牌)呢?直接在第四步,将token直接返回给客户端哔哩哔哩,不是更加方便吗?还减少了一次客户端与授权服务器的交互,性能上也更优?

这种授权码的设计方式也不难理解,如果直接将token(令牌)通过redirect_uri回调的方式返回给客户端哔哩哔哩的话,也就是经过了代理用户(浏览器)这一层,此时浏览器传送的过程中很容易存到浏览器的cacher和log记录中,也容易传到其他恶意站点或者被截获,这给攻击者盗取令牌带来了更多机会。

并且浏览器的redirect_uri本身就是一个不安全的信息通道,通常我们不会把重要,敏感的数据以这种方式传递。

因此,引入授权码进行授权,OAuth协议经用户授权之后生成一个code给哔哩哔哩客户端,哔哩哔哩后台将会根据这个code和其他重要信息(例如微信的appid,appsecrect等)向微信授权服务获取令牌。这个时候我们会发现就算授权码code被攻击者截获了也起不到任何的作用,大大提高了安全性。

那么,这种模式设计就无懈可击了?显然拿到令牌之后,向资源服务器请求交互的过程中,还是会被截获token,甚至被篡改。

在OAuth1.0协议中,是通过反复的对授权码code和token进行签名,来保证token不会被篡改,但是OAuth2.0却没有这项,因为OAuth2.0是基于https的,我们知道https协议传送的报文是加密的,不容易被篡改。显然OAuth2.0在这基础之上,性能上更优于OAuth1.0的。

还有一种存在的问题就是。用户授权之后,授权码code会通过redirect_uri进行传回给哔哩哔哩客户端,如果没有对这串redirect_uri进行校验,或者校验规则级别不高。例如,哔哩哔哩提供的回调地址是www.blibli.com,但是被人截获篡改成了www.clicli.com\www.blibli.com,那么这样的授权就被www.clicli给劫走了。这就是跨站请求伪造。

由于这个授权服务器,哔哩哔哩客户端和用户之间有几次交互,在得到授权码的时候需要一次回跳,但是这次回跳是可以被阻塞的。

那么就会出现这样的案例,比如我是黑客,我使用自己的账号登录哔哩哔哩进行第三方微信登录,当我授权之后,微信授权服务会返回带有授权码code的回跳链接给哔哩哔哩客户端,返回的过程中被我阻塞了,哔哩哔哩客户端就收不到授权码。

此时,我将这个跳转链接发给正处于登录状态的用户(小张)。

诱导小张进行正常点击,那么我的账号返回的授权码链接就被小张点击之后向微信服务器获取令牌,那么此时我的第三方账号和小张的账号就已经绑定了,此时我相当于以小张的账号进行登录哔哩哔哩,进行删除资源,删除好友,取关等一系列恶意操作。

艺术来源于生活,这一点儿也不假。在网络上看到过这样的一起案例。

A女士前往ATM取钱,在插卡输入密码之后,后面排队的B先生扔了几张真钞到A女士的脚旁诱导她去捡真钞,B先生遂即切换A女士的卡将自己的卡插入ATM机,之后A女士发现需要重新登录,输入几次密码之后依然输入错误,慌忙之中B先生建议A女士前往旁边的前台咨询,于是便去了。在A女士连续输入几次密码之后,早已被B先生记住了,支开A女士之后使用A女士的银行卡进行操作。这一通引开注意,诱导操作是不是和刚刚的案例具有异曲同工之妙呢。

那么在程序里,基于OAuth2.0中是如何解决的呢?

回到上面授权码模式给出的链接,你会发现参数中多了一个state参数,通过携带的state参数,哔哩哔哩就可以通过state进行校验账户的信息是否被篡改。此时的state就相当于当前账号的sessionid,或cookie的签名串。

好了,以上我们探讨了OAuth的设计原理以及作用。并且抛出了JWT(令牌)的作用和概念,下篇中会详细讲解JWT是如何带着将令穿梭在端与端之间。

参考资料:

https://www.rfc-editor.org/rfc/rfc6749.html

https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

👇 更多有趣内容,请多关注!👇

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

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

相关文章

软件测试技术第二次作业——程序错误的判断

在做作业之前我们首先要明确软件测试过程中的几个名词: Fault:在软件测试中,fault是指程序中静态的缺陷,也就是指在程序中存在的编程错误。 Error:在软件测试中,error是指由于程序中存在的fault而产生的不正…

不只是日志收集,项目监控工具Sentry的安装、配置、使用

前言上一篇文章介绍了ExceptionLess这个日志收集系统:ExceptionLess的安装、配置、使用由于ExceptionLess官方提供的客户端只有.Net/.NetCore平台和js的,本文继续介绍另一个日志收集系统:SentrySentry 是一个实时事件日志记录和聚合平台。&am…

64个数据分析常用术语

导读:本篇文章,我们来讲讲数据分析常用语。 内容综合整理自网络 01 绝对数和相对数 绝对数:是反应客观现象总体在一定时间、一定地点下的总规模、总水平的综合性指标,也是数据分析中常用的指标。比如年GDP,总人口等等。…

redis 的bitmap 开源包 bitmapist的应用

2019独角兽企业重金招聘Python工程师标准>>> 原理:http://my.oschina.net/u/1458120/blog/545224 bitmap包:https://github.com/Doist/bitmapist 要求redis> 2.6.0 bitmapist-master.zip 安装自己下载解压 python setup.py install &…

Django Views(视图函数)

http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpRequest 检测方法:isinstance(request,HttpRequest) 1 HttpRequest对象…

massCode 一款优秀的开源代码片段管理器

本文将介绍一款适合程序员使用的个人代码片段管理工具 massCode[1]。massCode小时候,也许我们每个人都会被老师要求有一个到处摘录优美句子段落的作文素材本 —— 采蜜集。不可否认,这对我们的写作水平的提高确实有很大的帮助。对开发人员来说当然也需要…

【ArcGIS Pro微课1000例】0021:Win10系统ArcGIS Pro3.0.1安装教程(附ArcGIS Pro下载)

本文讲解Win10系统上ArcGIS Pro3.0.1安装教程,附软件包下载。 文章目录 一、 软件安装步骤1. 安装.net Runtime 62. 安装ArcGIS Pro3. 安装中文语言4. 删除代理二、软件下载地址一、 软件安装步骤 [软件名称]: ArcGIS Pro 3.0.1 [软件大小]:4.33GB [安装环境]: Win 11/Win …

iOS逆向工程——非越狱调试

其实iOS的逆向分析业界已经十分成熟了,网上也有许多有趣的尝试(一步一步实现iOS微信自动抢红包(非越狱)。本文着重于如何在非越狱机器上进行调试,出于学习及总结的目的,记录于此。 本文以破解游戏梦幻西游为例,逐步讲解整个调试流…

[转]2022 Flutter 宣布发布 Windows 正式版

原文链接: https://medium.com/flutter/announcing-flutter-for-windows-6979d0d01fed 自从推出 Flutter 以来,我们一直专注于为漂亮的定制应用提供跨平台解决方案,这些应用被编译为机器代码并充分利用设备的底层图形硬件功能。 今天这一愿景…

电脑经常弹出“不支持的硬件”解决办法

电脑经常弹出“不支持的硬件”解决办法。 通过微软官方查证,这是由于以上处理器需要最新的Windows10系统才会这样子的,而大多出现该提示的都安装了Win7或是Win8.1系统。 来至微软官方的说明 此错误出现的原因是各代新处理器要求最新Windows版本以获得支持。 例如,Windows 1…

使用 Web API 上传和下载多个文件

原文作者:Jay Krishna Reddy原文链接:https://www.c-sharpcorner.com/article/upload-and-download-multiple-files-using-web-api/翻译:沙漠尽头的狼(谷歌翻译加持,文中版本使用.NET 6升级)---正文开始---…

【MapGIS精品教程】002:GDB本地数据库的使用

本文主要内容为MapGISGDB本地数据库的使用,包括:GDB企业管理器的认识、GDB本地数据库的创建方法、GDB本地数据库的备份和恢复。 1. GDB企业管理器的认识 GDB是地理数据的资源管理器,主要对空间数据进行有序组织与管理。 GDB数据管理包括&…

RabbitMQ学习3----运行和管理RabbitMQ

1.服务为管理 Erlang天生就是为了让应用程序无需知道对方是否存在同一台机器上即可互相通信。 Erlang节点:Erlang虚拟机的每个实例。多个Erlang应用程序可以运行在同一个节点之上。节点之间可以进行本地通信(不管他们是运行在同一台服务器之上&#xff0…

各代移动网络性能

摘自《中国元宇宙白皮书》 下载整书完整版https://www.aliyundrive.com/s/gXQvRLM22kD

EFCore高级Saas系统下单DbContext如何支持不同数据库的迁移

前言随着系统的不断开发和迭代默认的efcore功能十分强大,但是随着Saas系统的引进efcore基于表字段的多租户模式已经非常完美了,但是基于数据库的多租户也是可以用的,但是也存在缺点,缺点就是没有办法支持不同数据库,mi…

51. Python 数据处理(2)

1.Python 修改excel文件import xlrd import xlutils.copy excelr xlrd.open_workbook("hello.xlsx") excelw xlutils.copy.copy(excelr) sheet1 excelw.get_sheet(0) sheet1.write(3, 5, "xlutils.copy test test") excelw.save("hello.xlsx"…

人工智能十大流行算法

导读:本文为有志于成为数据科学家或对此感兴趣的读者们介绍最流行的机器学习算法。 作者:Fahim ul Haq 译者:刘志勇,策划:赵钰莹 来源:InfoQ(ID:infoqchina) 机器学习是…

Win7+Win10双系统安装全攻略

安装双系统,不仅能给你非凡的体验,还可以满足工作中因系统版本,兼容性,处理器等原因带来的不便。本文讲解Win7+Win10双系统安装全攻略,亲测可用。 1. 硬盘分区 本文讲解利用固态硬盘+机械硬盘的分区方式。 固态硬盘:为了绝对提高系统运行的速度,将固态硬盘作为双系统的…

聊聊研发团队中的“人”

大家好,我是Z哥。汉字博大精深,很多时候我们可以通过拆字来更形象地理解一个词的含义。比如“团队”这个词的两个字"团"和“队”单独看也都是表示一种由多人组成的组织。再做一下拆字就是“口”“才”和“耳”“人”。前者表示一个人才如果没有…