当前位置: 首页 > 知识库问答 >
问题:

如何使用Rest Assured获取用于验证Google API/Gmail API的访问令牌

缪茂勋
2023-03-14
    null
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());
}
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());
        }
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());
}

结果:得到403作为应答。

不必对这里的专家说,我很新,可以放心,只是试图在黑暗中射箭,让事情运转起来。

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

共有1个答案

经正祥
2023-03-14

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

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

您可以先在谷歌云平台中设置应用凭据。详细步骤请参考以下答案:使用Postman访问OAuth2.0Google API

以上步骤将给出重要参数,如:Client_ID、Client_Secret、auth_url、redirect_uri。

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

>

  • 从以下参数构造AuthURL:BaseURI、Resource、scope、auth_url、client_id、responseType、redirect_uri、state

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

  •  类似资料:
    • 我询问了如何建立一个服务呼叫,并在HttpClient上获得了一个很好的信息。然而,虽然这个问题在技术上得到了回答,但我还是被卡住了。 在控制台中,我可以看到我的浏览器向服务发送了什么请求来获取授权令牌。然而,当我尝试在我的服务层中模拟构建请求的调用时,我得到以下错误消息。我在这里犯错的可能性很大。不知道该用谷歌搜索什么,真的。。。 "StatusCode: 500, ReasonPhrase:'

    • 我的主要目的是通过单个管理员访问令牌获取用户的日历。我正在尝试按照以下步骤获取访问令牌。 URL:https://login.microsoftonline.com/{tenentId}/oaust2/v2.0/令牌正文client_id:client_ID范围:https://graph.microsoft.com/.defaultclient_secret:client_secretIDgra

    • 我正在开发一个移动网站,托管Node.js / Express,并通过Firebase电话身份验证“轻微”保护。首次加载时,站点基本上是空的。在初始 Firebase Phone 身份验证后,JWT 令牌将通过 AJAX 调用发送到节点服务器。服务器检查令牌,验证用户是否已获得授权,然后发回站点的 html 内容。 到目前为止,一切都很好。这是保护简单单页Web应用程序上显示内容的好方法。 但这是

    • 文件上说https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html 必须验证访问令牌。如何验证令牌?

    • 我有一个Web应用程序(Angular 7),它使用MSAL Angular对Azure AD用户进行身份验证,并获取访问我的Web API(.NET 4.6)的访问令牌。这两个应用都已在Azure门户中注册,并具有以下权限,如下所述: Web应用程序:for Web API(委派) Web API:<代码>用户。阅读邮政发送MS图表(委派) 现在,我想使用ADAL for从Web API调用Mi

    • 我正在尝试使用邮递员应用程序从keycloak获取访问令牌。我使用的流是身份验证代码流。URI am提供的身份验证是 http://localhost:8080/auth/realms/realm_name/openid-connect/token 即使在keycloak中,我在clients下的Security-admin-console中将有效的重定向URI修改为http://localhos