浅谈OAuth2.0授权原理
一、引言
OAuth(Open Authorization)是一种开放授权协议,允许用户授权第三方应用访问其在其他服务中的资源(如个人信息、照片等)目前的版本是2.0版(OAuth 2.0),其标准是:RFC 6749
OAuth在客户端与服务提供商之间,设置了一个授权层(authorization layer)客户端不能直接登录服务提供商,只能登录授权层获取令牌,以此将用户与客户端区分开来。客户端登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期,客户端登录授权层以后,服务提供商根据令牌的权限范围和有效期,向客户端开放用户储存的资料。
很多场景都有采用OAuth2登录,例如登录ProcessOn或知识星球时可以使用微信登陆,登陆时会先跳转到微信的二维码页面,扫码登录后会再跳转到ProcessOn或知识星球,此时显示的是用户微信的昵称和头像,再比如使用GitHub登录Vercel时,也是先跳到GitHub的登录页面,输入用户名密码登陆后,跳转到Vercel,Vercel里面除了能展示用户GitHub的头像用户名等信息之外,还能获取用户GitHub中的仓库信息,甚至可以获取仓库中各分支下的源代码。这样就实现了脱离第三方系统进行认证,避免了用户直接将自己在微信等服务商的账户密码告诉ProcessOn等第三方平台进行获取数据所导致的安全问题。在这些场景下,上述的的客户端指的就是Vercel/知识星球/ProcessOn等第三方系统,服务提供商就是微信/GitHub。
OAuth2.0规定了四种获得令牌的流程和授权方式:
- 授权码(authorization code)
- 隐藏式(implicit),又叫简化模式
- 密码式(password)
- 客户端凭证(client credentials)
二、名词定义
在详细讲解OAuth 2.0之前,需要了解几个专用名词
Resource Owner 资源所有者,本文中又称用户(user)
User Agent 用户代理,本文中就是指浏览器。
Third-party application 第三方应用程序,又称客户端
HTTP service HTTP服务提供商,本文中简称服务提供商
Authorization server 认证服务器,即服务提供商专门用来处理认证的服务器。
Resource server 资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。
三、授权方式和原理
3.1 授权码模式(authorization code)
授权码模式(authorization code)是功能最完整、流程最严密的一种模式。它的特点就是通过客户端的后台服务器,与服务提供商的认证服务器进行互动,而且这种场景很常见,是toc场景下使用最多的OAuth授权模式,下面以微信扫码登陆知识星球为例具体说明:
- 知识星球要求用户给予授权可以理解为点击微信登陆,浏览器弹出微信的二维码登录页面,扫码后微信APP上会得到一个授权许可页面
- 知识星球用户在微信APP的授权许可页面点击了同意用微信登录知识星球,随即微信授权服务器生成授权码并使得浏览器上的扫码登陆页面跳转到知识星球的微信登录链接(这个链接在开发者在微信开放平台注册应用时就要提前填写好)并通过在这个链接上追加URL参数的方式传把授权码给到了知识星球平台
- 知识星球平台将接收到的微信登录授权码作为参数,后台调用微信认证服务器的获取令牌接口
- 微信认证服务器验证授权码通过,返回令牌给知识星球平台
- 知识星球平台紧接着使用令牌访问微信的资源服务器,获取微信登录用户的微信数据(昵称,ID,甚至步数等)
- 微信资源服务器验证令牌通过,返回用户的微信数据(昵称,ID,甚至步数等)给知识星球平台,知识星球平台根据用户的微信ID建立会话,到此就微信登录成功了,知识星球平台一般就会跳转到首页,还会在首页上展示用户的微信昵称头像等个人标识。
3.2 隐藏式(implicit)
隐藏式,又称简化模式(implicit grant type),不通过第三方应用程序的服务器,而是直接在浏览器中向认证服务器申请令牌,跳过了授权码这个步骤,因此得名。所有步骤可以在浏览器中完成,令牌对访问者是可见的。
和授权码模式不一样的是,客户端引导用户打开服务提供商认证页面,通过扫码或用户名密码认证后,跳转到指定的客户端系统页面,并直接在URL参数上传递访问令牌,省去了通过授权码再去获取令牌的过程。
3.3 密码式(password)
密码模式中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向服务商提供商索要授权。
在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
3.4 客户端凭证(client credentials)
客户端模式指客户端以自己的名义,而不是以用户的名义,向服务提供商进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求服务提供商提供服务,其实不存在授权问题。
四、参考
- 理解OAuth 2.0, 阮一峰, 2014.5
- OAuth 2.0 的一个简单解释, 阮一峰, 2019.04
"如果文章对您有帮助,可以请作者喝杯咖啡吗?"

微信支付

支付宝