トークンと認証情報
Amplify Authは、基盤となるAmazon Cognito ユーザープールとOpenID Connect(OIDC)プロバイダーとしてやり取りします。ユーザーが正常に認証されると、OIDC準拠のJSON Web Token(JWT)を受け取ります。これらのトークンはユーザーを_識別_し、リソースに_アクセス_するために使用されます。
アクセストークンは、トークンのベアラー(つまりCognitoユーザー)がリソースに対するアクションを実行する権限があるかどうかを確認するために使用されます。以下はCognitoによって発行されたアクセストークンのペイロード例です:
{ "sub": "54288468-e051-706d-a73f-03892273d7e9", "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_yoKn9s4Tq", "client_id": "1sg675g08g6g0e9f64grv9n5sk", "origin_jti": "0eadb994-a6e0-419e-b309-a7a0d522d72f", "event_id": "b180897a-181c-4f73-94bb-a2946e8b4ef1", "token_use": "access", "scope": "aws.cognito.signin.user.admin", "auth_time": 1714241873, "exp": 1714245473, "iat": 1714241873, "jti": "57f10a4d-a1f2-453b-8672-d1cfa8187047", "username": "54288468-e051-706d-a73f-03892273d7e9"}IDトークンは、フロントエンドアプリケーション内でのみ使用することを目的としています。このトークンには個人識別情報(PII)が含まれており、リソースに対するアクセスを認可するために使用すべきではありません。以下は、デフォルトのAmplify Authの設定でメールとパスワード認証を使用したIDトークンの例です。
{ "sub": "54288468-e051-706d-a73f-03892273d7e9", "email_verified": true, "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_yoKn9s4Tq", "cognito:username": "54288468-e051-706d-a73f-03892273d7e9", "origin_jti": "0eadb994-a6e0-419e-b309-a7a0d522d72f", "aud": "1sg675g08g6g0e9f64grv9n5sk", "event_id": "b180897a-181c-4f73-94bb-a2946e8b4ef1", "token_use": "id", "auth_time": 1714241873, "exp": 1714245473, "iat": 1714241873, "jti": "bb69af10-3ce0-47c2-8d8d-5bdc8630ab58", "email": "hello@mycompany.com"}Amplify Authに追加のユーザー属性が指定されている場合、それらの値はIDトークンに含まれます。例えば、nickname属性がリクエストされた場合、IDトークンでnicknameクレームとして利用可能になります:
{ "sub": "54288468-e051-706d-a73f-03892273d7e9", "email_verified": true, "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_yoKn9s4Tq", "cognito:username": "54288468-e051-706d-a73f-03892273d7e9", "origin_jti": "0eadb994-a6e0-419e-b309-a7a0d522d72f", "aud": "1sg675g08g6g0e9f64grv9n5sk", "event_id": "b180897a-181c-4f73-94bb-a2946e8b4ef1", "token_use": "id", "auth_time": 1714241873,+ "nickname": "hello", "exp": 1714245473, "iat": 1714241873, "jti": "bb69af10-3ce0-47c2-8d8d-5bdc8630ab58", "email": "hello@mycompany.com"}一方、ユーザープールグループクレームはアクセストークンとIDトークンの両方にcognito:groupsクレームで含まれます:
{ "sub": "54288468-e051-706d-a73f-03892273d7e9", "email_verified": true, "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_yoKn9s4Tq", "cognito:username": "54288468-e051-706d-a73f-03892273d7e9", "cognito:groups": ["ADMINS"], "origin_jti": "0eadb994-a6e0-419e-b309-a7a0d522d72f", "aud": "1sg675g08g6g0e9f64grv9n5sk", "event_id": "b180897a-181c-4f73-94bb-a2946e8b4ef1", "token_use": "id", "auth_time": 1714241873, "nickname": "hello", "exp": 1714245473, "iat": 1714241873, "jti": "bb69af10-3ce0-47c2-8d8d-5bdc8630ab58", "email": "hello@mycompany.com"}Cognitoユーザープールでトークンを使用することに関するAWSドキュメントにアクセスして、トークン、Cognitoでの使用方法、および意図された用途についてさらに詳しく学習してください。
Amplify Authは認証関連情報を永続化して、他のAmplifyカテゴリーとアプリケーションで利用可能にします。
Amplify Flutterは認証情報とユーザーID情報を安全に管理します。認証情報を自分で保存、リフレッシュ、または削除する必要はありません。Amplify Flutterは、iOSおよびmacOSのKeychain ServicesやAndroidのEncryptedSharedPreferencesなどのプラットフォーム機能を使用してデバイスに認証データを保存します。
いくつかのプラットフォーム固有オプションは、すぐに使用できるオプションでカスタマイズできます。下の例では、ブラウザストレージのデフォルト動作の代わりに、認証情報がWebでメモリ内に保存されます。
await Amplify.addPlugin( AmplifyAuthCognito( secureStorageFactory: AmplifySecureStorage.factoryFrom( webOptions: WebSecureStorageOptions( persistenceOption: WebPersistenceOption.inMemory, ), ), ),);さらなるカスタマイズが必要な場合は、SecureStorageInterfaceインスタンスを作成するための独自のファクトリーをAmplifyAuthCognitoに提供できます。下の例は、すべてのプラットフォームでデータをメモリ内に保存するカスタム実装の使用を示しています。
await Amplify.addPlugin( AmplifyAuthCognito(secureStorageFactory: InMemoryStorage.new),);class InMemoryStorage implements SecureStorageInterface { InMemoryStorage(this.scope);
/// The scope of the item being stored. /// /// This can be used as a namespace for stored items. final AmplifySecureStorageScope scope;
static final Map<String, String> _data = {};
void write({required String key, required String value}) { _data['${scope.name}.$key'] = value; }
String? read({required String key}) { return _data['${scope.name}.$key']; }
void delete({required String key}) { _data.remove('${scope.name}.$key'); }}トークン取り消し
トークン取り消しはAmplify Authで自動的に有効になります。トークンを取り消すには、await Amplify.Auth.signOut(options: const signOutOptions(globalSignOut: true))を呼び出して、すべてのデバイスからユーザーをグローバルにサインアウトできます。