如何使用 Rest Assured 获取用于验证 Google API /Gmail API 的访问令牌
How to get the access token for validating Google API /Gmail API using Rest Assured
我正在尝试使用 restAssured 验证 gmail API。根据文档,它需要使用 Key 和 OAuth2.0 进行身份验证。我最初使用 POSTMAN 并能够生成访问令牌,随后点击请求以获得成功响应。现在我想用 Rest Assured 框架实现同样的目标。
我想在 testNG 框架的 beforeMethod/beforeTest 某处添加令牌生成逻辑。
我基本上有两个问题:
- 我应该如何在 Google Cloud Platform 中为 OAuth 设置 API 凭据以通过 Rest Assured 发送请求(就像我们为 Postman 所做的那样)
- 请求端点和方法应该是什么。
到目前为止,我已经尝试了以下参考 Stack Overflow 和其他博客上发布的各种解决方案的方法:
方法一
public void oAuthToken() {
Response res = given().
auth().
preemptive().basic("username", "password").
header("Content-Type","application/json").
queryParam("key","KeyGeneratedFromAPICedentials").
formParam("client_id","created an OAuth Client ID").
formParam("client_secret","created an OAuth Client Secret_ID").
formParam("grant_type","client_credentials").
when().
get("https://accounts.google.com/o/oauth2/auth").
//Getting this endpoint from JSON in OAuth Client ID created in google Cloud Platform
then().assertThat().statusCode(200).extract().response();
System.out.println("This is the response : " +res.asString());
}
结果:预期状态代码 <200> 但实际为 <400>。
方法二:
public void oAuthToken() {
Response res = given().
auth().
preemptive().basic("username", "password").
header("Content-Type","application/json").
queryParam("key","KeyGeneratedFromAPICedentials").
formParam("client_id","created an OAuth Client ID").
formParam("client_secret","created an OAuth Client Secret_ID").
formParam("grant_type","client_credentials").
when().
get("https://oauth2.googleapis.com/token").
//Getting this endpoint from JSON in OAuth Client ID as Token_URI created in google Cloud Platform
then().assertThat().statusCode(200).extract().response();
System.out.println("This is the response : " +res.asString());
}
结果:预期状态代码 <200> 但为 <404>
方法三:
public void oAuthToken() {
RestAssured.baseURI="https://oauth2.googleapis.com";
Response res = given().
auth().preemptive().basic("Client_ID", "Client_Secret").
contentType("application/x-www-form-urlencoded").
formParam("grant_type","client_credentials").
formParam("scope","openid").
when().
get("/token").
then().assertThat().statusCode(200).extract().response();
System.out.println("This is the response : " +res.asString());
}
结果:再次收到 404 作为响应。
方法四:
通过postman中的"Generate Access Token"取到access token后直接传过去了。
结果:
得到 403 作为响应。
不用对这里的专家说,我对 Rest Assured 还很陌生,只是想在黑暗中射箭以使事情正常进行。
我想要一种在每次 运行 测试之前生成 OAuth 令牌的可靠方法。也请随时指导我查看任何现有文档。
这是我要访问的 API 文档的 link:https://developers.google.com/gmail/api/v1/reference/users/getProfile#auth
在浏览了 N 篇博客并尝试尽可能多地获取信息后,我终于想出了一个解决方案,该解决方案在此过程中也有助于理解实际问题。
这里的主要问题是处理 OAuth2.0 身份验证以访问 Gmail API,我以错误的方式进行了操作。 Google OAuth 基本上要求我们获得一个代码,我们可以使用该代码请求它向我们发送一个令牌。然后需要将令牌作为身份验证发送到我们正在测试的 API 端点以获得所需的响应。
您可以先在Google Cloud Platform 中设置App Credentials。有关详细步骤,请参考此答案:Using Postman to access OAuth 2.0 Google APIs
以上步骤将为您提供重要参数,例如:Client_ID、Client_Secret、auth_url、redirect_uri.
下面是我们需要遵循的步骤:
从这些参数构造 AuthURL:BaseURI、Resource、scope、auth_url、
client_id,responseType,redirect_uri,状态
public static void constructAuthenticationURL(String BaseURI, String Resource,String scope,
String auth_url,String client_id,String responseType,String redirect_uri,String state) {
URL = BaseURI+Resource+"?scope="+scope+"&auth_url="+auth_url+"&client_id="+client_id+
"&response_type="+responseType+"&redirect_uri="+redirect_uri+"&state="+state;
}
BaseURI - https://accounts.google.com
资源 - /o/oauth2/v2/auth
范围 - 来自 API 文档
响应类型 - 代码
状态 - 空
现在我们需要使用 Selenium 在浏览器中点击 URL 并输入我们的用户名和密码。我们将看到一个空白屏幕,URL 在“&code=”前面有代码。
public static void getCodeThroughBrowserAuthentication(String Username,String Password) throws Exception {
driver.get(URL);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector
("input[type='email']"))).sendKeys(Username);
driver.findElement(By.xpath("//span[text()='Next']")).click();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector
("input[type='password']"))).sendKeys(Password);
driver.findElement(By.xpath("//span[text()='Next']")).click();
Thread.sleep(10000);
String[] arr = driver.getCurrentUrl().split("&code=");
String code[] = arr[1].split("&scope=");
//Store the Browser Code in a Variable to use it in Step 3
}
我已经使用 split() 从完整的 URL 中提取代码。
现在我们需要使用此代码获取 AccessToken(Bearer),以将其用于对实际端点的请求进行身份验证。
public static void getBearerAccessToken() {
RestAssured.baseURI="https://www.googleapis.com";
Response res = given().urlEncodingEnabled(false)
.queryParam("code", "Enter Browser code from previous step.")
.queryParam("client_id", "Client ID from Google Cloud Platform")
.queryParam("client_secret", "Client Secret ID from Google Cloud Platform")
.queryParam("redirect_uri", "The one you have entered while setting up the App credentials")
.queryParam("grant_type","authorization_code").
when()
.post("/oauth2/v4/token").
then()
.assertThat().statusCode(200).extract().response();
System.out.println("The response with Access Token is : " +res.asString());
JsonPath json = res.jsonPath();
//Storing AccessToken in a Variable
AccessToken = json.get("access_token");
}
最后一步是使用我们获得的令牌命中测试中的端点。
public void getUserProfile(String email,String AccessToken) {
RestAssured.baseURI="https://www.googleapis.com";
Response res = given().
auth().preemptive().oauth2(Access Token //Pass the Value of Access Token from Previous Step).
header("Content-Type","application/json").
queryParam("key","Setup an API Credentials Key on Google Cloud Platform.").
when().
get("/gmail/v1/users/"+email+"/profile").
then().assertThat().statusCode(200).extract().response();
System.out.println("User profile response : " +res.asString());
}
我很快会将 link 添加到 gitHub 回购 link 如果有人需要更清晰的图片。
我正在尝试使用 restAssured 验证 gmail API。根据文档,它需要使用 Key 和 OAuth2.0 进行身份验证。我最初使用 POSTMAN 并能够生成访问令牌,随后点击请求以获得成功响应。现在我想用 Rest Assured 框架实现同样的目标。
我想在 testNG 框架的 beforeMethod/beforeTest 某处添加令牌生成逻辑。
我基本上有两个问题:
- 我应该如何在 Google Cloud Platform 中为 OAuth 设置 API 凭据以通过 Rest Assured 发送请求(就像我们为 Postman 所做的那样)
- 请求端点和方法应该是什么。
到目前为止,我已经尝试了以下参考 Stack Overflow 和其他博客上发布的各种解决方案的方法:
方法一
public void oAuthToken() { Response res = given(). auth(). preemptive().basic("username", "password"). header("Content-Type","application/json"). queryParam("key","KeyGeneratedFromAPICedentials"). formParam("client_id","created an OAuth Client ID"). formParam("client_secret","created an OAuth Client Secret_ID"). formParam("grant_type","client_credentials"). when(). get("https://accounts.google.com/o/oauth2/auth"). //Getting this endpoint from JSON in OAuth Client ID created in google Cloud Platform then().assertThat().statusCode(200).extract().response(); System.out.println("This is the response : " +res.asString()); }
结果:预期状态代码 <200> 但实际为 <400>。
方法二:
public void oAuthToken() {
Response res = given().
auth().
preemptive().basic("username", "password").
header("Content-Type","application/json").
queryParam("key","KeyGeneratedFromAPICedentials").
formParam("client_id","created an OAuth Client ID").
formParam("client_secret","created an OAuth Client Secret_ID").
formParam("grant_type","client_credentials").
when().
get("https://oauth2.googleapis.com/token").
//Getting this endpoint from JSON in OAuth Client ID as Token_URI created in google Cloud Platform
then().assertThat().statusCode(200).extract().response();
System.out.println("This is the response : " +res.asString());
}
结果:预期状态代码 <200> 但为 <404>
方法三:
public void oAuthToken() {
RestAssured.baseURI="https://oauth2.googleapis.com";
Response res = given().
auth().preemptive().basic("Client_ID", "Client_Secret").
contentType("application/x-www-form-urlencoded").
formParam("grant_type","client_credentials").
formParam("scope","openid").
when().
get("/token").
then().assertThat().statusCode(200).extract().response();
System.out.println("This is the response : " +res.asString());
}
结果:再次收到 404 作为响应。
方法四: 通过postman中的"Generate Access Token"取到access token后直接传过去了。
结果: 得到 403 作为响应。
不用对这里的专家说,我对 Rest Assured 还很陌生,只是想在黑暗中射箭以使事情正常进行。
我想要一种在每次 运行 测试之前生成 OAuth 令牌的可靠方法。也请随时指导我查看任何现有文档。
这是我要访问的 API 文档的 link:https://developers.google.com/gmail/api/v1/reference/users/getProfile#auth
在浏览了 N 篇博客并尝试尽可能多地获取信息后,我终于想出了一个解决方案,该解决方案在此过程中也有助于理解实际问题。
这里的主要问题是处理 OAuth2.0 身份验证以访问 Gmail API,我以错误的方式进行了操作。 Google OAuth 基本上要求我们获得一个代码,我们可以使用该代码请求它向我们发送一个令牌。然后需要将令牌作为身份验证发送到我们正在测试的 API 端点以获得所需的响应。
您可以先在Google Cloud Platform 中设置App Credentials。有关详细步骤,请参考此答案:Using Postman to access OAuth 2.0 Google APIs
以上步骤将为您提供重要参数,例如:Client_ID、Client_Secret、auth_url、redirect_uri.
下面是我们需要遵循的步骤:
从这些参数构造 AuthURL:BaseURI、Resource、scope、auth_url、 client_id,responseType,redirect_uri,状态
public static void constructAuthenticationURL(String BaseURI, String Resource,String scope, String auth_url,String client_id,String responseType,String redirect_uri,String state) { URL = BaseURI+Resource+"?scope="+scope+"&auth_url="+auth_url+"&client_id="+client_id+ "&response_type="+responseType+"&redirect_uri="+redirect_uri+"&state="+state; }
BaseURI - https://accounts.google.com
资源 - /o/oauth2/v2/auth
范围 - 来自 API 文档
响应类型 - 代码
状态 - 空
现在我们需要使用 Selenium 在浏览器中点击 URL 并输入我们的用户名和密码。我们将看到一个空白屏幕,URL 在“&code=”前面有代码。
public static void getCodeThroughBrowserAuthentication(String Username,String Password) throws Exception { driver.get(URL); wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector ("input[type='email']"))).sendKeys(Username); driver.findElement(By.xpath("//span[text()='Next']")).click(); wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector ("input[type='password']"))).sendKeys(Password); driver.findElement(By.xpath("//span[text()='Next']")).click(); Thread.sleep(10000); String[] arr = driver.getCurrentUrl().split("&code="); String code[] = arr[1].split("&scope="); //Store the Browser Code in a Variable to use it in Step 3 }
我已经使用 split() 从完整的 URL 中提取代码。
现在我们需要使用此代码获取 AccessToken(Bearer),以将其用于对实际端点的请求进行身份验证。
public static void getBearerAccessToken() { RestAssured.baseURI="https://www.googleapis.com"; Response res = given().urlEncodingEnabled(false) .queryParam("code", "Enter Browser code from previous step.") .queryParam("client_id", "Client ID from Google Cloud Platform") .queryParam("client_secret", "Client Secret ID from Google Cloud Platform") .queryParam("redirect_uri", "The one you have entered while setting up the App credentials") .queryParam("grant_type","authorization_code"). when() .post("/oauth2/v4/token"). then() .assertThat().statusCode(200).extract().response(); System.out.println("The response with Access Token is : " +res.asString()); JsonPath json = res.jsonPath(); //Storing AccessToken in a Variable AccessToken = json.get("access_token"); }
最后一步是使用我们获得的令牌命中测试中的端点。
public void getUserProfile(String email,String AccessToken) { RestAssured.baseURI="https://www.googleapis.com"; Response res = given(). auth().preemptive().oauth2(Access Token //Pass the Value of Access Token from Previous Step). header("Content-Type","application/json"). queryParam("key","Setup an API Credentials Key on Google Cloud Platform."). when(). get("/gmail/v1/users/"+email+"/profile"). then().assertThat().statusCode(200).extract().response(); System.out.println("User profile response : " +res.asString()); }
我很快会将 link 添加到 gitHub 回购 link 如果有人需要更清晰的图片。