公司网站网页设计,什么是网络营销?网络营销的常用方法有哪些?,石泉县城乡建设局网站,网站开发的8个步骤hi#xff0c;这里是桑小榆#xff0c;这次分享的不是生活文#xff0c;而是技术文。基于OAuth2.0协议的授权认证#xff0c;初次接触授权认证知识的时候#xff0c;出现了不少热门名词#xff0c;“OAuth”#xff0c;“JWT”#xff0c;“OIDC”#xff0c;这简直让… hi这里是桑小榆这次分享的不是生活文而是技术文。基于OAuth2.0协议的授权认证初次接触授权认证知识的时候出现了不少热门名词“OAuth”“JWT”“OIDC”这简直让人头大晕头转向甚至学了又不知道自己学了啥网络上看见相关的文章也是一头雾水要么是部分知识要么是讲着讲着莫名其妙蹦出一个陌生词。▲图/ 来源《功夫》所以这次本着大道至简的思想和大家一起探讨如果有看不懂的地方那就是我没理解或者讲明白。本篇不包含源码先以理论基础理解作为铺垫后篇将会以源码实操的方式进行帮助理解。首先我们回顾传统的授权方式基本是通过账号密码的方式进行授权认证授予第三方也是通过共享密码的方式进行授权。随着信息化的普及系统越来越庞大人人对于网络触手可及这就容易带来安全隐患。第一用户授权第三方通过共享密码此处密码也是明文的显然很不安全。第二我们给第三方的权限其实也就一小部分如果通过密码共享则第三方通过你的密码可以获取所有的权限这是不安全的。第三我们授权了第三方应用之后我们是无法撤回权限的。只能通过更改密码那么我们授权的第三方都会受影响非常麻烦且需要重新授权。基于以上传统授权方式的缺陷于是引入了OAuth协议。协议顾名思义就是大家国际互联组织共同达成的一种标准的规则。这种协议例如大家耳熟能详的IP协议TCP协议等都是共同制定的一种标准协议防止各个国家或企业拥有自己的协议就容易造成协议泛滥使用受限且对接繁杂。OAuth协议也属于网络层的协议,为了保护资源安全而存在。既然是协议那必然需要一种传输介质使得挨家挨户都认识且需要携带能够识别身份的信息那就是JWTJson 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、哔哩哔哩等知名应用就是使用的这种模式因为通过授权码的方式可以有效的隐藏令牌不被泄露安全性更高。具体授权码如何操作我们可以举个实际的例子▲图/ 来源B站登录界面比如我们想登录哔哩哔哩网站哔哩哔哩提供了第三方登录方式微信微博或者QQ登录。1.当我们选择微信登录的时候哔哩哔哩会提供一个跳转链接我们点击的时会跳转到微信授权服务器。//接口服务
https://open.weixin.qq.com/connect/qrconnect
?appidwxafc256bf83583323
redirect_urihttps%3A%2F%2Fpassport.bilibili.com%2Flogin%2Fsnsback%3Fsns%3Dwechat%26state%3D8b90df300a6711edbeb2d280ef8fddbc%26source%3Dnew_main_mini
response_typecodescopesnsapi_login
stateauthorize#wechat_redirect参数解释
appid是微信端开放的授权标识相当于client_id。
refirect_uri回跳地址微信生成授权码code之后就会在这个链接上回传给哔哩哔哩。
response_type授权类型此处为授权码类型。
scope授权范围此处为是授权给哔哩哔哩的授权api。
state校验参数校验用户信息是否被篡改。2.我们扫码之后微信服务器会询问我们是否授权哔哩哔哩将获取你的昵称、头像。3.当我们点击允许的时候微信授权服务器就会针对当前操作的用户返回一个授权码给代理用户代理用户就是指的浏览器因为是浏览器帮我们去询问授权的。4.确认授权之后代理用户浏览器就会把这个授权码通过重定向地址传回给哔哩哔哩。5.哔哩哔哩拿着这个授权码和其他重要认证信息向微信授权服务器请求令牌。6.微信授权服务器接收并识别这个授权码之后发送一个令牌给哔哩哔哩。7.哔哩哔哩拿着这个令牌就去获取微信资源服务器读取用户资料。▲图/ 授权码模式图解隐式模式不推荐使用适合没有后台的第三方。他的使用方式我们还通过哔哩哔哩登录的例子说明。//接口服务
https://open.weixin.qq.com/connect/qrconnect
?appidwxafc256bf83583323
redirect_urihttps://www.blibli.com/callback
response_typetokenscopesnsapi_login
stateauthorize#wechat_redirect1.登录哔哩哔哩时会提供一个微信登录的链接我们点击之后会跳转到微信授权服务器。2.进入之后微信服务器会询问我们是否授权哔哩哔哩并确认授权给哔哩哔哩。3.此时微信授权服务器直接把令牌发送给了哔哩哔哩哔哩哔哩根据令牌获取用户的信息。我们发现这个模式是没有哔哩哔哩后台认证与微信授权服务交互的过程仅仅是拿到令牌之后返回到了哔哩哔哩的前台。这种方式我们很容易通过链接进行存储和伪造授权是不安全的。密码模式适合传统的账户密码系统改造为OAuth授权以及用户在很信任第三方的情况下使用。//接口服务
https://open.weixin.qq.com/connect/qrconnect
?appidwxafc256bf83583323
grant_typepassword
usernamesunny_100kmilesrpasswordimluckyboy
scopesnsapi_login
stateauthorize //wechat_redirect1.该模式登录哔哩哔哩时哔哩哔哩会使用我们的账号密码直接向微信授权服务器索要令牌。2.微信授权服务器接收到账号密码之后匹配成功则会发送令牌给哔哩哔哩。3.哔哩哔哩根据令牌获取我们的信息但如果更改了密码之后也需要重新刷新令牌。客户端模式适合没有前端的第三方也没有用户的参与。仅仅是授权服务器与资源服务器之间的交互。//接口服务
https://open.weixin.qq.com/connect/qrconnect
?appidwxafc256bf83583323
grant_typeclient_credentials
client_secretxxxxxxxx综合以上四个授权模式有些敏锐的小伙伴会发现第一种整体来看较为复杂为何要使用授权码code去微信授权服务器获取token令牌呢直接在第四步将token直接返回给客户端哔哩哔哩不是更加方便吗还减少了一次客户端与授权服务器的交互性能上也更优这种授权码的设计方式也不难理解如果直接将token令牌通过redirect_uri回调的方式返回给客户端哔哩哔哩的话也就是经过了代理用户浏览器这一层此时浏览器传送的过程中很容易存到浏览器的cacher和log记录中也容易传到其他恶意站点或者被截获这给攻击者盗取令牌带来了更多机会。并且浏览器的redirect_uri本身就是一个不安全的信息通道通常我们不会把重要敏感的数据以这种方式传递。因此引入授权码进行授权OAuth协议经用户授权之后生成一个code给哔哩哔哩客户端哔哩哔哩后台将会根据这个code和其他重要信息例如微信的appidappsecrect等向微信授权服务获取令牌。这个时候我们会发现就算授权码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.htmlhttps://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 更多有趣内容请多关注