2015-06-26 31 views
3

我正在嘗試使用restassured spring安全性認證編寫web集成測試。該應用程序使用AngularJS和Spring Boot。 由於我使用AngularJS,CSRF保護是使用X-XSRF-TOKEN標頭和XSRF-TOKEN cookie完成的(據我瞭解,它的默認角度)。用X-XSRF-TOKEN(like angularjs)頭文件重新確保CSRF保護

如何配置restassured生成並使用表單身份驗證發送此令牌?現在,我有這樣的事情:

given().auth().form("user", "password", new FormAuthConfig("login", "username", "password").sendCsrfTokenAsHeader()).when().get("/index.html").then().log().all().statusCode(200); 

但我看到張貼憑據/登錄時CSRF令牌無效的日誌。

+0

這可能是一個錯誤,你有一個例子服務,我可以試試? – Johan

+0

[RESTAssured和WebDriver:從瀏覽器獲取和使用會話ID]的可能重複(http://stackoverflow.com/questions/19366344/restassured-and-webdriver-get-and-use-a-session-id-from瀏覽器) –

+0

我不認爲這是重複的。到目前爲止,我也有同樣的問題,做了許多沒有結果的修補。 –

回答

1

響應一些延遲,但我希望它可以幫助別人

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

你需要做2 GET職位之前使用Spring Security CSRF保護您的休息客戶端和測試類。

  1. 作出GET請求登錄。這將返回JSESSIONID令牌和XSRF-TOKEN令牌。如果您使用返回的XSRF-TOKENPOST,它將會失敗,因爲我們使用了空/錯JSESSIONID
  2. 從第二個GET獲得一個有用的XSRF-TOKEN,使用之前請求中的JSESSIONID
  3. 現在您可以使用XSRF-TOKEN作爲您的POST

實例如何在休息使用CSRF保護與X-XSRF-TOKEN放心:

//1) get sessionId 
Response response = 
     given().auth().preemptive().basic(userName, userPassword).contentType(JSON). 
     when().get(PREFIX_URL + "https://stackoverflow.com/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 + "https://stackoverflow.com/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);