带你全面了解 OAuth2.0

最开始接触 OAuth2.0 的时候 , 经常将它和 SSO单点登录搞混 。后来因为工作需要 , 在项目中实现了一套SSO , 通过对SSO的逐渐了解 , 也把它和OAuth2.0区分开了 。所以当时自己也整理了一篇文章 SSO单点登录三种情况的实现方式详解_迹忆客 有兴趣的小伙伴可以看一下
最近需要经常和各大电商平台进行对接 , 所以又和OAuth2.0重逢了 。因此这里再次对OAuth2.0的原理及实现方式进行一个梳理 , 希望通过这套教程能够帮到大家 。对于技术类的文章 , 这引言是有点过长了 。好了下面我们进入正题 。
什么是 OAuth2.0OAuth 是一种开放的授权协议 , 它是目前最流行的授权机制 。它允许将存储在一个站点上的资源共享到另一个站点 , 而无需使用该站点的凭据 。
这类定义一般都比较抽象 , 要理解起来不是太容易 。所以这里我们通过一个实际应用的类比来说明一下这个场景 , 你会发现 , 其实OAuth2.0的原理并不复杂 。
首先 , 假设我在微信上注册了账号 , 然后加了一些好友 , 并且有一些聊天记录 。
【带你全面了解 OAuth2.0】然后 , 我正在访问一个网站/应用 。这里假设正在访问 www.jiyik.com。这个网站有一项功能是可以获取微信号上的好友和聊天 , 然后对这些信息进行一个统计分析的功能(当然 , 本站是没有这项功能的) 。
个人感觉这项功能不错 , 就想使用它 。有一种方式是我可以把个人的微信账号和密码告诉这个应用 。应用可以通过账号密码获取到好友信息和聊天记录 。但是这样我感觉很不安全 , 如果我以后不想再继续使用了 , 那我还得再去修改账号和密码 。那样就会很麻烦了 。所以这里就需要一种方式可以使得我将一些权限授权给该网站 , 使其可以不用账号和密码就可以获取到这些信息 。这种授权方式就是 OAuth2.0 。当我不再想使用该功能的时候 , 我就可以把权限收回或者使授权失效 。
所以说一个完整的OAuth2.0 的流程需要涉及到三个实体 。

带你全面了解 OAuth2.0

文章插图
OAuth2.0原理示例
  • 资源服务商 (微信 , google , Facebook等)
  • 第三方网站/应用
  • 用户
当有另一个第三方的网站要使用微信账号登录其系统时 , 同样我们也可以通过授权的方式登录这个第三方的网站 。这样就实现了同一个微信账号可以多个不同的网站进行登录 。这也是一种单点登录 , 这也是为什么最初经常会将其和SSO单点登录搞混的原因 。
通过上面的场景 , 我们大概也能清楚OAuth2.0的基本的原理了 。下面我们通过整体介绍一下其架构 , 来更深入的了解其工作原理 。
OAuth2.0 架构
带你全面了解 OAuth2.0

文章插图
OAuth2.0-认证架构
整个的流程是这样的 。
一、 首先 , 用户使用 Google、微信 等第三方应用程序访问资源 。
二、 第三方网站会带着客户端ID和客户端密钥重定向到资源服务的授权登录界面 。
三、 用户会接收到一个Google或微信的授权登录界面 。用户需要在该界面进行授权 。
四、 用户使用身份验证应用程序登录 。客户端 ID 和客户端密钥对于授权服务器上的客户端应用程序是唯一的 。
五、 身份验证服务器使用授权代码将用户重定向到重定向统一资源标识符 (URI) 。这个地址是第三方网站在接入资源服务的认证服务时提交给认证服务的 , 当用户授权成功后 , 会被重定向到该网址 。
六、 用户访问位于客户端应用程序中重定向 URI 的页面 , 该页面此时会带有一个用于验证的Code 。
七、 客户端应用程序将获得身份验证Code、客户端 ID 和客户端密钥 , 并将它们发送到授权服务器 。
八、 身份验证应用程序向客户端应用程序返回访问令牌 。
九、 一旦客户端应用程序获得访问令牌 , 用户开始使用客户端应用程序访问资源所有者的资源 。
整个OAuth2.0的流程就是这样的 。这其中会涉及到一些HTTP的知识点 , 关于HTTP可以参考我们的 HTTP教程 。
OAuth2.0会涉及到很多术语和概念 , 下面我们对这些术语概念进行一些解释 。


推荐阅读