汕尾海湾 发表于 2024-9-21 07:49:40

【OAuth2】为什么授权码模式更安全?为什么使用授权码比直接返回token更安

什么是OAuth2

简而言之:安全的用你的其他账号登岸一个新网站(甚至访问你在其他网站上存储的私密资源(如头像、照片等),而不会暴露你的账号暗码的一种方式。
OAuth2的主要角色



[*] Client :第三方应用。(当前想登录的应用)
[*] Resource Owner:资源全部者。(本人)
[*] Authorizetion Server :授权服务器。(之前的其他账号的授权服务器)
[*] Resource Server :资源服务器。(之前的其他账号的资源服务器)
OAuth2的工作原理

第三方应用必须在资源全部者的同意下,向服务器请求令牌,然后拿着令牌去访问资源。
总结:OAuth 的核心就是向第三方应用颁发令牌。
OAuth2的授权模式


[*]授权码模式:常见的第三方平台登录功能基本都是使用这种模式。(安全性高)
[*]简化模式:简化模式是不需要第三方服务端(客户端)加入,直接在欣赏器中向授权服务器申请令牌(token),如果网站是纯静态页面,则可以采用这种方式(不安全)。
[*]暗码模式:暗码模式是用户把用户名/暗码直接告诉客户端,客户端使用在这些信息项授权服务器申请令牌(token)。这需要用户对客户端高度信任,比如:第三方应用和授权服务器就是同一家公司。
[*]客户端模式:客户端模式是指客户端使用自己的名义而不是用户的名义向授权服务器提供申请授权。应用场景: 比如自己家的产物。
为什么授权码模式更安全?

都说授权码模式更安全?那么到底是怎么安全的?
RFC 6749: https://datatracker.ietf.org/doc/html/rfc6749#section-4.1
https://i-blog.csdnimg.cn/direct/cffc2f5e35fb44cc81e67c3d66a2a90c.png
众口纷纭,作者的学习进程是如许的:

[*]为什么授权码模式比直接返回Access Token 更安全?
网友回答: 授权码通过欣赏器返回,而服务器携带授权码通过后端请求获取Access Token,不会暴露在前端。
[*]那其他服务器携带授权码是否也能获取Access Token?
网友回答:授权码与发起请求的URL是关联的,所以另一个网站使用你的授权码是无法成功得到令牌的。
[*]作者不清楚是否可以伪造请求的URL,从而使用授权码获取Access Token?
然后看到相干批评指路微信开放平台,如下图。
https://i-blog.csdnimg.cn/direct/d858953108af4a9c91922fbb57d5a2ce.png
在RFC 6749 流程中,我们可以看到,在获取授权码的A步调中,携带了Client自己的识别码,即Client_id,所以授权服务器知道请求方的身份。然后在微信开放平台中,请求Access Token的D时,携带了app_id和app_secret,因此授权服务器可以验证请求方的身份,进而对其下发Access Token。


总结:

[*]如果请求无法通过其他方式伪造,那么授权码 + URL 可以由授权服务器验证并颁发Access Token,但作者以为这种方式不可行。
[*]请求Access Token时,携带了app_id和app_secret。
由于Client想要接入比如微信的登录时,必然要在微信开放平台提交应用考核通过后得到appid和appSecret,这两个根据应该只有微信开放平台和Client得知,因此,Client可以通过appid和appSecret和授权码获取Access Token。

参考:
【阮一峰大佬的Blog】https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
【RFC 6749】https://datatracker.ietf.org/doc/html/rfc6749#section-4.1
【微信快速登录功能的阐明】 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
【仅代表作者个人观点,接待各人讨论自己的理解,如有错误,接待指正!】
【如果对你有所帮助,希望可以点赞收藏支持一下!】

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【OAuth2】为什么授权码模式更安全?为什么使用授权码比直接返回token更安