Amazon cognito: identity not found

2019-07-23 07:12发布

I am working on developer authenticated project.And I am trying to get credentials using this below code.But it is giving me following error.

I have pasted IdentityId and Token manually into this code from server code:

    Caused by: com.amazonaws.services.cognitoidentity.model.ResourceNotFoundException: Identity 'ap-northeast-1:fe81cd76-e9d4-4416-99ea-b684b78743c8' not found. (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: 2ac65fe8-d41a-11e5-8674-677eefdb5331)
                                                 at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:709)
                                                 at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:385)
                                                 at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:196)
                                                 at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.invoke(AmazonCognitoIdentityClient.java:533)
                                                 at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.getCredentialsForIdentity(AmazonCognitoIdentityClient.java:406)
                                                 at com.example.sandesh.aws.MainActivity$network.doInBackground(MainActivity.java:101)
                                                 at com.example.sandesh.aws.MainActivity$network.doInBackground(MainActivity.java:52)
                                                 at android.os.AsyncTask$2.call(AsyncTask.java:292)

Here is my code: MainActivity.java

    public class MainActivity extends AppCompatActivity {

Button button;

protected static CognitoCachingCredentialsProvider credentialsProvider = null;
private GetCredentialsForIdentityResult credentialsForIdentityResult;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    button = (Button)findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            network net = new network();
            net.execute();
        }
    });
}
public class network extends AsyncTask<Void,Void,String>{
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Void... params) {

        Authentication developerProvider = new Authentication(
                null,
                "ap-northeast-1:XXXXXXXXXXXXXXXXXX",
                Regions.AP_NORTHEAST_1);

        CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                getApplicationContext(),
                developerProvider,
                Regions.AP_NORTHEAST_1);


        HashMap<String, String> loginsMap = new HashMap<String, String>();
        loginsMap.put(developerProvider.getProviderName(), "7386372772");
        credentialsProvider.setLogins(loginsMap);
        credentialsProvider.refresh();
        GetCredentialsForIdentityRequest credentialsForIdentityRequest = new GetCredentialsForIdentityRequest();

        credentialsForIdentityRequest.setIdentityId(developerProvider.getIdentityId());
        credentialsForIdentityRequest.setLogins(loginsMap);
        AmazonCognitoIdentityClient cognitoIdentityClient = new AmazonCognitoIdentityClient(credentialsProvider);
        credentialsForIdentityResult = cognitoIdentityClient.getCredentialsForIdentity(credentialsForIdentityRequest);

        Log.d("access_key",credentialsForIdentityResult.getCredentials().getAccessKeyId());
        return credentialsForIdentityResult.getCredentials().getAccessKeyId();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }
}}

Authentication.java

   public class Authentication extends AWSAbstractCognitoDeveloperIdentityProvider {


private static final String PROVIDERNAME = "login.blupinch.app";
public String response = " ";
String line = " ";
public Authentication(String accountId, String identityPoolId, Regions region) {
    super(accountId, identityPoolId, region);
}

@Override
public String getProviderName() {
    return PROVIDERNAME;
}
public String refresh() {

    setToken(null);

    if (getProviderName() != null &&
            !this.loginsMap.isEmpty() &&
            this.loginsMap.containsKey(getProviderName())) {

        update(identityId, token);
        return "eyJraWQiOiJhcC1ub3J0aGVhc3QtMTEiLCJ0eXAiOiJKV1MiLCJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJhcC1ub3J0aGVhc3QtMTpmZTgxY2Q3Ni1lOWQ0LTQ0MTYtOTllYS1iNjg0Yjc4NzQzYzgiLCJhdWQiOiJhcC1ub3J0aGVhc3QtMTphODcxZmE1Zi0yM2EyLTQ4MGQtYmFhNi1iNGVkMzE0MzcyNDQilCJhbXIiOlsiYXV0aGVudGljYXRlZCIsImxvZ2luLmJsdXBpbmNoLmFwcCIsImxvZ2luLmJsdXBpbmNoLmFwcDphcC1ub3J0aGVhc3QtMTphODcxZmE1Zi0yM2EyLTQ4MGQtYmFhNi1iNGVkMzE0MzcyNDQ6NzM4NjM3Mjg3MiJdLCJpc3MiOiJodHRwczovL2NvZ25pdG8taWRlbnRpdHkuYW1hem9uYXdzLmNvbSIsImV4cCI6MTQ1NTU5NTM5NywiaWF0IjoxNDU1NTU5Mzk3fQ.fHHH6aeCn5EaJGxGD6tw7bWyQpPHuYcW8SZLRGVn-3cbamJrWEPmUnNvcLJ-D6nL8AvMQy7-s1LGQ5MNaiuIH7QF6W8aWt2OMALmA_Y7eqpGQ6iQXVma_jTZSpiyBe2cPNggWgeslPtFxomwE90vW0rzS1sY3D5Y3UbnrIHNdiPKIzzP9JaQo1IsTJMKEpQM-jzWP6stV1radDuIzWQroBVQseOQSD-MXV_-cgWWSx0eQmtFbjJW6RP_nACgh0uTbGmMuOi2iKXKQAdGlYWO-PHlShbiHT-WLQoZNWuh95Hh9dMldv-mNdnYSblqYyqptLA3kObioI08XXkTqwaaAw";


    } else {
        this.getIdentityId();
        return null;
    }
}
public String getIdentityId() {

    identityId = "ap-northeast-1:XXXXXXXXXXXXXXXXXXXXXXXX";

    if (identityId == null) {


        if (getProviderName() != null && !this.loginsMap.isEmpty()
                && this.loginsMap.containsKey(getProviderName())) {

            update(identityId, token);
            return "ap-northeast-1:XXXXXXXXXXXXXXXXXXXX";

        } else {
            return super.getIdentityId();
        }

    } else {
        return identityId;
    }

}}

I have tried it in PHP where I performed getOpenIdTokenForDeveloperIdentity , stsClient and AssumerolewithWebIdentity to get credentials it worked great. Thank you in advance.

2条回答
啃猪蹄的小仙女
2楼-- · 2019-07-23 07:32

When using Developer Authenticated Identities, the logins map for the call GetCredentialsForIdentity should have "cognito-identity.amazonaws.com" as the key instead of developer provider name.

Also, you should not be calling this method yourself, the SDK will take care of this.

Update:

When calling getCredentialsForIdentity, in the logins map, when key is "cognito-identity.amazonaws.com", the value should be the token you got from your backend after calling GetOpenIdTokenForDeveloperIdentity. You do not need to get the credentials for doing AWS operations, just initialize the AWS Service Client with this credentials provider and you should be good to go.

查看更多
劫难
3楼-- · 2019-07-23 07:35

(1) In your application, you do not need to call GetCredentialsForIdentity, the CredentialsProvider does all of this for you. (And ensures the correct arguments are passed in).
--> You can test that you are getting credentials by making a call to another service that requires credentials (ex S3)
--> Another option is to call getCredentials() on the Credentials Provider and validate that an exception is not thrown

(2) In Authentication.java, refresh, you seem to be using a hard coded token? This is likely expired, and you should make sure to get new ones. (If you are just testing app side, make sure you hard code a fresh one).

(3) In Authentication.java, refresh, it looks like you are calling update with a null token.

(4) Also make sure you are getting tokens for the hard coded identity you are using. (Again, you should only be hard coding this if you are testing).

查看更多
登录 后发表回答