RestAssured测试,获取用户令牌

时间:2017-11-28 19:11:51

标签: spring spring-boot integration-testing rest-assured

我想做什么:我想使用RestAssured测试我的端点。关键是端点仅适用于已登录的用户。使用带有自定义successHandler的spring security默认端点登录,我在其中设置了一些随机令牌,将其保存到数据库并返回在标题"用户令牌"。我没有在后端创建会话。当我想访问一个安全的端点时,前端会使用" User-Token"来调用它。头。然后我使用令牌检查数据库。每个令牌都是不同的和随机的。此外,我不会使用任何弹簧安全的东西作为令牌。现在我想测试这种行为。

技术:React& Redux,Spring Boot,RestAssured,JUnit,Tomcat

什么不行?首先,我不确定如何获取令牌。我的意思是我可以手动将数据库强制给一些测试用户,但是AFAIK这是一个糟糕的坏习惯。我阅读了文档并发现了auth().form的部分内容。但在下面提到它并不是have to made to the server in order to retrieve the webpage with the login details的最佳方法,并且它不可能 - 网页与后端完全分开。我确实尝试过这种方法,但它没有用。

@Before
public void LogInUser(){
    String loginUrl = "http://localhost:8080/login";
    userToken =
            given().auth().form("username","password").
                    when().get(loginUrl).getHeader("User-Token");
    System.out.println(userToken);
}

那么我想也许我根本不需要auth() - 我不需要会话,所以用数据调用端点本身就足够了。我检查了数据如何从前端传递到后端并执行了此操作:

Form Data: username=something&password=something

@Before
public void LogInUser(){
    String loginUrl = "http://localhost:8080/login";
    userToken =
            given().parameter("username=oliwka&password=jakies")
                    .when().get(loginUrl).getHeader("User-Token");
    System.out.println(userToken);
}

在传递过程中,userToken为null。它被声明为类变量而不是方法变量,它是字符串。

如何为用户获取令牌并测试我需要令牌的端点?

1 个答案:

答案 0 :(得分:1)

您可以使用以下程序获取访问令牌。

步骤1:创建一个接受json字符串并解析数据并返回访问令牌的方法。以下是方法。您可以使用首选的json解析器库。

  public String getAccessToken(String jsonStr) {
        JSONParser parser = new JSONParser();
        Object obj = null;
        try {
            obj = parser.parse(jsonStr);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        JSONObject jsonObject = (JSONObject) obj;
        String accessToken = (String) jsonObject.get("access_token");
        System.out.println("access_token : " + accessToken);
        return accessToken;

     }

第2步:现在使用用户名和密码调用您的登录API,如下所示

  String loginUrl = "http://localhost:8080/login";
     Response res = null;
     String returnValue = "";
     response = given().param("username", "yourUserName")
                .param("password", "yourpassword")
                .param("client_id", "If Any otherwise skip it")
                .param("grant_type", "If Any otherwise skip it")
                .param("clear_all", "true")
                .post(loginUrl);
                returnValue = response.body().asString();

    String accessToken = getAccessToken(returnValue);

如果您能获得所需的访问令牌,请与我们联系。