高度なワークフロー
イベントの購読
ユーザーがサインインまたはサインアウトするときに特定のアクションを実行するには、アプリで認証イベントを購読します。詳細については、Hub Module開発者ガイドを参照してください。
IDプール連携
モバイルデバイスで実行され、Amazon S3およびDynamoDBを使用してプレイヤーとスコア情報を保存するゲームなど、AWSリソースにアクセスするモバイルアプリを作成しているとします。
このようなアプリを作成する場合、AWSサービスへのリクエストに署名する必要があるAWSアクセスキーを使用します。ただし、ユーザーがデバイスにダウンロードするアプリに長期的なAWS認証情報を埋め込んだり配布したりしないことを強くお勧めします。これは、暗号化されたストア内であっても同様です。代わりに、Webアイデンティティ連携を使用して、必要に応じて一時的なAWSセキュリティ認証情報を動的にリクエストするようにアプリを構築してください。提供された一時的な認証情報は、モバイルアプリが必要とするタスクを実行するために必要な権限のみを持つAWSロールにマップされます。
Webアイデンティティ連携を使用すると、カスタムサインインコードを作成したり、独自のユーザーアイデンティティを管理したりする必要はありません。代わりに、アプリのユーザーは、Login with Amazon、Facebook、Google、またはその他のOpenID Connect(OIDC)互換のIDプロバイダ(IdP)などの、よく知られている外部IDプロバイダを使用してサインインできます。認証トークンを受け取り、そのトークンをAWS内の一時的なセキュリティ認証情報と交換して、AWSアカウント内のリソースを使用する権限を持つIAMロールにマップできます。IdPを使用することで、アプリケーションに長期的なセキュリティ認証情報を埋め込んで配布する必要がないため、AWSアカウントを安全に保つことができます。
federateToIdentityPoolを使用して、AWSCognito連携アイデンティティから直接AWS認証情報を取得し、ユーザープール連携を使用しないようにすることができます。Auth.signInでログインした場合、Amplifyがバックグラウンドでこの連携を自動的に実行するため、federateToIdentityPoolを呼び出すことはできません。一般的に、Auth.federateToIdentityPoolを呼び出すのはOAuthフローを使用している場合だけにしてください。
他のソーシャルプロバイダからの有効なトークンを使用して、エスケープハッチAPIfederateToIdentityPoolを使用できます。
func federateToIdentityPools() async throws { guard let authCognitoPlugin = try Amplify.Auth.getPlugin( for: "awsCognitoAuthPlugin") as? AWSCognitoAuthPlugin else { fatalError("Unable to get the Auth plugin") } do { let result = try await authCognitoPlugin.federateToIdentityPool( withProviderToken: "YOUR_TOKEN", for: .facebook) print("Federation successful with result: \(result)") } catch { print("Failed to federate to identity pools with error: \(error)") }}セッションを取得する
連携ログイン後、Auth.fetchAuthSession APIを使用してセッションを取得できます。
トークンの更新
デフォルトでは、Amplifyは連携プロバイダからのトークンを自動的に更新しません。トークンの更新ロジックを処理して、新しいトークンをfederateToIdentityPool APIに提供する必要があります。
セッションをクリアする
clearFederationToIdentityPool APIを使用して、連携セッションをクリアできます。
func clearFederationToIdentityPools() async throws { guard let authCognitoPlugin = try Amplify.Auth.getPlugin( for: "awsCognitoAuthPlugin") as? AWSCognitoAuthPlugin else { fatalError("Unable to get the Auth plugin") } do { try await authCognitoPlugin.clearFederationToIdentityPool() print("Federation cleared successfully") } catch { print("Clear federation failed with error: \(error)") }}カスタムアイデンティティIDを提供する
federateToIdentityPool APIにカスタムアイデンティティIDを提供できます。これは、複数のデバイス間で同じアイデンティティIDを使用したい場合に便利です。
func federateToIdentityPoolsUsingCustomIdentityId() async throws { guard let authCognitoPlugin = try Amplify.Auth.getPlugin( for: "awsCognitoAuthPlugin") as? AWSCognitoAuthPlugin else { fatalError("Unable to get the Auth plugin") } do { let identityId = "YOUR_CUSTOM_IDENTITY_ID" let result = try await authCognitoPlugin.federateToIdentityPool( withProviderToken: "YOUR_TOKEN", for: .facebook, options: .init(developerProvidedIdentityID: identityId)) print("Federation successful with result: \(result)") } catch { print("Failed to federate to identity pools with error: \(error)") }}キーチェーン共有
共有キーチェーンへの移行
共有キーチェーンを使用するには、次の手順を実行します。
- Xcodeで [プロジェクト設定] → [対象となるターゲット] → [署名と機能] に移動します
- [+ 機能]を選択します
- キーチェーン共有機能を追加します
- キーチェーングループを追加します
- 認証状態を共有するすべてのアプリについて手順1~4を繰り返し、すべてのアプリに同じキーチェーングループを追加します
このキーチェーンアクセスグループを使用して共有キーチェーンに移行するには、AWSCognitoAuthPluginをインスタンス化するときにaccessGroupパラメータを指定します。ユーザーが現在サインインしている場合、アクセスグループを初めて使用するときにサインアウトされます。
let accessGroup = AccessGroup(name: "\(teamID)com.example.sharedItems")let secureStoragePreferences = AWSCognitoSecureStoragePreferences( accessGroup: accessGroup)try Amplify.add( plugin: AWSCognitoAuthPlugin( secureStoragePreferences: secureStoragePreferences))try Amplify.configure()ユーザーセッションを移行する場合(ユーザーがサインインし続けることができます)、AccessGroupのmigrateKeychainItemsOfUserSessionブール値をtrueに指定します。
let accessGroup = AccessGroup( name: "\(teamID)com.example.sharedItems", migrateKeychainItemsOfUserSession: true)let secureStoragePreferences = AWSCognitoSecureStoragePreferences( accessGroup: accessGroup)try Amplify.add( plugin: AWSCognitoAuthPlugin( secureStoragePreferences: secureStoragePreferences))try Amplify.configure()このアクセスグループを使用するアプリ内でユーザーにサインインします。このアクセスグループを使用する別のアプリを再度読み込んだ後、ユーザーはサインインした状態になります。同様に、あるアプリからサインアウトすると、別のアプリの再読み込み後にサインアウトされます。
別の共有キーチェーンへの移行
異なるアクセスグループに移行するには、AccessGroupのnameパラメータを新しいアクセスグループに更新します。既に使用されているアクセスグループの下で既存のユーザーセッションを移行するには、migrateKeychainItemsOfUserSessionをtrueに設定します。
共有キーチェーンからの移行
このアプリと他のアプリ間での状態の共有を停止する場合は、アクセスグループをAccessGroup.noneまたはAccessGroup.none(migrateKeychainItemsOfUserSession: true)に設定します。セッションを移行したい場合は後者を使用してください。
チームIDを取得する
まず、Info.plistにAppIdentifierPrefixキーがあることを確認してください。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>AppIdentifierPrefix</key> <string>$(AppIdentifierPrefix)</string></dict></plist>次に、Info.plistからチームIDを取得できます。
guard let teamID = Bundle.main.infoDictionary?["AppIdentifierPrefix"] as? String else { fatalError("AppIdentifierPrefix key not found in Info.plist")}