【问题标题】:Getting Amazon Cognito Access Token in Java在 Java 中获取 Amazon Cognito 访问令牌
【发布时间】:2022-05-12 22:39:22
【问题描述】:

我们一直在编写一些代码来测试我们的端点和身份验证过程。我们使用 Cognito 进行身份验证,我们的端点需要一个具有隐式授权流程的访问令牌。

阅读亚马逊的文档,我们设法使用以下代码获得了一个 openid 令牌:

    AmazonCognitoIdentity identityClient = new AmazonCognitoIdentityClient(
            new BasicAWSCredentials("XXXXXXXXXXXXXXXXXXXXX",
                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
    );
    identityClient.setRegion(Region.getRegion(Regions.EU_WEST_1));
    GetOpenIdTokenForDeveloperIdentityRequest request =
            new GetOpenIdTokenForDeveloperIdentityRequest();
    request.setIdentityPoolId("eu-west-1:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    Map<String,String> logins = new HashMap<>();
    logins.put("acceptance-tests", "acceptance-tests");
    request.setLogins(logins);

    GetOpenIdTokenForDeveloperIdentityResult response =
            identityClient.getOpenIdTokenForDeveloperIdentity(request);
    String identityId = response.getIdentityId();

    String token = response.getToken();

我们只是不知道如何用 openid 令牌交换访问令牌来调用我们的端点。

也就是说,我们甚至不确定是否真的需要先获取 openid 令牌才能获取访问令牌。

在我们尝试使用下面的代码获取访问令牌之前,但我们得到的令牌不被我们的端点接受。我们得到的token和我们通过cognito UI登录时得到的token不同。

final String clientId = "XXXXXXXXXXXXXXXXXXXXXXXXX";
final String region = "eu-west-1";
final String username = "USERNAME";
final String password = "PASSWORD";
AWSCognitoIdentityProvider cognitoClient = AWSCognitoIdentityProviderClientBuilder.standard()
            .withRegion(region)
            .build();
final Map<String, String> authParams = new HashMap<>();
authParams.put("USERNAME", username);
authParams.put("PASSWORD", password);
final InitiateAuthRequest authRequest = new InitiateAuthRequest();
authRequest.withAuthFlow(AuthFlowType.USER_SRP_AUTH)
            .withClientId(clientId)
            .withAuthParameters(authParams);
InitiateAuthResult result = cognitoClient.initiateAuth(authRequest);

【问题讨论】:

  • 如果您找到解决方案,您可以更新吗?

标签: java aws-sdk amazon-cognito


【解决方案1】:

我发现这行得通。您不需要 openid 来获取访问令牌!返回的令牌包含响应中的所有信息,例如令牌、到期时间、令牌类型等。

private OAuthJSONAccessTokenResponse getAuthToken() {
    try {
        OAuthClient client = new OAuthClient(new URLConnectionClient());

        OAuthClientRequest request = OAuthClientRequest.tokenLocation(AUTH_TOKEN_ENDPOINT)
                .setGrantType(GrantType.CLIENT_CREDENTIALS)
                .setClientId(CLIENT_ID)
                .setClientSecret(CLIENT_SECRET)
                //.setScope(SCOPE)
                .buildBodyMessage();

        System.out.println(request.getBody());

        //token = client.accessToken(request, OAuth.HttpMethod.POST);
        //System.out.println(token);
        this.init = true;
        return client.accessToken(request, OAuth.HttpMethod.POST);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2020-11-20
    • 2017-10-09
    • 2018-07-20
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多