我想做什么:我想使用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。它被声明为类变量而不是方法变量,它是字符串。
如何为用户获取令牌并测试我需要令牌的端点?
答案 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);
如果您能获得所需的访问令牌,请与我们联系。