AWS Cognito(android SDK)にて2つ以上のユーザーのcognito認証情報が取得できない
状況
"Amazon Web Services クラウドネイティブ・アプリケーション開発技法"のChapter4-1を参考にAWS CognitoによるFacebook認証を 行うアプリケーションをAndroid上で作成した際に躓いた点.
なお本のサンプルコードはGithub上で公開されている.
この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: *)
解決方法
AWSのSDK自体に残っている認証情報のキャッシュを削除することにより,最初にログインした以外のアカウントでも 認証可能になる.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"を利用していたのでキャッシュしていることは明らか.