如何使用Rest Assured获得验证Google API/GGmail API的访问令牌



我正在尝试使用restAssured验证gmail API。根据文档,它需要使用Key和OAuth2.0进行身份验证。我最初使用了POSTMAN,能够生成访问令牌,然后点击请求以获得成功响应。现在,我想通过Rest Assured框架实现同样的目标。

我想在testNG框架中的beforeMethod/beforeTest中添加令牌生成的逻辑。

我基本上有两个问题:

  1. 我应该如何在谷歌云平台中为OAuth设置API凭据,以便通过Rest Assured(就像我们为Postman所做的那样(满足请求
  2. 什么应该是请求端点和方法

到目前为止,我已经尝试了以下方法,参考了Stack Overflow和其他博客上发布的各种解决方案:

  1. 方法1

    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>。

方法2:

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>

方法3:

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作为响应。

方法4:通过poster中的"生成访问令牌"获取访问令牌后,直接传递访问令牌。

结果:得到403作为响应。

不用对这里的专家说,我对Rest Assured还很陌生,只是想在黑暗中射箭,让事情运转起来。

我想要一种健壮的方法,在每次运行测试之前生成OAuth令牌。请随时指导我查看任何现有的文档。

这是我试图访问的API文档的链接:https://developers.google.com/gmail/api/v1/reference/users/getProfile#auth

在浏览了N个博客并试图获取尽可能多的信息后,我终于能够提出一个解决方案,在这个过程中也有助于理解实际问题。

这里的主要问题是处理OAuth2.0身份验证以访问Gmail API,这是我错误的做法。谷歌OAuth基本上要求我们获得一个代码,我们可以使用它向我们发送令牌。然后,令牌需要作为身份验证发送到我们正在测试的API端点,以获得所需的响应。

您可以首先在谷歌云平台中设置应用程序凭据。有关详细步骤,请参阅此答案:使用Postman访问OAuth 2.0 Google API

上面的步骤将为您提供重要的参数,如:Client_ID、Client_Secret、auth_url、redirect_uri。

以下是我们从现在开始需要遵循的步骤:

  1. 根据以下参数构造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文档

responseType-代码

状态-空

  1. 现在我们需要在浏览器中使用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中获取代码。

  1. 现在我们需要使用此代码来获取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");
    }
    
  2. 最后一步是使用我们得到的令牌到达测试中的端点。

    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());
    }
    

如果有人需要更清晰的图片,我很快就会添加gitHub回购链接。

相关内容

  • 没有找到相关文章

最新更新