【问题标题】:How to write java code REST Assured code to get authorization token?如何编写 java 代码 REST Assured 代码以获取授权令牌?
【发布时间】:2020-03-10 19:03:59
【问题描述】:

我需要使用 RestAssured - Java 创建测试以测试 REST API。为了获得身份验证令牌(OAuth 2.0),我需要从填写如下屏幕的邮递员请求发送。但是,在 java 测试中,我不能使用邮递员。知道获取身份验证令牌应该如何看起来像 java 代码吗?

【问题讨论】:

    标签: java integration-testing rest-assured


    【解决方案1】:

    这应该可行 -

    public class AuthenticationUtils {
    
        public static String generateOAuth2Token() {
            return "Bearer "+RestAssured.given().auth().basic("{YOUR_USERNAME}", "{YOUR_PASSWORD}")
                    .formParam("client_id", "{YOUR_CLIENT_ID}")
                    .formParam("client_secret", "{YOUR_SECRET}")
                    .formParam("grant_type", "client_credentials")
                    .formParam("{ANY_OTHER_TOKEN_NAME}", "{TOKEN_VALUE}")
                    .formParam("redirect_uri", "{http://take-me-here-next.com/api/endpoint}")
                    
                    .when().post("https://{YOUR_TOKEN_URL}/oauth2/v2.0/token")
                    .then()
                    .extract().path("access_token");
            
        }
    

    }

    用您的替换 {} 中的值

    【讨论】:

      【解决方案2】:

      请试试这个。 使用"client_secret""client_id" 会创建一个bearerToken,然后我们可以使用它进行身份验证。

      RestAssured.baseURI = "http://coop.apps.symfonycasts.com/";
      RestAssured.basePath = "/token";
      
      // client_secret is different from oauth2 token
      Response response = given()
                  .formParam("client_id","samapp")
                  .formParam("client_secret","f56f459193cee56817c2a99c205654b7")
                  .formParam("grant_type", "client_credentials").post("");
      
      //To get token
      String bearerToken = response.jsonPath().get("access_token");
      
      System.out.println("The bearer token value is "+bearerToken);
      
      Assert.assertEquals(200, response.getStatusCode(),"Status code mismatches");
      

      【讨论】:

      • 您好,请简要说明您的代码应该做什么,即使它足够干净!
      • 使用client_secret和client_id创建一个bearerToken,之后我们可以直接使用它进行身份验证。
      • 我将使用您的附加说明和一些轻微的代码格式来编辑您的帖子,以提高可读性。
      【解决方案3】:

      记下/存储从 uaa 服务器获取的客户端 ID 和密码

      然后首先尝试调用 uaa 获取令牌:

          Response response =
               given()
      .header("Authorization",<client id>:<client secret>)
      .contentType("application/x-www-form-urlencoded")
      .formParam("grant_type","authorization_code")                                                   .formParam("redirect_uri",REDIRECT_URL)
      .formParam("response_type","code")
      .formParam("code", AUTHORIZATION_CODE)
      .formParam("client_id", CLIENT_ID)
      .formParam("client_secret", CLIENT_SECRET)
              .when()
       .post(BASE_URI+"/oauth2/token");
      

      然后像下面这样获取访问令牌和令牌类型的信息:

          JSONObject jsonObject = new JSONObject(response.getBody().asString());
          String accessToken = jsonObject.get("access_token").toString();
          String tokenType = jsonObject.get("token_type").toString();
          log.info("Oauth Token with type " + tokenType + "   " + accessToken);
      

      最后通过在 header 中传递访问令牌来调用您的端点:

      Response response =
            given()
                .headers(
                    "Authorization",
                    "Bearer " + accessToken,
                    "Content-Type",
                    ContentType.JSON,
                    "Accept",
                    ContentType.JSON)
                .when()
                .get(url)
                .then()
                .contentType(ContentType.JSON)
                .extract()
                .response();
      

      【讨论】:

      • 感谢 Pramod,我认为这是一个很好的起点,但我应该为 AUTHORIZATION_CODE 输入什么。我的意思是在您评论中的这一行:formParam("code", AUTHORIZATION_CODE)。看看我的截图。我应该输入什么值而不是 AUTHORIZATION_CODE?
      【解决方案4】:

      下面是你的代码应该是什么样子的算法/sn-p:

      先决条件:

      1. 应获取并存储初始 OAuth 令牌和客户端 ID(在数据库或任何数据中) 存储)。
      2. 必须存储 OAuth 令牌生成时间
      3. 必须存储刷新令牌。
      4. 必须知道/存储 OAuth 令牌的有效期(当前 OAuth 令牌的有效期)。

      算法:

       long validityOfOAuthToken = DB.get ("validityOfOAuthToken");
       long OAuthGeneratedTimeInMillis = DB.get ("oAuthGeneratedTime");
       long currentTimeInMillis = DateTime.now (DateTimeZone.UTC).getMillis ( );
       if (currentTimeInMillis - OAuthGeneratedTimeInMillis > validityOfOAuthToken)
       {
          String clientID = DB.get ("clientID");
          String refreshToken = DB.get ("refreshToken");
          String accessToken = generateAccessToken (clientID, refreshToken); // API Invocation to get access token via refresh token
          DB.save ("oauthToken", accessToken);
          DB.save ("oAuthGeneratedTime", DateTime.now (DateTimeZone.UTC).getMillis ( ));
          return accessToken;
       }
       else
       {
          return DB.get ("oauthToken");
       }
      

      【讨论】:

        猜你喜欢
        • 2020-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-16
        • 2020-09-22
        • 2021-11-05
        • 2018-12-07
        • 1970-01-01
        相关资源
        最近更新 更多