带你全面了解 OAuth2.0
最开始接触 OAuth2.0 的时候,经常将它和 SSO单点登录搞混。后来因为工作需要,在项目中实现了一套SSO,通过对SSO的逐渐了解,也把它和OAuth2.0区分开了。所以当时自己也整理了一篇文章《SSO单点登录原理及实现方式》
最近需要经常和各大电商平台进行对接,所以又和OAuth2.0重逢了。因此这里再次对OAuth2.0的原理及实现方式进行一个梳理,希望通过这套教程能够帮到大家。对于技术类的文章,这引言是有点过长了。好了下面我们进入正题。
什么是 OAuth2.0
OAuth 是一种开放的授权协议,它是目前最流行的授权机制。它允许将存储在一个站点上的资源共享到另一个站点,而无需使用该站点的凭据。
这类定义一般都比较抽象,要理解起来不是太容易。所以这里我们通过一个实际应用的类比来说明一下这个场景,你会发现,其实OAuth2.0的原理并不复杂。
首先,假设我在微信上注册了账号,然后加了一些好友,并且有一些聊天记录。
然后,我正在访问一个网站/应用。这里假设正在访问 www.jiyik.com 。这个网站有一项功能是可以获取微信号上的好友和聊天,然后对这些信息进行一个统计分析的功能(当然,本站是没有这项功能的)。
个人感觉这项功能不错,就想使用它。有一种方式是我可以把个人的微信账号和密码告诉这个应用。应用可以通过账号密码获取到好友信息和聊天记录。但是这样我感觉很不安全,如果我以后不想再继续使用了,那我还得再去修改账号和密码。那样就会很麻烦了。所以这里就需要一种方式可以使得我将一些权限授权给该网站,使其可以不用账号和密码就可以获取到这些信息。 这种授权方式就是 OAuth2.0。当我不再想使用该功能的时候,我就可以把权限收回或者使授权失效。
所以说一个完整的OAuth2.0 的流程需要涉及到三个实体。
- 资源服务商 (微信,Google,Facebook等)
- 第三方网站/应用
- 用户
当有另一个第三方的网站要使用微信账号登录其系统时,同样我们也可以通过授权的方式登录这个第三方的网站。这样就实现了同一个微信账号可以多个不同的网站进行登录。这也是一种单点登录,这也是为什么最初经常会将其和SSO单点登录搞混的原因。
通过上面的场景,我们大概也能清楚OAuth2.0的基本的原理了。下面我们通过整体介绍一下其架构,来更深入的了解其工作原理。
OAuth2.0 架构
整个的流程是这样的。
一、 首先,用户使用 Google、微信 等第三方应用程序访问资源。
二、 第三方网站会带着客户端ID和客户端密钥重定向到资源服务的授权登录界面。
三、 用户会接收到一个Google或微信的授权登录界面。用户需要在该界面进行授权。
四、 用户使用身份验证应用程序登录。客户端 ID 和客户端密钥对于授权服务器上的客户端应用程序是唯一的。
五、 身份验证服务器使用授权代码将用户重定向到重定向统一资源标识符 (URI)。这个地址是第三方网站在接入资源服务的认证服务时提交给认证服务的,当用户授权成功后,会被重定向到该网址。
六、 用户访问位于客户端应用程序中重定向 URI 的页面,该页面此时会带有一个用于验证的Code。
七、 客户端应用程序将获得身份验证Code、客户端 ID 和客户端密钥,并将它们发送到授权服务器。
八、 身份验证应用程序向客户端应用程序返回访问令牌。
九、 一旦客户端应用程序获得访问令牌,用户开始使用客户端应用程序访问资源所有者的资源。
整个OAuth2.0的流程就是这样的。这其中会涉及到一些HTTP的知识点,关于HTTP可以参考我们的 HTTP教程。
OAuth2.0会涉及到很多术语和概念,下面我们对这些术语概念进行一些解释。
术语
验证
身份验证是识别一个用户的过程,通常是基于用户个人的用户名和密码。通过用户名和密码来验证该用户是否是一个合法的资源持有者。
联合身份验证
许多第三方网站/应用都有自己的用户名和密码。某些应用程序依赖于其他服务来验证用户的身份。联合身份管理系统提供对多个系统的单一访问。这称为联合身份验证。
授权
授权是允许某人做某事的过程。它需要有效用户的身份来检查该用户是否被授权。
委托授权
委托授权是将自己的凭据提供给其他用户以代表该用户执行某些操作的过程。
角色
OAuth 定义了以下角色
- 资源所有者 - 资源所有者被定义为能够授予访问其在资源服务器上托管的自己数据的能力的实体。当资源所有者是个人时,称为最终用户。
- 客户端应用程序 - 客户端是一个应用程序,它发出受保护的资源请求以代表资源所有者执行操作。
- 资源服务器 - 资源服务器是可用于访问用户信息的 API 服务器。
- 认证服务器 - 认证服务器从资源所有者那里获得许可并将访问令牌分发给客户端,以访问由资源服务器托管的受保护资源。
Web 服务器
Web 服务器是一个计算机系统,它使用 HTTP协议 将网页传送给用户。只要应用程序想要访问资源服务器,客户端ID和密钥就存储在web应用程序服务器上。将客户端ID和密钥存储在 Web 应用程序服务器上的目的是保密。
在上图中,资源所有者允许机密客户端访问托管在资源服务器上的数据,其中客户端 ID 和密钥保存在服务器上并且是保密的。
客户端 ID 和密钥对于授权服务器上的客户端应用程序是唯一的。
资源服务器是一个服务器,它承载着 Google、微信等资源。这些资源存储在资源服务器上,供客户端应用程序访问,资源所有者拥有这些资源。
然后,授权服务器使用客户端 Web 应用程序访问资源所有者的资源。
用户代理
用户代理应用程序由用户设备中的客户端应用程序使用,它可以是一个脚本语言,例如在浏览器中运行的 JavaScript。所以说我们可以将用户代理应用程序存储在 Web 服务器上。
下图显示了客户端用户代理应用程序的架构。
一、 首先,用户使用 Google、微信 等身份验证应用程序访问资源所有者的资源。
二、 接下来,用户应用程序提供客户端 ID 和客户端密钥,从而登录到授权服务器。
三、 然后,用户代理应用程序提供一个在浏览器中运行的 JavaScript 应用程序实例并链接到 Web 服务器。
四、 授权服务器允许使用客户端凭据从资源服务器访问资源。
五、 资源服务器包含由资源所有者拥有的资源。
本机应用程序
本机应用程序可以用作桌面或手机应用程序的实例,它使用资源所有者凭据。它是安装在资源所有者设备上的客户端应用程序。
应用程序使用的身份验证凭据包含在应用程序代码中。因此,不要使用在外部用户代理中运行的本机应用程序。
一、 首先,用户使用 Google、微信 等身份验证应用程序访问资源所有者的资源。
二、 接下来,本机应用程序使用客户端 ID 和客户端密钥登录到授权服务器。本机应用程序是桌面或手机应用程序的实例,它安装在用户计算机上,并将客户端密钥存储在计算机或设备上。
三、 授权服务器允许使用客户端凭据从资源服务器访问资源。
四、 资源服务器包含由资源所有者拥有的资源。
总结
以上我们介绍了OAuth2.0 的整体流程,以及这中间涉及到的一些术语和概念我们分别进行了介绍。这要求我们对 HTTP协议 的原理要稍微有些了解。通过上面的介绍其实我们可以看到,整个过程较为核心的部分就是对 访问令牌的获取。
带你全面了解 OAuth2.0的更多相关文章
- 微信开放平台开发——网页微信扫码登录(OAuth2.0)
1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...
- 微信公众平台开发——微信授权登录(OAuth2.0)
1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...
- OAuth2.0说明文档
OAuth2.0说明文档 1.OAuth 2.0 简介 OAuth为应用提供了一种访问受保护资源的方法.在应用访问受保护资源之前,它必须先从资源拥有者处获取授权(访问许可),然后用访问许可交换访问令牌 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明
紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...
- 学习 OAuth2.0
基于浏览器 访问后跳到登录页面,登录成功后跳转到授权页面,授权成功后跳转到redirect_uri指定的地址. 1.请求授权. http://localhost:8080/oauth/authoriz ...
- 微信公众平台开发(71)OAuth2.0网页授权
微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使 ...
- OAuth2.0 在 SSO中的应用~
关于OAuth2.0的介绍,请看下面链接(讲的挺好的): http://blog.csdn.net/seccloud/article/details/8192707 我的理解: 一共四个角色,A:Cl ...
- iOS OAuth2.0认证和SSO授权
OAuth2.0和SSO授权 一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该 ...
- C#微信公众号开发-高级接口-之网页授权oauth2.0获取用户基本信息(二)
C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一) 中讲解了如果通过微信授权2.0snsapi_base获取已经关注用户的基本信息,然而很多情况下我们经常需要获取非关注用户的信息,方法 ...
随机推荐
- 种类并查集(维护敌人的敌人是朋友)、并行-poj1182-食物链 笔记
题意 输入若干组数据,代表着不同动物在食物链的位置(A,B,C),要求出在输入的过程中有多少组数据会与之前矛盾. 思路(借鉴挑战程序设计竞赛) 这题是学并查集时的题,所以用了并查集. 一开始我想的是, ...
- VS2013快捷键及技巧 / 智能插件
复制/剪切/删除整行代码 1)如果你想复制一整行代码,只需将光标移至该行,再使用组合键"Ctrl+C"来完成复制操作,而无需选择整行. 2)如果你想剪切一整行代码,只需将光标移至该 ...
- Element - 日期禁用集合(持续更新)
当前日期之前的日期禁用 <el-date-picker v-model="form.startTime" type="date" placeholder= ...
- 【mysql1】如何删除MySQL内存|不再跟新系列
完全卸载mysql的具体步骤: 包括停止服务 + 卸载相关程序 + 删除注册表等等 步骤一: windows键+R-->Control-->程序和功能:所有MySQL程序点击右键 ...
- RedHat 7.0 下 FTP 服务的安装,启动,配置,以及虚拟用户的建立
(注意! 区分shell命令和往配置文件里加的代码不同) 一:ftp服务的安装,启动和启用. 1:vim /etc/sysconfig/selinux 改为disabled后重启 ...
- 前端调试工具DevTools处理网络请求
DevTools处理网络请求 位置:network 1.是否启用网络处理功能 2.清除历史 3.过滤器,自定义筛选 4.是否保留先前的历史,因为每次刷新会删除历史重新加载,选中后新老请求都在可做对比 ...
- git diff 比较差异
说明 以下命令可以不指定 <filename>,表示对全部文件操作. 命令涉及和 Git本地仓库对比的,均可指定 commit 的版本. HEAD 最近一次 commit HEAD^ 上次 ...
- 【CVE-2020-1948】Apache Dubbo Provider反序列化漏洞复现
一.实验简介 实验所属系列: 系统安全 实验对象:本科/专科信息安全专业 相关课程及专业: 计算机网络 实验时数(学分):2 学时 实验类别: 实践实验类 二.实验目的 Apache Dubbo是一款 ...
- 『与善仁』Appium基础 — 7、ADB Shell命令的使用
目录 1.查看进程 2.查看实时资源占用情况 3.查看进程 UID 4.其它ADB Shell命令说明 Android系统是基于 Linux 内核的,也就是说Android系统的底层是Linux系统. ...
- JDK 之 HttpClient(jdk11)
HttpClient 简介 java.net.http.HttpClient 是 jdk11 中正式启用的一个 http 工具类(其实早在 jdk9 的时候就已经存在了,只是处于孵化期),官方寓意为想 ...