Как получить учетные данные AWS из пулов удостоверений (федеративных удостоверений) с помощью Android - PullRequest
0 голосов
/ 28 июня 2018

Я новичок в AWS Cognito.

Из моей программы я хочу получить временные учетные данные AWS для доступа к API-сервисам, таким как API из API-шлюза. У меня есть « IdentityPoolId », « IdentityId » и « OpenIdToken ».

Когда я пытался получить доступ с помощью AWS Credential с помощью getCredentialsForIdentity , я получал « Identity 'ap-northeast-1: xxxx' не найден. » в методе onError каждый раз. Пожалуйста, помогите мне, что я был не прав?

    Single<GetCredentialsForIdentityResult> primeSingle = Single.fromCallable(MyClass::getResult);

    primeSingle
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleObserver<GetCredentialsForIdentityResult>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {
                }

                @Override
                public void onSuccess(@NonNull GetCredentialsForIdentityResult result) {
                    Credentials credentials = result.getCredentials();
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    Log.d("Test", "onError: " + e.getMessage());
                }
            });

Здесь выдается код результата.

private static GetCredentialsForIdentityResult getResult() {
    AmazonCognitoIdentity identityClient = new AmazonCognitoIdentityClient(new AnonymousAWSCredentials());

    Map<String, String> logins = new HashMap<String, String>();
    logins.put("cognito-identity.amazonaws.com", MyClass.OPEN_ID_TOKEN);

    GetCredentialsForIdentityRequest getCredentialsForIdentityRequest =
            new GetCredentialsForIdentityRequest()
            .withIdentityId(MyClass.IDENTITY_ID)  // Not Identity Pool Id
            .withLogins(logins);
    getCredentialsForIdentityRequest.setIdentityId(identityId);
    GetCredentialsForIdentityResult result = identityClient.getCredentialsForIdentity(getCredentialsForIdentityRequest);

    return result;
}

1 Ответ

0 голосов
/ 28 июня 2018

Наконец, я получил учетные данные, сославшись на это.

https://docs.aws.amazon.com/cognito/latest/developerguide/developer-authenticated-identities.html

Заранее спасибо.

Вот код:

public class DeveloperAuthenticationProvider extends AWSAbstractCognitoDeveloperIdentityProvider {

private static final String developerProvider = null;

public DeveloperAuthenticationProvider(String identityPoolId, Regions region) {
    super(null, identityPoolId, region);
    // Initialize any other objects needed here.
}

// Return the developer provider name which you choose while setting up the
// identity pool in the &COG; Console

@Override
public String getProviderName() {
    return developerProvider;
}

// Use the refresh method to communicate with your backend to get an
// identityId and token.

@Override
public String refresh() {

    // Override the existing token
    setToken(null);

    // Get the identityId and token by making a call to your backend
    // (Call to your backend)


    // Call the update method with updated identityId and token to make sure
    // these are ready to be used from Credentials Provider.

    update(identityId, token);
    return token;

}

// If the app has a valid identityId return it, otherwise get a valid
// identityId from your backend.

@Override
public String getIdentityId() {
    // Load the identityId from the cache
    identityId = "ap-northeast-1:xxxx";
    return identityId;
}}

Вызов вышеуказанного вызова из одного метода:

private static AWSSessionCredentials getResult(Context context) {
    DeveloperAuthenticationProvider developerProvider =
            new DeveloperAuthenticationProvider("ap-northeast-1:your_pool_id", Regions.AP_NORTHEAST_1);
    CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( context, developerProvider, Regions.AP_NORTHEAST_1);
    return credentialsProvider.getCredentials();
}

И используйте rxjava для получения ответа:

Single<AWSSessionCredentials> primeSingle = Single.fromCallable(() -> getResult(this));

    primeSingle
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleObserver<AWSSessionCredentials>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {

                }

                @Override
                public void onSuccess(@NonNull AWSSessionCredentials result) {
                    String secretKey = result.getAWSSecretKey();
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    Log.d("Test", "onError: " + e.getMessage());
                }
            });

После успешного завершения вы можете получить учетные данные из метода onSuccess.

...