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. java的static块及相关内容

    原文地址:http://blog.csdn.NET/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执 ...

  2. 工作流系统webservice服务

    http://blog.csdn.net/zhengzhb/article/details/7477616

  3. Python Socket实现简单的聊天室

    通过参考其他牛人的文章和代码,  再根据自己的理解总结得出,  说明已经加在注释中, FYI 主要参考文章: http://blog.csdn.net/dk_zhe/article/details/3 ...

  4. 高并发Redis(Mac)环境配置(一)

    一.产生原因: SNS交互型网站的兴起,对于高并发,大负载数据的操作,海量数据的存储和访问 NoSql四种类型: 键值存储(Redis优点可以快速查询,缺点缺少存储的结构化)              ...

  5. 在 CentOS 上部署 Nginx 环境

    这里的案例主要通过虚拟机( vmware workstation (14) )的方式安装 Center OS 到本地环境 资源下载:  vmware workstation   / CentOS 本次 ...

  6. .NET基础 (01).NET基础概念

    .NET基础概念 1 什么是CTS.CLS和CLR2 开发和运行.NET程序需要的最基本环节是什么3 .NET是否支持多编程语言开发4 CLR技术和COM技术的比较5 什么是程序集和应用程序域 1 什 ...

  7. 设置express ejs模板的后缀名html

    如果使用jade或者ejs模板引擎的话 模板文件的格式为ejs或者jade ,有时候需要将后缀名修改为 html格式的. app.set('view engine','ejs'); app.engin ...

  8. 【小梅哥FPGA进阶教程】MC8051软核在FPGA上的使用

    十.MC8051软核在FPGA上的使用 本教程内容力求以详细的步骤和讲解让读者以最快的方式学会 MC8051 IP core 的应用以及相关设计软件的使用,并激起读者对 SOPC 技术的兴趣.本实验重 ...

  9. Sweetkang 的机器学习实验室 (1)

    前言 近年来,Machine Learning 在许多领域上已然取得了可喜的成就,非常火热.就我个人来讲,有意将业余 Sport Programming 的范围扩展一下,譬如 Topcoder Mar ...

  10. arcgis android 中shapefile的加载

    前言 本文为大家分享arcgis android 中shapefile的加载,默认你有java环境,懂一定的android基础知识,默认你已经安装android studio.如缺乏以上环境和知识,请 ...