首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用X-XSRF-TOKEN (如angularjs)报头的Restassured CSRF保护

使用X-XSRF-TOKEN (如angularjs)报头的Restassured CSRF保护
EN

Stack Overflow用户
提问于 2015-06-26 19:24:17
回答 3查看 3.8K关注 0票数 4

我正在尝试编写一个带有restassured spring安全认证的web集成测试。应用程序使用AngularJS和Spring Boot。因为我使用的是AngularJS,所以CSRF保护是通过X-XSRF-TOKEN头部和XSRF-TOKEN cookie来完成的(正如我所理解的,它是angular的默认设置)。

如何将restassured配置为使用表单身份验证生成并发送此令牌?现在我有这样的东西:

代码语言:javascript
复制
given().auth().form("user", "password", new FormAuthConfig("login", "username", "password").sendCsrfTokenAsHeader()).when().get("/index.html").then().log().all().statusCode(200);

但是在日志中,我看到CSRF令牌在向/login发布凭据时是无效的。

EN

回答 3

Stack Overflow用户

发布于 2016-11-08 17:38:53

要在rest客户端和测试类中使用spring security CSRF保护,您需要在post之前执行2次GET

  1. 发出GET登录请求。这将返回JSESSIONID令牌和XSRF-TOKEN令牌。如果您使用返回的XSRF-TOKENPOST,它将失败,因为我们使用empty/false从第二个GET中获得了一个有用的XSRF-TOKEN,使用来自上一个请求的JSESSIONID
  2. 现在您可以为您的use使用XSRF-TOKEN

示例如何在rest assured中使用带X-XSRF-TOKEN的CSRF保护:

代码语言:javascript
复制
//1) get sessionId
Response response =
        given().auth().preemptive().basic(userName, userPassword).contentType(JSON).
        when().get(PREFIX_URL + "/users/user").
        then().log().all().extract().response();
String jsessionidId =  response.getSessionId();//or response.cookie("JSESSIONID");

//2) get XSRF-TOKEN using new/real sessionId
response =
        given().
        sessionId(jsessionidId).//or cookie("JSESSIONID", jsessionidId).
        contentType(JSON).
        when().get(PREFIX_URL + "/users/user").
        then().log().all().extract().response();

//3) post data using XSRF-TOKEN
given().log().all().
        sessionId(jsessionidId).//or cookie("JSESSIONID", jsessionidId).
        header("X-XSRF-TOKEN", response.cookie("XSRF-TOKEN")).
        queryParam("pos",pos.getId()).
        queryParam("date",date).
        queryParam("group_id",itemGroup.getId()).
        body(orderItems).
        contentType(JSON).
when().
        post(PREFIX_URL + "/orders/orderitems").
then().
    log().all().assertThat().statusCode(200);
票数 3
EN

Stack Overflow用户

发布于 2016-10-19 07:27:20

一些延迟的回应,但我希望这能帮助一些人

代码语言:javascript
复制
Response loginResponse = given().contentType(APPLICATION_JSON).
    param(USERNAME, "").
    param(PASSWORD, "").
    when().post(LOGIN_PROCESSING_URL).then().log().all().
    extract().response();

given().contentType(APPLICATION_JSON).
  cookie("XSRF-TOKEN", loginResponse.cookie("XSRF-TOKEN")).
  header("X-XSRF-TOKEN", loginResponse.cookie("XSRF-TOKEN")).
  sessionId(loginResponse.getSessionId()).
  when().post(USER_PATH).
  then().log().all().statusCode(CREATED.value());
票数 1
EN

Stack Overflow用户

发布于 2020-03-05 20:34:32

在需要时使用RestAssured筛选器检索和注入令牌。

给定服务器对GET /login的响应,总是包含令牌cookie。然后,保持实际测试代码整洁的解决方案可能如下所示:

代码语言:javascript
复制
package com.example;

import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS;
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT;

import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import io.restassured.RestAssured;
import io.restassured.authentication.FormAuthConfig;
import io.restassured.filter.*;
import io.restassured.response.Response;
import io.restassured.specification.*;

@ExtendWith(SpringExtension.class)
@TestInstance(PER_CLASS)
@SpringBootTest(webEnvironment = DEFINED_PORT)
public class CsrfSampleTest {

    @BeforeAll
    public void addCsrfCookieFilter() {
        RestAssured.filters(new Filter() {
            @Override
            public Response filter(FilterableRequestSpecification requestSpec,
                    FilterableResponseSpecification responseSpec, FilterContext ctx) {
                String csrfToken = requestSpec.getCookies().getValue("XSRF-TOKEN");
                if (csrfToken == null) {
                    csrfToken = RestAssured.given().noFilters().get("/login").cookie("XSRF-TOKEN");
                }
                requestSpec.replaceHeader("X-XSRF-TOKEN", csrfToken);
                return ctx.next(requestSpec, responseSpec);
            }
        });
    }

    @Test
    public void test() {
        RestAssured.given()
            .auth().form("user", "password", new FormAuthConfig("login", "username", "password"))
        .when()
            .get("/index.html")
        .then()
            .statusCode(200);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31071988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档