对OAuth2.0协议的理解和测试demo
1. 什么是OAuth
OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。
OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
2. OAuth中的术语介绍
角色
OAuth定义了四个角色:
- 资源所有者(用户)
- 资源服务器
- 认证服务器(可以是与资源服务器相同的服务器)
- 客户端(第三方应用)
用户
OAuth 2.0规范将用户称为“资源所有者”。资源所有者是授予其帐户某些部分访问权限的人。在这种情况下,资源可以是数据(照片,文档,联系人),服务(发布博客条目,转移资金)或任何其他需要访问限制的资源。任何想要代表用户行事的系统必须首先获得他们的许可。
资源服务器
资源服务器是包含第三方应用程序正在访问的用户信息的服务器。资源服务器必须能够接受并验证访问令牌,并在用户允许时授予请求。资源服务器不一定需要知道应用程序。
认证服务器
认证服务器,处理用户的授权请求,以及给客户端(第三方用户)授予一个访问令牌(access_token)。因此,认证服务器通常具有两个主URL,一个用于授权请求,一个用于给客户端授予访问令牌。这些通常是这样的:
客户端
客户端是试图代表用户行动或访问用户资源的应用程序。在客户端可以访问用户的帐户之前,需要获得权限。
授权码
授权码是用于和认证服务器交换令牌使用的,在用户同意授权请求后,认证服务器会返回一个授权码给客户端,然后客户端使用授权码和认证服务器交换访问令牌。
访问令牌(access_token)
访问令牌是向资源服务器发出经过身份验证的请求时使用的字符串。字符串本身对使用它的应用程序没有意义,但表示用户已授权第三方应用程序访问其帐户。令牌具有相应的访问持续时间,范围以及服务器所需的其他可能信息。客户端通过使用访问令牌向资源服务器获取指定的信息。
刷新令牌
刷新令牌是一个字符串,用于在访问令牌过期时获取新的访问令牌。并非所有资源服务器都使用刷新令牌。
3. 协议运作流程
下面是OAuth2.0协议的运作流程图,图片来源:OAuth2.0协议草案V21的1.2节

上图描述了四个角色之间的互动,主要包括下面几个步骤:
(A) 客户端向用户(资源拥有者)发出授权请求;
(B) 用户同意授权请求;
(C) 客户端向认证服务器进行身份认证,并请求获取访问令牌;
(D) 认证服务器对客户端进行身份校验,如果有效,则发放令牌;
(E) 客户使用令牌向资源服务器获取受保护的资源;
(F) 资源服务器验证令牌,如果有效,则同意客户端的资源访问请求
在步骤(B)中,用户要如何接受客户端的授权请求呢?OAuth2.0协议规定了四种授权类型:authorization code(授权码模式), implicit(简化模式), resource owner password credentials(密码模式), and client credentials(客户端模式)。它还提供了一种用于定义其他授权类型的扩展机制。这里我介绍下授权码模式。
4 authorization code(授权码模式)
下面是授权码模式的流程图,图片来源:OAuth2.0协议草案V21的4.1节

步骤说明:
(A) 客户端向认证服务器发出授权请求,并将用户导向认证服务器,其中 Client Identifier 表示客户端身份标识,Redirection URI 表示重定向uri;
(B) 认证服务器对资源所有者进行身份验证,并确定资源所有者是否授予或拒绝客户端的访问请求;
(C) 假如用户同意授权,那么认证服务器会重定向到(A)中指定的uri,并返回一个code(授权码);
(D) 客户端使用(C)中获取的授权码code向认证服务器交换令牌(token);
(E) 认证服务器对客户端的身份进行校验,比如说判断code是否有效,uri是否匹配等,如果通过则同意发放令牌。
在上面(A)中的 Client Identifier 和 Redirection URI 是如何获得的呢?这里我们以github为例,简单说明一下
假如说我们要登陆开源中国,在登录界面我们可以看到,它支持通过微信、QQ、github等账号登陆。如果我们选择github账号登陆,那么开源中国就是客户端,github就是认证服务器,同时也是资源服务器。开源中国在使用OAuth2.0协议和github通信前,首先要到github上面注册OAuth Apps,注册需要的信息包括Application name、Homepage URL、Application description和Authorization callback URL,注册成功后,github会提供client_id和client_secret,其中client_id就表示 Client Identifier,Redirection URI 就是注册时填写的Authorization callback URL。
下面是上面这些步骤所需要的参数。
(A)中,客户端申请认证的URI,包含以下参数:
- response_type:表示授权类型,必选项,此处的值固定为"code"
- client_id:表示客户端的ID,必选项
- redirect_uri:表示重定向URI,可选项
- scope:表示申请的权限范围,可选项
- state:客户端用于维护请求和回调之间状态的不透明值。推荐使用
客户端可构造一个包含上述参数的uri,将用户导向认证服务器,例如:
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com
(C)中,服务器回应客户端的URI,包含以下参数:
code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一
一对应关系。
state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
一个成功的例子:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
一个失败的例子:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?error=access_denied&state=xyz
(D)中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:
grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
code:表示上一步获得的授权码,必选项。
redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
client_id:表示客户端ID,必选项。
例如:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded;charset=UTF-8grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
(E)中,认证服务器发送的HTTP回复,包含以下参数:
access_token:表示访问令牌,必选项。
token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
一个成功的例子如下:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"bearer",
}
5. 模拟OAuth工作流程的demo
demo写的很简单,仅仅是为了帮助协议工作流程~
基于OAuth2.0协议,模拟客户端实现,代码下载地址
基于OAuth2.0协议,模拟服务端实现,代码下载地址
基于OAuth2.0协议,实现访问github的客户端,代码下载地址
参考网站:
对OAuth2.0协议的理解和测试demo的更多相关文章
- OAuth2.0 协议的理解
OAuth(Open Authorization)协议就是为用户资源的授权提供了一个安全.开放.简易的标准. OAuth在第三方应用与服务提供商之间设置了一个授权层,第三方应用通过授权层获取令牌,再通 ...
- 理解OAuth2.0协议和授权机制
无论是自然资源还是互联网上的资源,需要控制使用权与被使用权,以保护资源的安全.合理的使用和有效的管控. 项目中,我们需要控制的是用户资源,既要保证有效用户的合理使用,又要防范非法用户的攻击.如此,如何 ...
- 第三方登录,一般都是遵循OAuth2.0协议。
1. QQ登录OAuth2.0协议开发流程 1.1 开发流程 申请接入,获取appid和appkey; 开发应用,设置协作者账号,上线之前只有协作者才能进行第三方登录 放置QQ登录按钮(这个自己可以用 ...
- 接口测试工具-Jmeter使用笔记(八:模拟OAuth2.0协议简化模式的请求)
背景 博主的主要工作是测试API,目前已经用Jmeter+Jenkins实现了项目中的接口自动化测试流程.但是马上要接手的项目,API应用的是OAuth2.0协议授权,并且采用的是简化模式(impli ...
- 使用OAuth2.0协议的github、QQ、weibo第三方登录接入总结
目录 第三方接入总结 OAuth2.0介绍 github OAuth2.0登录接入 国内第三方应用商SDK使用 微博SDK 腾讯QQ SDK passport.js插件使用 安装 相关中间件.路由 返 ...
- Spring Security 实战干货: 简单的认识 OAuth2.0 协议
1.前言 欢迎阅读 Spring Security 实战干货 系列文章 .OAuth2.0 是近几年比较流行的授权机制,对于普通用户来说可能每天你都在用它,我们经常使用的第三方登录大都基于 OAuth ...
- Oauth2.0 协议简介及 php实例代码
转自:http://www.dahouduan.com/2017/11/21/oauth2-php/ https://blog.csdn.net/halsonhe/article/details/81 ...
- Oauth2.0协议曝漏洞 大量社交网站隐私或遭泄露
2014年是IT业界不平常的一年,XP停服.IE长老漏洞(秘狐)等等层出不穷,现在,社交网络也爆出惊天漏洞:Oauth2.0协议漏洞 继OpenSSL漏洞后,开源安全软件再曝安全漏洞.新加坡南洋理工大 ...
- 轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议
概述说明 CAS Server默认搭建出来,客户端程序只能按照CAS自身的协议接入.CAS的强大在于,有官方的插件,可以支持其他的协议.本章节就让CAS Server怎么增加OAuth2.0的登录协议 ...
随机推荐
- 轻量级Java EE企业应用实战:Struts2+Spring5+Hibernate5/JPA2
轻量级Java EE企业应用实战(第5版)——Struts 2+Spring 5+Hibernate 5/JPA 2整合开发是<轻量级Java EE企业应用实战>的第5版,这一版保持了前几 ...
- Java 泛型(参数化类型)
Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所 ...
- Invalid credentials for 'https://repo.magento.com/packages.json'
Use your public key as username and private key as password from your magento connect account You ca ...
- ceph 快照,克隆
转载 https://my.oschina.net/wangzilong/blog/1595081 ceph 快照,克隆 ceph是一个非常好的后端存储系统.其中包括最常用的块存储,对象存储,文件系统 ...
- Paillier同态加密实现
一.C++(该方案只实现了加密以及解密) 1.git clone https://github.com/klei0229/paillier.git 2.下载GMP与NTL包: 下载版本以及操作参见ht ...
- 经典游戏--24点--c++代码实现和总体思路(简单暴力向)
24点 24点是一个非常经典的游戏,从扑克牌里抽4张牌,其中J=11,Q=12,K=13,然后经过+,-,*,/,(),的计算后,使得计算得值为24,例如抽到1,2,2,5四张牌,那么 (1+5)*( ...
- 区块链入门到实战(23)之以太坊(Ethereum) – 虚拟机架构
以太坊(Ethereum)网络中,定义了一组通用协议用于支持智能合约的运行,其核心便是以太坊(Ethereum)虚拟机. 下图解释了该架构: 开发人员使用Solidity等开发语言开发智能合约 源程序 ...
- Http请求的三个常见问题
我们做的大多数项目,必不可少的需要向后台发送请求获取数据,常用的http请求就是post请求和get请求 那么引出一个最常见的问题——Q:post请求和get请求有什么区别? A: 从语义上我们可以这 ...
- Java 接口 抽象类 抽象方法
abstract class elehousekeeping { //抽象家用电器类 abstract void opermode(); //抽象方法} class TV extends elehou ...
- vue-x和axios的学习
axios的使用 使用原因:因为vue本身就带有处理dom的功能,不希望再有其他操作dom的插件,所以用axios代替了jquery 功能:发送xhr请求 下载: $ npm install axio ...