如何在确保安全的情况下调用由CSRF令牌保护的post API?

时间:2019-11-07 15:19:34

标签: session csrf rest-assured

我需要使用Rest-assured来调用post API,

   X-XSRF Token in the header 
    XSRF-TOKEN and JSESSIONID in the cookie

在邮递员中进行此操作,请按照以下步骤操作

  1. 获取登录页面(方法:获取)
  2. 现在点击登录/身份验证API(方法:POST)  (如果不是以上两个步骤,我将两次调用身份验证API本身)      a。)第一次调用身份验证API时,出现以下错误            错误:由于找不到您的会话,因此无法验证提供的CSRF令牌。      b。)我第二次称呼会成功
  3. 现在点击Post API创建记录

我必须使用Rest Assured自动化此流程,下面是我的代码

我面临以下两个问题,请帮助我解决此问题

  1. 当我点击登录的get方法时,不会生成页面sessionID,我需要将其放置在JSESSIONID cookie中

  2. 登录/身份验证API被调用两次(我正在使用表单身份验证)

公共类登录{

SessionFilter sessionFilter = new SessionFilter();

private class SessionData
{
    private String csrf;
    private String session;
    public SessionData(String header, String sessionId){this.csrf = header;this.session = sessionId;}        
    public String getCsrf(){return csrf;}       
    public String getSessionId(){return session;}

}


protected SessionData login(String username, String password) {


    Response getLoginPage =
        given().log().all().
            filter(sessionFilter).
        when().
            get("/").
        then().log().all().
            extract().response();

        String loginPage_csrf = getLoginPage.getCookies().get("XSRF-TOKEN");

        System.out.println("1st response end get login page :" + loginPage_csrf );

    Response login_cred =
       given().log().all().
            auth().form(username,password,new FormAuthConfig("/api/authentication", "j_username", "j_password").withLoggingEnabled()).
            header("X-XSRF-TOKEN",loginPage_csrf).
            filter(sessionFilter).
        when().
            post("/api/authentication").
       then().log().all().
           extract().response();

    String Loggedin_csrf = login_cred.getCookies().get("XSRF-TOKEN");

    System.out.println("2nd response authentication :" + Loggedin_csrf );


    return new SessionData(Loggedin_csrf, sessionFilter.getSessionId());
}


@Test
public void create_role() throws IOException
{
    RestAssured.baseURI = "https://apitest.com";
    SessionData sessionData = login("admin", "admin");

    final Response response =
            (Response) given().log().all().
                contentType("application/json; charset=UTF-16").
                header("X-XSRF-TOKEN", sessionData.getCsrf()).
                filter(sessionFilter).
                body(getString("JSON Files/Roles_Section/CreateRole.JSON")).
            when().
                post("/api/authority").then().log().all();

    response.body().prettyPrint();

    Assert.assertEquals(response.getStatusCode(),HttpStatus.SC_ACCEPTED);
}

// read Payload from JSON file
public String getString(String path) throws IOException {return new String(Files.readAllBytes(Paths.get(path)));}

}

0 个答案:

没有答案