【问题标题】:RestAssured testing, get user tokenRestAssured 测试,获取用户令牌
【发布时间】:2018-05-12 08:37:11
【问题描述】:

我想做什么:我想使用 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 为空。它被声明为类变量而不是方法变量,它是字符串。

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

【问题讨论】:

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


    【解决方案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);
    

    如果您能获得所需的访问令牌,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-20
      • 2012-07-11
      • 2014-08-20
      • 2013-01-13
      • 2013-04-06
      • 2020-05-06
      • 1970-01-01
      • 2015-07-31
      相关资源
      最近更新 更多