

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# デベロッパーが認証した ID
<a name="developer-authenticated-identities"></a>

Amazon Cognito は、[アイデンティティプール IdP として Facebook を設定する](facebook.md)、[アイデンティティプール IdP として Google を設定する](google.md)、[アイデンティティプール IdP として Login with Amazon を設定する](amazon.md)、および [アイデンティティプール IdP として Apple でサインインを設定する](apple.md) 経由でのウェブ ID フェデレーションに加えて、デベロッパーが認証したアイデンティティもサポートします。開発者が認証した ID を使用すると、Amazon Cognito を使用してユーザーデータを同期し、 AWS リソースにアクセスしながら、独自の既存の認証プロセスを通じてユーザーを登録および認証できます。デベロッパーが認証したアイデンティティの使用には、エンドユーザーのデバイス、認証のバックエンド、および Amazon Cognito 間の対話が関連します。詳細については、 AWS ブログの[「Understanding Amazon Cognito Authentication Part 2: Developer Authenticated Identities](https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-authentication-part-2-developer-authenticated-identities/)」を参照してください。

## 認証のフローについて
<a name="understanding-the-authentication-flow"></a>

[GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) API オペレーションは、拡張認証と基本認証の両方についてデベロッパー認証を開始できます。この API は、管理者認証情報を使用してリクエストを認証します。`Logins` マップは、カスタム識別子とペアになっている `login.mydevprovider` などの、アイデンティティプールデベロッパープロバイダー名です。

例:

```
"Logins": {
        "login.mydevprovider": "my developer identifier"
    }
```

**拡張認証**

[GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html) API オペレーションを、`GetOpenIdTokenForDeveloperIdentity` からトークンの名前 `cognito-identity.amazonaws.com` と値を含む `Logins` マップで呼び出します。

例:

```
"Logins": {
        "cognito-identity.amazonaws.com": "eyJra12345EXAMPLE"
    }
```

デベロッパー認証 ID を持つ `GetCredentialsForIdentity` は、アイデンティティプールのデフォルト認証ロールの一時的な認証情報を返します。

**基本認証**

[AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API オペレーションを呼び出し、適切な[信頼関係が定義されている](iam-roles.md#role-trust-and-permissions) IAM ロールの `RoleArn` をリクエストします。`WebIdentityToken` の値を `GetOpenIdTokenForDeveloperIdentity` から取得したトークンに設定します。

ディベロッパーが認証した ID の認証フローの詳細と、外部プロバイダー ID との違いについては、「[ID プールの認証フロー](authentication-flow.md)」を参照してください。

## デベロッパー名を指定して ID プールに関連付ける
<a name="associate-developer-provider"></a>

デベロッパーが認証したアイデンティティを使用するには、デベロッパープロバイダーに関連付けられたアイデンティティプールが必要です。そのためには、以下の手順を実行します。

**カスタムデベロッパープロバイダーを追加するには**

1. [Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/home)で **[ID プールの管理]** をクリックします。アイデンティティプールを選択します。

1. **[ユーザーアクセス]** タブを選択します。

1. **[ID プロバイダーを追加]** を選択します。

1. **カスタムデベロッパープロバイダー**を選択します。

1. **デベロッパープロバイダー名**を入力します。デベロッパープロバイダーを追加した後は、変更または削除することはできません。

1. **[変更を保存]** を選択します。

注意: プロバイダー名を設定した場合、それを変更することはできません。

## ID プロバイダーの実装
<a name="implement-an-identity-provider"></a>

### Android
<a name="implement-id-provider-1.android"></a>

ディベロッパーが認証した ID を使用するには、`AWSAbstractCognitoIdentityProvider` を拡張する独自の ID プロバイダークラスを実装します。ID プロバイダークラスは、属性としてトークンを含むレスポンスオブジェクトを返す必要があります。

以下に示しているのは、ID プロバイダーの基本的な例です。

```
public class DeveloperAuthenticationProvider extends AWSAbstractCognitoDeveloperIdentityProvider {

  private static final String developerProvider = "<Developer_provider_name>";

  public DeveloperAuthenticationProvider(String accountId, String identityPoolId, Regions region) {
    super(accountId, identityPoolId, region);
    // Initialize any other objects needed here.
  }

  // Return the developer provider name which you choose while setting up the
  // identity pool in the &COG; Console

  @Override
  public String getProviderName() {
    return developerProvider;
  }

  // Use the refresh method to communicate with your backend to get an
  // identityId and token.

  @Override
  public String refresh() {

    // Override the existing token
    setToken(null);

    // Get the identityId and token by making a call to your backend
    // (Call to your backend)

    // Call the update method with updated identityId and token to make sure
    // these are ready to be used from Credentials Provider.

    update(identityId, token);
    return token;

  }

  // If the app has a valid identityId return it, otherwise get a valid
  // identityId from your backend.

  @Override
  public String getIdentityId() {

    // Load the identityId from the cache
    identityId = cachedIdentityId;

    if (identityId == null) {
       // Call to your backend
    } else {
       return identityId;
    }

  }
}
```

この ID プロバイダーを使用するには、これを `CognitoCachingCredentialsProvider` に渡す必要があります。例を示します。

```
DeveloperAuthenticationProvider developerProvider = new DeveloperAuthenticationProvider( null, "IDENTITYPOOLID", context, Regions.USEAST1);
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( context, developerProvider, Regions.USEAST1);
```

### iOS - Objective-C
<a name="implement-id-provider-1.ios-objc"></a>

ディベロッパーが認証した ID を使用するには、[AWSCognitoCredentialsProviderHelper](https://github.com/aws-amplify/aws-sdk-ios) を拡張する独自の ID プロバイダークラスを実装します。ID プロバイダークラスは、属性としてトークンを含むレスポンスオブジェクトを返す必要があります。

```
@implementation DeveloperAuthenticatedIdentityProvider
/*
 * Use the token method to communicate with your backend to get an
 * identityId and token.
 */

- (AWSTask <NSString*> *) token {
    //Write code to call your backend:
    //Pass username/password to backend or some sort of token to authenticate user
    //If successful, from backend call getOpenIdTokenForDeveloperIdentity with logins map 
    //containing "your.provider.name":"enduser.username"
    //Return the identity id and token to client
    //You can use AWSTaskCompletionSource to do this asynchronously

    // Set the identity id and return the token
    self.identityId = response.identityId;
    return [AWSTask taskWithResult:response.token];
}

@end
```

この ID プロバイダーを使用するには、次の例に示すように、それを `AWSCognitoCredentialsProvider` に渡します。

```
DeveloperAuthenticatedIdentityProvider * devAuth = [[DeveloperAuthenticatedIdentityProvider alloc] initWithRegionType:AWSRegionYOUR_IDENTITY_POOL_REGION 
                                         identityPoolId:@"YOUR_IDENTITY_POOL_ID"
                                        useEnhancedFlow:YES
                                identityProviderManager:nil];
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc]
                                                          initWithRegionType:AWSRegionYOUR_IDENTITY_POOL_REGION
                                                          identityProvider:devAuth];
```

認証されていない ID と開発者が認証した ID の両方をサポートする場合は、`AWSCognitoCredentialsProviderHelper` の実装で `logins` メソッドをオーバーライドします。

```
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    if(/*logic to determine if user is unauthenticated*/) {
        return [AWSTask taskWithResult:nil];
    }else{
        return [super logins];
    }
}
```

開発者が認証した ID とソーシャルプロバイダーをサポートする場合は、`AWSCognitoCredentialsProviderHelper` の `logins` 実装で現在のプロバイダーが誰であるかを管理する必要があります。

```
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    if(/*logic to determine if user is unauthenticated*/) {
        return [AWSTask taskWithResult:nil];
    }else if (/*logic to determine if user is Facebook*/){
        return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : [FBSDKAccessToken currentAccessToken] }];
    }else {
        return [super logins];
    }
}
```

### iOS - Swift
<a name="implement-id-provider-1.ios-swift"></a>

ディベロッパーが認証した ID を使用するには、[AWSCognitoCredentialsProviderHelper](https://github.com/aws-amplify/aws-sdk-ios) を拡張する独自の ID プロバイダークラスを実装します。ID プロバイダークラスは、属性としてトークンを含むレスポンスオブジェクトを返す必要があります。

```
import AWSCore
/*
 * Use the token method to communicate with your backend to get an
 * identityId and token.
 */
class DeveloperAuthenticatedIdentityProvider : AWSCognitoCredentialsProviderHelper {
    override func token() -> AWSTask<NSString> {
    //Write code to call your backend:
    //pass username/password to backend or some sort of token to authenticate user, if successful, 
    //from backend call getOpenIdTokenForDeveloperIdentity with logins map containing "your.provider.name":"enduser.username"
    //return the identity id and token to client
    //You can use AWSTaskCompletionSource to do this asynchronously

    // Set the identity id and return the token
    self.identityId = resultFromAbove.identityId
    return AWSTask(result: resultFromAbove.token)
}
```

この ID プロバイダーを使用するには、次の例に示すように、それを `AWSCognitoCredentialsProvider` に渡します。

```
let devAuth = DeveloperAuthenticatedIdentityProvider(regionType: .YOUR_IDENTITY_POOL_REGION, identityPoolId: "YOUR_IDENTITY_POOL_ID", useEnhancedFlow: true, identityProviderManager:nil)
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .YOUR_IDENTITY_POOL_REGION, identityProvider:devAuth)
let configuration = AWSServiceConfiguration(region: .YOUR_IDENTITY_POOL_REGION, credentialsProvider:credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration = configuration
```

認証されていない ID と開発者が認証した ID の両方をサポートする場合は、`AWSCognitoCredentialsProviderHelper` の実装で `logins` メソッドをオーバーライドします。

```
override func logins () -> AWSTask<NSDictionary> {
    if(/*logic to determine if user is unauthenticated*/) {
        return AWSTask(result:nil)
    }else {
        return super.logins()
    }
}
```

開発者が認証した ID とソーシャルプロバイダーをサポートする場合は、`AWSCognitoCredentialsProviderHelper` の `logins` 実装で現在のプロバイダーが誰であるかを管理する必要があります。

```
override func logins () -> AWSTask<NSDictionary> {
    if(/*logic to determine if user is unauthenticated*/) {
        return AWSTask(result:nil)
    }else if (/*logic to determine if user is Facebook*/){
        if let token = AccessToken.current?.authenticationToken {
            return AWSTask(result: [AWSIdentityProviderFacebook:token])
        }
        return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"]))
    }else {
        return super.logins()
    }
}
```

### JavaScript
<a name="implement-id-provider-1.javascript"></a>

バックエンドからアイデンティティ ID とセッショントークンを取得したら、それらを `AWS.CognitoIdentityCredentials` プロバイダーに渡します。以下に例を示します。

```
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
   IdentityPoolId: 'IDENTITY_POOL_ID',
   IdentityId: 'IDENTITY_ID_RETURNED_FROM_YOUR_PROVIDER',
   Logins: {
      'cognito-identity.amazonaws.com': 'TOKEN_RETURNED_FROM_YOUR_PROVIDER'
   }
});
```

### Unity
<a name="implement-id-provider-1.unity"></a>

開発者が認証した ID を使用するには、`CognitoAWSCredentials` を拡張し、`RefreshIdentity` メソッドを上書きして、ユーザー ID とトークンをバックエンドから取得して返す必要があります。「example.com」という仮定のバックグランドに接続する ID プロバイダーの簡単な例を以下に示します。

```
using UnityEngine;
using System.Collections;
using Amazon.CognitoIdentity;
using System.Collections.Generic;
using ThirdParty.Json.LitJson;
using System;
using System.Threading;

public class DeveloperAuthenticatedCredentials : CognitoAWSCredentials
{
    const string PROVIDER_NAME = "example.com";
    const string IDENTITY_POOL = "IDENTITY_POOL_ID";
    static readonly RegionEndpoint REGION = RegionEndpoint.USEast1;

    private string login = null;

    public DeveloperAuthenticatedCredentials(string loginAlias)
        : base(IDENTITY_POOL, REGION)
    {
        login = loginAlias;
    }

    protected override IdentityState RefreshIdentity()
    {
        IdentityState state = null;
        ManualResetEvent waitLock = new ManualResetEvent(false);
        MainThreadDispatcher.ExecuteCoroutineOnMainThread(ContactProvider((s) =>
        {
            state = s;
            waitLock.Set();
        }));
        waitLock.WaitOne();
        return state;
    }

    IEnumerator ContactProvider(Action<IdentityState> callback)
    {
        WWW www = new WWW("http://example.com/?username="+login);
        yield return www;
        string response = www.text;

        JsonData json = JsonMapper.ToObject(response);

        //The backend has to send us back an Identity and a OpenID token
        string identityId = json["IdentityId"].ToString();
        string token = json["Token"].ToString();

        IdentityState state = new IdentityState(identityId, PROVIDER_NAME, token, false);
        callback(state);
    }
}
```

上記のコードでは、スレッドディスパッチャーオブジェクトを使用してコルーチンを呼び出します。プロジェクトでこれを行う方法がない場合は、シーンで以下のスクリプトを使用できます。

```
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class MainThreadDispatcher : MonoBehaviour
{
    static Queue<IEnumerator> _coroutineQueue = new Queue<IEnumerator>();
    static object _lock = new object();

    public void Update()
    {
        while (_coroutineQueue.Count > 0)
        {
            StartCoroutine(_coroutineQueue.Dequeue());
        }
    }

    public static void ExecuteCoroutineOnMainThread(IEnumerator coroutine)
    {
        lock (_lock) {
            _coroutineQueue.Enqueue(coroutine);
        }
    }
}
```

### Xamarin
<a name="implement-id-provider-1.xamarin"></a>

開発者が認証した ID を使用するには、`CognitoAWSCredentials` を拡張し、`RefreshIdentity` メソッドを上書きして、ユーザー ID とトークンをバックエンドから取得して返す必要があります。「example.com」という仮定のバックグランドに接続する ID プロバイダーの基本的な例を以下に示します。

```
public class DeveloperAuthenticatedCredentials : CognitoAWSCredentials
{
    const string PROVIDER_NAME = "example.com";
    const string IDENTITY_POOL = "IDENTITY_POOL_ID";
    static readonly RegionEndpoint REGION = RegionEndpoint.USEast1;
    private string login = null;

    public DeveloperAuthenticatedCredentials(string loginAlias)
        : base(IDENTITY_POOL, REGION)
    {
        login = loginAlias;
    }

    protected override async Task<IdentityState> RefreshIdentityAsync()
    {
        IdentityState state = null;
        //get your identity and set the state
        return state;
    }
}
```

## ログインマップの更新 (Android および iOS のみ)
<a name="updating-the-logins-map"></a>

### Android
<a name="updating-logins-map-1.android"></a>

ご使用の認証システムでユーザーが正常に認証されたら、デベロッパープロバイダー名と開発ユーザー ID を使用してログインマップを更新します。これは、認証システム内のユーザーを一意に識別する英数字の文字列です。`refresh` が変更されている可能性があるため、ログインマップを更新した後は、必ず `identityId` メソッドを呼び出してください。

```
HashMap<String, String> loginsMap = new HashMap<String, String>();
loginsMap.put(developerAuthenticationProvider.getProviderName(), developerUserIdentifier);

credentialsProvider.setLogins(loginsMap);
credentialsProvider.refresh();
```

### iOS - Objective-C
<a name="updating-logins-map-1.ios-objc"></a>

認証情報がないか、または期限切れ場合、iOS SDK は `logins` メソッドを呼び出して最新のログインマップを取得するのみです。SDK で新しい認証情報の入手を強制する場合は (たとえば、エンドユーザーが認証されていない状態から認証され、認証されたユーザーに対して認証情報を必要とするなど)、`clearCredentials` で `credentialsProvider` を呼び出します。

```
[credentialsProvider clearCredentials];
```

### iOS - Swift
<a name="updating-logins-map-1.ios-swift"></a>

認証情報がないか、または期限切れ場合、iOS SDK は `logins` メソッドを呼び出して最新のログインマップを取得するのみです。SDK で新しい認証情報の入手を強制する場合は (たとえば、エンドユーザーが認証されていない状態から認証され、認証されたユーザーに対して認証情報を必要とするなど)、`clearCredentials` で `credentialsProvider` を呼び出します。

```
credentialsProvider.clearCredentials()
```

## トークンの取得 (サーバー)
<a name="getting-a-token-server-side"></a>

[GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) を呼び出してトークンを取得します。この API は、 AWS 開発者認証情報を使用してバックエンドから呼び出す必要があります。クライアント SDK から呼び出すことはできません。API は Cognito アイデンティティプール ID (ID プロバイダー名をキーとして、識別子を値として含むログインマップ) と、オプションで Cognito アイデンティティ ID (認証されていないユーザーを認証する場合など) を受け取ります。識別子はユーザーのユーザー名、メールアドレス、または数値の場合があります。API は、ユーザーの一意の Cognito ID と、エンドユーザーの OpenID Connect トークンを使用して呼び出しに応答します。

`GetOpenIdTokenForDeveloperIdentity` によって返されるトークンについては、以下の点に注意してください。
+ トークンのカスタムの有効期限を指定して、トークンをキャッシュすることができます。カスタムの有効期限を指定しない場合、トークンは 15 分間有効です。
+ 設定できる最大のトークンの期間は 24 時間です。
+ トークンの期間を増やすことによるセキュリティへの影響について注意してください。攻撃者がこのトークンを取得した場合、そのトークンをエンドユーザーの AWS 認証情報とトークン期間交換できます。

以下の Java スニペットは、Amazon Cognito クライアントを初期化して、デベロッパーが認証したアイデンティティのトークンを取得する方法を示しています。

```
// authenticate your end user as appropriate
// ....

// if authenticated, initialize a cognito client with your AWS developer credentials
AmazonCognitoIdentity identityClient = new AmazonCognitoIdentityClient(
  new BasicAWSCredentials("access_key_id", "secret_access_key")
);

// create a new request to retrieve the token for your end user
GetOpenIdTokenForDeveloperIdentityRequest request =
  new GetOpenIdTokenForDeveloperIdentityRequest();
request.setIdentityPoolId("YOUR_COGNITO_IDENTITY_POOL_ID");

request.setIdentityId("YOUR_COGNITO_IDENTITY_ID"); //optional, set this if your client has an
                                                   //identity ID that you want to link to this 
                                                   //developer account

// set up your logins map with the username of your end user
HashMap<String,String> logins = new HashMap<>();
logins.put("YOUR_IDENTITY_PROVIDER_NAME","YOUR_END_USER_IDENTIFIER");
request.setLogins(logins);

// optionally set token duration (in seconds)
request.setTokenDuration(60 * 15l);
GetOpenIdTokenForDeveloperIdentityResult response =
  identityClient.getOpenIdTokenForDeveloperIdentity(request);

// obtain identity id and token to return to your client
String identityId = response.getIdentityId();
String token = response.getToken();

//code to return identity id and token to client
//...
```

前述の手順に従って、アプリでデベロッパーが認証したアイデンティティを統合できます。問題またはご質問がある場合は、お気軽に[フォーラム](https://forums.aws.amazon.com/forum.jspa?forumID=173)に投稿してください。

## 既存のソーシャル ID への接続
<a name="connect-to-an-existing-social-identity"></a>

デベロッパーが認証したアイデンティティを使用する際のプロバイダーのすべてのリンク作成は、バックエンドから行う必要があります。ユーザーのソーシャル ID (Login with Amazon、「Apple でサインイン」、Facebook、または Google) にカスタム ID を接続するには、[GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) を呼び出すときに、ログインマップに ID プロバイダーのトークンを追加します。これを可能にするため、クライアント SDK からバックエンドを呼び出してエンドユーザーを認証するときは、エンドユーザーのソーシャルプロバイダートークンを追加で渡します。

たとえば、カスタム ID の Facebook へのリンクを試みている場合、`GetOpenIdTokenForDeveloperIdentity` を呼び出すときに、ID プロバイダー ID に加えて Facebook のトークンをログインマップに追加します。

```
logins.put("YOUR_IDENTITY_PROVIDER_NAME","YOUR_END_USER_IDENTIFIER");
logins.put("graph.facebook.com","END_USERS_FACEBOOK_ACCESSTOKEN");
```

## プロバイダー間の移行のサポート
<a name="supporting-transition-between-providers"></a>

### Android
<a name="support-transition-between-providers-1.android"></a>

アプリケーションでは、デベロッパーが認証したアイデンティティとともに、パブリックプロバイダー (Login with Amazon、「Apple でサインイン」、Facebook、または Google) を使用した、認証されていないアイデンティティまたは認証されたアイデンティティのサポートが必要になる場合があります。デベロッパーが認証したアイデンティティとその他のアイデンティティ (認証されていないアイデンティティと、パブリックプロバイダーを使用して認証されたアイデンティティ) の重要な違いは、identityId およびトークンの取得方法にあります。他のアイデンティティについては、モバイルアプリケーションが認証システムに接続する代わりに Amazon Cognito と直接やり取りします。そのため、モバイルアプリケーションは、アプリユーザーが行った選択に基づいて、2 つの明確の流れをサポートできる必要があります。そのためには、カスタム ID プロバイダーにいくつか変更を加える必要があります。

`refresh` メソッドはログインマップをチェックします。マップが空でなくデベロッパープロバイダー名を含むキーがある場合は、バックエンドを呼び出します。それ以外の場合は、getIdentityId メソッドを呼び出して NULL を返します。

```
public String refresh() {

   setToken(null);

   // If the logins map is not empty make a call to your backend
   // to get the token and identityId
   if (getProviderName() != null &&
      !this.loginsMap.isEmpty() &&
      this.loginsMap.containsKey(getProviderName())) {

      /**
       * This is where you would call your backend
       **/

      // now set the returned identity id and token in the provider
      update(identityId, token);
      return token;

   } else {
      // Call getIdentityId method and return null
      this.getIdentityId();
      return null;
   }
}
```

同様に、`getIdentityId` メソッドにも、ログインマップの内容に応じて 2 つのフローがあります。

```
public String getIdentityId() {

   // Load the identityId from the cache
   identityId = cachedIdentityId;

   if (identityId == null) {

      // If the logins map is not empty make a call to your backend
      // to get the token and identityId

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

         /**
           * This is where you would call your backend
          **/

         // now set the returned identity id and token in the provider
         update(identityId, token);
         return token;

      } else {
         // Otherwise call &COG; using getIdentityId of super class
         return super.getIdentityId();
      }

   } else {
      return identityId;
   }

}
```

### iOS - Objective-C
<a name="support-transition-between-providers-1.ios-objc"></a>

アプリケーションでは、デベロッパーが認証したアイデンティティとともに、パブリックプロバイダー (Login with Amazon、「Apple でサインイン」、Facebook、または Google) を使用した、認証されていないアイデンティティまたは認証されたアイデンティティのサポートが必要になる場合があります。これを行うには、[AWSCognitoCredentialsProviderHelper](https://github.com/aws-amplify/aws-sdk-ios)`logins` メソッドをオーバーライドし、現在の ID プロバイダーに基づいて正しいログインマップを返せるようにします。この例では、非認証、Facebook 認証、デベロッパー認証を切り替える方法を示しています。

```
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    if(/*logic to determine if user is unauthenticated*/) {
        return [AWSTask taskWithResult:nil];
    }else if (/*logic to determine if user is Facebook*/){
        return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : [FBSDKAccessToken currentAccessToken] }];
    }else {
        return [super logins];
    }
}
```

非認証から認証に移行するときは、`[credentialsProvider clearCredentials];` を呼び出して、認証された新しい認証情報の取得を SDK に強制します。2 つの認証されたプロバイダーを切り替え、2 つのプロバイダーへのリンクを試みない (ログインディクショナリで複数のプロバイダー用のトークンを提供していない) 場合は、`[credentialsProvider clearKeychain];` を呼び出します。これにより、認証情報とアイデンティティの両方がクリアされ、SDK は新しい認証を取得します。

### iOS - Swift
<a name="support-transition-between-providers-1.ios-swift"></a>

アプリケーションでは、デベロッパーが認証したアイデンティティとともに、パブリックプロバイダー (Login with Amazon、「Apple でサインイン」、Facebook、または Google) を使用した、認証されていないアイデンティティまたは認証されたアイデンティティのサポートが必要になる場合があります。これを行うには、[AWSCognitoCredentialsProviderHelper](https://github.com/aws-amplify/aws-sdk-ios)`logins` メソッドをオーバーライドし、現在の ID プロバイダーに基づいて正しいログインマップを返せるようにします。この例では、非認証、Facebook 認証、デベロッパー認証を切り替える方法を示しています。

```
override func logins () -> AWSTask<NSDictionary> {
    if(/*logic to determine if user is unauthenticated*/) {
        return AWSTask(result:nil)
    }else if (/*logic to determine if user is Facebook*/){
        if let token = AccessToken.current?.authenticationToken {
            return AWSTask(result: [AWSIdentityProviderFacebook:token])
        }
        return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"]))
    }else {
        return super.logins()
    }
}
```

非認証から認証に移行するときは、`credentialsProvider.clearCredentials()` を呼び出して、認証された新しい認証情報の取得を SDK に強制します。2 つの認証されたプロバイダーを切り替え、2 つのプロバイダーへのリンクを試みない (ログインディクショナリで複数のプロバイダー用のトークンを提供していない) 場合は、`credentialsProvider.clearKeychain()` を呼び出します。これにより、認証情報とアイデンティティの両方がクリアされ、SDK は新しい認証を取得します。

### Unity
<a name="support-transition-between-providers-1.unity"></a>

アプリケーションでは、デベロッパーが認証したアイデンティティとともに、パブリックプロバイダー (Login with Amazon、「Apple でサインイン」、Facebook、または Google) を使用した、認証されていないアイデンティティまたは認証されたアイデンティティのサポートが必要になる場合があります。デベロッパーが認証したアイデンティティとその他のアイデンティティ (認証されていないアイデンティティと、パブリックプロバイダーを使用して認証されたアイデンティティ) の重要な違いは、identityId およびトークンの取得方法にあります。他のアイデンティティについては、モバイルアプリケーションが認証システムに接続する代わりに Amazon Cognito と直接やり取りします。モバイルアプリケーションは、アプリユーザーが行った選択に基づいて、2 つの明確の流れをサポートできる必要があります。そのためには、カスタム ID プロバイダーにいくつか変更を加える必要があります。

Unity でこれを行うための推奨の方法は、AbstractCognitoIdentityProvider の代わりに AmazonCognitoEnhancedIdentityProvide から ID プロバイダーを拡張し、独自のメソッドの代わりに親 RefreshAsync メソッドを呼び出すことです (ユーザーが独自のバックエンドで認証されない場合)。ユーザーが認証されている場合、前に説明したのと同じ流れを使用できます。

### Xamarin
<a name="support-transition-between-providers-1.xamarin"></a>

アプリケーションでは、デベロッパーが認証したアイデンティティとともに、パブリックプロバイダー (Login with Amazon、「Apple でサインイン」、Facebook、または Google) を使用した、認証されていないアイデンティティまたは認証されたアイデンティティのサポートが必要になる場合があります。デベロッパーが認証したアイデンティティとその他のアイデンティティ (認証されていないアイデンティティと、パブリックプロバイダーを使用して認証されたアイデンティティ) の重要な違いは、identityId およびトークンの取得方法にあります。他のアイデンティティについては、モバイルアプリケーションが認証システムに接続する代わりに Amazon Cognito と直接やり取りします。モバイルアプリケーションは、アプリユーザーが行った選択に基づいて、2 つの明確の流れをサポートできる必要があります。そのためには、カスタム ID プロバイダーにいくつか変更を加える必要があります。