rest-assured支持多种认证授权方案,比如:OAuth、digest(摘要认证)、certificate(证书认证)、form(表单认证)以及preemptive(抢占式基础认证)等。我们可以单独为某一个请求设置认证授权:

 given().auth().basic("username", "password"). ..

我们也可以为所有的请求定义一个认证授权:

 RestAssured.authentication = basic("username", "password");

一、基础认证

  这里有两种基础认证方式:抢占式基础认证(preemptive basic authentication)和受质询式基础认证(challenged basic authentication)。

1.抢占式基础认证(preemptive basic authentication)

  服务器某些情况下在给出未授权响应之前会发送一个基础认证凭证,从而减少额外的连接开销。这是非常典型的,我们大多数情况下都是使用这个,除非我们是在测试服务器的极限。比如说:

 given().auth().preemptive().basic("username", "password").when().get("/secured/hello").then().statusCode(200);

2.受质询式基础认证(challenged basic authentication)

  当我们使用受质询式基础认证时,除非服务端明确的索要认证凭证,否则rest-assured将不会提供认证凭证。这就意味着为了进行质询,rest-assured将会额外的发送一个请求到服务端,然后接着会发送相同的请求,但此时会在header中设置认证凭证:

 given().auth().basic("username", "password").when().get("/secured/hello").then().statusCode(200);

二、摘要认证(Digest Authentication)

  目前只支持 受质询式基础认证(challenged basic authentication)的摘要认证:

 given().auth().digest("username", "password").when().get("/secured"). ..

三、表单认证(Form Authentication)

  表单认证在互联网上是非常受欢迎的一种认证。最典型的例子就是用户在web网页上填写证书(username and password 用户名和密码),然后点击登录按钮发起请求。下面是一个非常简单的HTML页面,用来展示这种表单认证:

 <html>
<head>
<title>Login</title>
</head> <body>
<form action="j_spring_security_check" method="POST">
<table>
<tr><td>User:&nbsp;</td><td><input type='text' name='j_username'></td></tr>
<tr><td>Password:</td><td><input type='password' name='j_password'></td></tr>
<tr><td colspan='2'><input name="submit" type="submit"/></td></tr>
</table>
</form>
</body>
</html>

假如,服务端期望用户输入用户名( j_username )和密码( j_password ),然后点击submit按钮去登录,那么我们可以使用rest-assured来测试一下这样的需要进行表单认证的服务:

 given().
auth().form("John", "Doe").
when().
get("/formAuth");
then().
statusCode(200);

虽然这种做法可能不是最佳的。那么当我们在rest-assured中使用这样的表单认证时究竟发生了什么呢?rest-assured在使用这种表单认证时需要发送一个额外的请求到服务端获取登录页面,然后rest-assured会尝试解析这个登录页面,从而获得登录和密码两个输入框以及表单提交的路径(form action url),请求可能会成功或者是失败,这取决于网页的复杂程度。这里有一种更好的方法,那就是在设置表单认证的时候直接给rest-assured提供这些参数信息。上面的例子我们还可以这样做:

 given().
auth().form("John", "Doe", new FormAuthConfig("/j_spring_security_check", "j_username", "j_password")).
when().
get("/formAuth");
then().
statusCode(200);

使用上面这种方式rest-assured就不需要在额外发送请求和解析网页了。如果我们想使用默认的Spring Security 属性,这用到一个叫 springSecurity 的预定义 FormAuthConfig :

 given().
auth().form("John", "Doe", FormAuthConfig.springSecurity()).
when().
get("/formAuth");
then().
statusCode(200);

四、CSRF(跨站请求伪造,Cross-site request forgery的缩写,也可以缩写为:XSRF)

  当今,服务端为了防止某些攻击在响应体中提供 CSRF token值是非常常见的了。rest-assured支持自动解析并提供 CSRF token值给服务端,为了实现这个功能,rest-assured必须发送一个额外的请求来解析这个网站(或者是网站的部分内容)。

  我们通过下面的方式可以启用 rest-assured 对 CSRF的支持:

 given().
auth().form("John", "Doe", formAuthConfig().withAutoDetectionOfCsrf()).
when().
get("/formAuth");
then().
statusCode(200);

现在rest-assured将会自动尝试检车该网站是否包含了CSRF token。为了帮助rest-assured解析更加顺利,我们可能需要提供一个CSRF域的名字(这里我们假设我们使用的是Spring Security默认值,这样我们就可以使用预定义的 springSecurity 表单认证配置(FormAuthConfig)):

 given().
auth().form("John", "Doe", springSecurity().withCsrfFieldName("_csrf")).
when().
get("/formAuth");
then().
statusCode(200);

这里我们告诉rest-assured去查找一个名为"_csrf" 的 CSRF域(这样不但效率变高了,也更不易出错)。

  默认情况下,CSRF的值是作为请求参数发送的,但是我们也可以配置CSRF的值作为header发送,那么我们需要这样做:

 given().
auth().form("John", "Doe", springSecurity().withCsrfFieldName("_csrf").sendCsrfTokenAsHeader()).
when().
get("/formAuth");
then().
statusCode(200);

五、OAuth授权

  为了能够使用OAuth 1 和 OAuth 2(关于查询请求参数签名的机制),我们需要添加 Scribe  到我们的 classpath 中(如果使用的是 2.1.0版本或者是更老版本的rest-assured,请参考老版的rest-assured指南)。在maven中我们可以通过下面的方式来添加依赖:

 <dependency>
<groupId>com.github.scribejava</groupId>
<artifactId>scribejava-apis</artifactId>
<version>2.5.3</version>
<scope>test</scope>
</dependency>

1.OAuth 1 认证

  OAuth 1 认证需要添加 scribe 到classpath中,使用 OAuth 1 认证我们可以这样写:

 given().auth().oauth(..). ..

2.OAuth 2 认证

  从rest-assured的2.5.0版本开始,我们使用 OAuth 2 可以不依赖 scribe :

 gien().auth().oauth2(accessToken). ..

这将会把 OAuth 2 的 accessToken 放到 header 中,如果想要使用更加显示化的操作,可以:

 given().auth().preemptive().oauth2(accessToken). ..

之所以还存在 given().auth().oauth2(..) 这种写法是因为需要向后兼容实际上他们做的是相同的事情)。如果我们需要在一个查询参数中提空 OAuth2 token 的话,那我们就需要在classpath 中引入 scribe,然后这样写:

 given().auth().oauth2(accessToken, OAuthSignature.QUERY_STRING). ..

六、自定义授权

  rest-assured允许我们创建自定义的授权认证提供者。我们想要实现自定义授权认证的话就需要实现 io.restassured.spi.AuthFilter 这个接口,并作为过滤器(filter)来使用它。举个例子,假如我们的安全机制是由两个header的值组合在一起形成一个新的叫做 "AUTH"的header(这当然是不安全的)。那么我们可以这样写(Java 8语法):

 given().
filter((requestSpec, responseSpec, ctx) -> {
String header1 = requestSpec.getHeaders().getValue("header1");
String header2 = requestSpec.getHeaders().getValue("header2");
requestSpec.header("AUTH", header1 + header2);
return ctx.next(requestSpec, responseSpec);
}).
when().
get("/customAuth").
then().
statusCode(200);

使用 AuthFilter 而不使用 Filter 的原因是:当我们执行 given().auth().none(). ... 时 AuthFilter 会被自动移除。

rest-assured之认证授权(Authentication)的更多相关文章

  1. [转]Web APi之认证(Authentication)及授权(Authorization)【一】(十二)

    本文转自:http://www.cnblogs.com/CreateMyself/p/4856133.html 前言 无论是ASP.NET MVC还是Web API框架,在从请求到响应这一过程中对于请 ...

  2. Web APi之认证(Authentication)及授权(Authorization)【一】(十二)

    前言 无论是ASP.NET MVC还是Web API框架,在从请求到响应这一过程中对于请求信息的认证以及认证成功过后对于访问页面的授权是极其重要的,用两节来重点来讲述这二者,这一节首先讲述一下关于这二 ...

  3. Owin中间件搭建OAuth2.0认证授权服务体会

    继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...

  4. 使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  5. 在AngularJS应用中实现认证授权

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAokAAAFwCAIAAABbwHY6AAAgAElEQVR4nOy9+XtcxbX3+/4H9z73jP ...

  6. asp.net权限认证:摘要认证(digest authentication)

    asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...

  7. [认证授权] 3.基于OAuth2的认证(译)

    OAuth 2.0 规范定义了一个授权(delegation)协议,对于使用Web的应用程序和API在网络上传递授权决策非常有用.OAuth被用在各钟各样的应用程序中,包括提供用户认证的机制.这导致许 ...

  8. [认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分)

    0 目录 认证授权系列:http://www.cnblogs.com/linianhui/category/929878.html 1 什么是OIDC? 看一下官方的介绍(http://openid. ...

  9. [2014-11-11]使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

随机推荐

  1. jquery Ajax跨域请求

    这是jquery api文档对跨域请求的解析:如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用JSONP类型.使用这种类型的话,会创建一个查询字符串参数 callbac ...

  2. 1、设备网络SDK主要功能

    图像预览.文件回放和下载,云台控制,布防/撤防,语音对讲,日志管理,解码卡,远程升级,远程重启/关闭,格式化硬盘,参数配置(系统配置,通道配置,串口配置,报警配置,用户配置),多路解码器,智能设备功能 ...

  3. 3.3.5 高效读取:不变模式下的CopyOnWriteArrayList

    源码分析:读写(get,add) 一:get 方法 private E get(Object[] a, int index) { return (E) a[index];}可以看到读取数据的时候 没有 ...

  4. jQuary总结6:元素的操作

    1 empty方法 //html <div> <p></p> <span></span> </div> //js $('div) ...

  5. 【Windows】ASP.NET Core 部署到 IIS

    如果你的系统环境没有 .NET CORE SDK,请到官网进行下载: https://www.microsoft.com/net/download/windows 接下来我们开始进行环境的部署,首先在 ...

  6. 代码审查清单 Code Review

    代码审查清单 常规项 代码能够工作么?它有没有实现预期的功能,逻辑是否正确等. 所有的代码是否简单易懂? 代码符合你所遵循的编程规范么?这通常包括大括号的位置,变量名和函数名,行的长度,缩进,格式和注 ...

  7. word上传博客教程

    目前大部分的博客作者在写博客这件事情上都会遇到以下3个痛点:1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.2.发布到博客或公众号平台 ...

  8. 编写高质量代码改善C#程序的157个建议——建议93:构造方法应初始化主要属性和字段

    建议93:构造方法应初始化主要属性和字段 类型的属性应该在构造方法调用完毕前完成初始化工作.如果字段没有在初始化器中设置初始值,那么它就应该在构造方法中初始化. 类型一旦被实例化,那么它就应该被视为具 ...

  9. 【重要】拷贝NIOS II工程后,修改工程前必须要做的10件事

    1.拷贝现有工程到新的目录2.打开Quartus II工程文件3.打开NIOS II EDS软件4.切换工作空间到当前的新工程根目录5.在NIOS II EDS软件中将已有的软件工程先删除掉(不要勾选 ...

  10. HBASE与hive对比使用以及HBASE常用shell操作。与sqoop的集成

    2.6.与 Hive 的集成2.6.1.HBase 与 Hive 的对比1) Hive(1) 数据仓库Hive 的本质其实就相当于将 HDFS 中已经存储的文件在 Mysql 中做了一个双射关系,以方 ...