Memorandum

覚書

AWS Cognito(android SDK)にて2つ以上のユーザーのcognito認証情報が取得できない

状況

"Amazon Web Services クラウドネイティブ・アプリケーション開発技法"のChapter4-1を参考にAWS CognitoによるFacebook認証を 行うアプリケーションをAndroid上で作成した際に躓いた点.

なお本のサンプルコードはGithub上で公開されている.

github.com

このChapter4-1のCognitoによる認証を利用したスマートフォン向けのアプリケーションの例では アプリケーションからのログアウトの処理が以下のようになっている.

Button closeButton = (Button) findViewById(R.id.button_close);
closeButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        LoginManager.getInstance().logOut();
        finish();
    }
});

このようにログアウト処理を実装すると,単一のFacebookアカウントでは正しく認証が行われCognitoのidentityIdが取得できたが, 一度ログアウトをおこない,別のFacebookアカウントでログインしようとすると以下のような"NotAuthorizedExcepition"が生じた.

*: com.amazonaws.services.cognitoidentity.model.NotAuthorizedException: Logins don't match. Please include at least one valid login for this identity or identity pool. (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: NotAuthorizedException; Request ID: *)

解決方法

AWSSDK自体に残っている認証情報のキャッシュを削除することにより,最初にログインした以外のアカウントでも 認証可能になる.CogtnitoCachingCredentialsProviderのclear()メソッドでキャッシュの削除が可能. 以下のようにキャッシュの削除をログアウト時の処理(ログアウトボタンクリック時の処理)に追加した.

Button closeButton = (Button) findViewById(R.id.button_close);
closeButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        LoginManager.getInstance().logOut();
   credentialsProvider.clear();
        finish();
    }
});

原因

AWS Cognitoのよくある質問に次のように書かれている.

Cognito アイデンティティを自動的にキャッシュするロジックは Mobile SDK により提供されます。この処理について心配する必要はありません。

Cognito認証情報はSDKによって自動的にキャッシュさせるのが普通であるようだ.なにより上の例ではcredentialsProviderとして"CognitoCachingCredentialsProvider"を利用していたのでキャッシュしていることは明らか.

参考

認証情報の取得 - Amazon Cognitodocs.aws.amazon.com

stackoverflow.com