OAuth2
- 什么是OAuth2
- OAuth2的主要角色- OAuth2的工作原理- OAuth2的授权模式- 为什么授权码模式更安全?
什么是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
众说纷纭,作者的学习历程是这样的:
- 为什么授权码模式比直接返回Access Token 更安全? 网友回答: 授权码通过浏览器返回,而服务器携带授权码通过后端请求获取Access Token,不会暴露在前端。
- 那其他服务器携带授权码是否也能获取Access Token? 网友回答:授权码与发起请求的URL是关联的,所以另一个网站使用你的授权码是无法成功得到令牌的。
- 作者不清楚是否可以伪造请求的URL,从而利用授权码获取Access Token? 然后看到相关评论指路微信开放平台,如下图。
在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
【仅代表作者个人观点,欢迎大家讨论自己的理解,如有错误,欢迎指正!】
【如果对你有所帮助,希望可以点赞收藏支持一下!】
版权归原作者 fyy-coding 所有, 如有侵权,请联系我们删除。