

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

# アイデンティティプール IdP として Facebook を設定する
<a name="facebook"></a>

Amazon Cognito アイデンティティプールは、アプリケーションユーザーにフェデレーション方式の認証を提供するために Facebook と連携します。このセクションでは、IdP として Facebook に対してアプリケーションを登録し、セットアップする方法について説明します。

## Facebook のセットアップ
<a name="set-up-facebook"></a>

Facebook ユーザーを認証し、Facebook API と統合するには、事前にアプリケーションを Facebook に登録します。

[Facebook デベロッパーポータル](https://developers.facebook.com/)は、アプリケーションのセットアップに役立ちます。Amazon Cognito アイデンティティプールに Facebook を統合する前に、次の手順を実行してください。

**注記**  
Amazon Cognito アイデンティティプールフェデレーションは、[Facebook の制限付きログイン](https://developers.facebook.com/docs/facebook-login/limited-login)と互換性がありません。限定ログインのアクセス許可セットを超えないように iOS 用の Facebook ログインを設定する方法の詳細については、「*Meta for Developers*」の「[Facebook Login for iOS - Quickstart](https://developers.facebook.com/docs/facebook-login/ios)」を参照してください。

**Facebook のセットアップ**

1. [Facebook デベロッパーポータル](https://developers.facebook.com/)で、Facebook 認証情報を使用してログインします。

1. **アプリ** メニューの **Add a New App (新しいアプリを追加する)**を選択します。

1. プラットフォームを選択し、クイックスタートプロセスを完了します。

### Android
<a name="set-up-facebook-1.android"></a>

Android アプリと Facebook ログインとの統合に関する詳細情報については、[Facebook 入門ガイド](https://developers.facebook.com/docs/android/getting-started)を参照してください。

### iOS - Objective-C
<a name="set-up-facebook-1.ios-objc"></a>

iOS Objective-C アプリと Facebook ログインとの統合に関する詳細情報については、[Facebook 入門ガイド](https://developers.facebook.com/docs/ios/getting-started/)を参照してください。

### iOS - Swift
<a name="set-up-facebook-1.ios-swift"></a>

iOS Swift アプリと Facebook ログインとの統合に関する詳細情報については、[Facebook 入門ガイド](https://developers.facebook.com/docs/ios/getting-started/)を参照してください。

### JavaScript
<a name="set-up-facebook-1.javascript"></a>

JavaScript ウェブアプリと Facebook ログインとの統合に関する詳細情報については、[Facebook 入門ガイド](https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.3)を参照してください。

## Amazon Cognito アイデンティティプールコンソールでアイデンティティプロバイダーを設定する
<a name="configure-the-external-provider-in-the-amazon-cognito-console"></a>

以下の手順を使用して、ID プロバイダーを設定します。

**Facebook ID プロバイダー (IdP) を追加するには**

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

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

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

1. [**Facebook**] を選択します。

1. [Meta for Developers](https://developers.facebook.com/) で作成した OAuth プロジェクトの**アプリ ID** を入力します。詳細については、*Meta for Developers ドキュメント*の「[Facebook ログイン](https://developers.facebook.com/docs/facebook-login/)」を参照してください。

1. Amazon Cognito がこのプロバイダーで認証されたユーザーに認証情報を発行するときにリクエストするロールを設定するには、[**ロール設定**] を設定します。

   1. その IdP のユーザーに、**認証済みロール**を設定したときに設定した**デフォルトロール**を割り当てることも、**ルール付きのロールを選択**することもできます。

     1. **[ルールを使用してロールを選択]** を選択した場合は、ユーザー認証のソース**クレーム**、クレームを比較する**演算子**、選択したロールと一致させる**値**、および**ロールの割り当て**が一致したときに割り当てる**ロール**を入力します。別の条件に基づいて追加のルールを作成するには、**[別のものを追加]** を選択します。

     1. **[ロールの解決]** を選択します。ユーザーのクレームがルールに合わない場合は、認証情報を拒否するか、**認証済みロール**の認証情報を発行できます。

1. Amazon Cognito がこのプロバイダーで認証されたユーザーに認証情報を発行するときに割り当てるプリンシパルタグを変更するには、**[アクセスコントロールの属性]** を設定します。

   1. プリンシパルタグを適用しない場合は、**[非アクティブ]** を選択します。

   1. `sub` および `aud` クレームに基づいてプリンシパルタグを適用するには、**[デフォルトマッピングを使用]** を選択します。

   1. プリンシパルタグへの属性の独自のカスタムスキーマを作成するには、**[カスタムマッピングを使用]** を選択します。次に、タグに表示したい各**クレーム**から取得する**タグキー**を入力します。

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

## Facebook の使用
<a name="using-facebook"></a>

### Android
<a name="using-facebook-1.android"></a>

Facebook 認証を追加するには、まず [Facebook ガイド](https://developers.facebook.com/docs/android)に従って、アプリケーションに Facebook SDK を統合します。次に、[**[Login with Facebook]** ボタン](https://developers.facebook.com/docs/facebook-login/android)を Android ユーザーインターフェイスに追加します。Facebook SDK は、その状態の追跡にセッションオブジェクトを使用します。Amazon Cognito は、このセッションオブジェクトのアクセストークンを使用してユーザーを認証し、一意の識別子を生成し、必要に応じてユーザーに他の AWS リソースへのアクセスを許可します。

Facebook SDK でユーザーを認証したら、Amazon Cognito 認証情報プロバイダーにセッショントークンを追加します。

Facebook SDK 4.0 以降:

```
Map<String, String> logins = new HashMap<String, String>();
logins.put("graph.facebook.com", AccessToken.getCurrentAccessToken().getToken());
credentialsProvider.setLogins(logins);
```

Facebook SDK 4.0 以前:

```
Map<String, String> logins = new HashMap<String, String>();
logins.put("graph.facebook.com", Session.getActiveSession().getAccessToken());
credentialsProvider.setLogins(logins);
```

Facebook ログインプロセスにより、その SDK でシングルトンセッションが初期化されます。Facebook セッションオブジェクトには、Amazon Cognito が認証されたエンドユーザーの AWS 認証情報を生成するために使用する OAuth トークンが含まれています。Amazon Cognito は、この特定の Facebook アイデンティティに一致するユーザーの存在についてユーザーデータベースをチェックするためにもこのトークンを使用します。既にユーザーに存在する場合、API は既存の ID を返します。それ以外の場合、API は新しい ID を返します。クライアント SDK は、ローカルデバイスで ID を自動的にキャッシュします。

**注記**  
ログインマップを設定したら、 `refresh`または を呼び出し`get`て AWS 認証情報を取得します。

### iOS - Objective-C
<a name="using-facebook-1.ios-objc"></a>

Facebook 認証を追加するには、まず [Facebook ガイド](https://developers.facebook.com/docs/ios)に従って、アプリケーションに Facebook SDK を統合します。次に、[[Login with Facebook (Facebook でログイン)](https://developers.facebook.com/docs/facebook-login/ios)] ボタンを ユーザーインターフェイスに追加します。Facebook SDK は、その状態の追跡にセッションオブジェクトを使用します。Amazon Cognito は、このセッションオブジェクトからのアクセストークンを使用してユーザーを認証し、一意の Amazon Cognito ID プール (フェデレーティッド ID) にバインドします。

Amazon Cognito に Facebook アクセストークンを提供するには、[https://github.com/aws-amplify/aws-sdk-ios](https://github.com/aws-amplify/aws-sdk-ios) プロトコルを実装します。

`logins` メソッドを実装するときは、`AWSIdentityProviderFacebook` を含むディクショナリを返します。以下のコード例にあるように、このディクショナリはキーとして機能し、認証された Facebook ユーザーからの現在のアクセストークンが値として機能します。

```
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    FBSDKAccessToken* fbToken = [FBSDKAccessToken currentAccessToken];
    if(fbToken){
        NSString *token = fbToken.tokenString;
        return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : token }];
    }else{
            return [AWSTask taskWithError:[NSError errorWithDomain:@"Facebook Login"
                                                          code:-1
                                                      userInfo:@{@"error":@"No current Facebook access token"}]];
    }
}
```

`AWSCognitoCredentialsProvider` をインスタンス化するときに、コンストラクターで `AWSIdentityProviderManager` の値として `identityProviderManager` を実装するクラスを渡します。詳細については、[AWSCognitoCredentialsProvider](https://github.com/aws-amplify/aws-sdk-ios) リファレンスページに移動し、**initWithRegionType:identityPoolId:identityProviderManager** を選択してください。

### iOS - Swift
<a name="using-facebook-1.ios-swift"></a>

Facebook 認証を追加するには、まず [Facebook ガイド](https://developers.facebook.com/docs/ios)に従って、アプリケーションに Facebook SDK を統合します。次に、[[Login with Facebook (Facebook でログイン)](https://developers.facebook.com/docs/facebook-login/ios)] ボタンを ユーザーインターフェイスに追加します。Facebook SDK は、その状態の追跡にセッションオブジェクトを使用します。Amazon Cognito は、このセッションオブジェクトからのアクセストークンを使用してユーザーを認証し、一意の Amazon Cognito ID プール (フェデレーティッド ID) にバインドします。

**注記**  
Amazon Cognito アイデンティティプールフェデレーションは、[Facebook の制限付きログイン](https://developers.facebook.com/docs/facebook-login/limited-login)と互換性がありません。限定ログインのアクセス許可セットを超えないように iOS 用の Facebook ログインを設定する方法の詳細については、「*Meta for Developers*」の「[Facebook Login for iOS - Quickstart](https://developers.facebook.com/docs/facebook-login/ios)」を参照してください。

Amazon Cognito に Facebook アクセストークンを提供するには、[https://github.com/aws-amplify/aws-sdk-ios](https://github.com/aws-amplify/aws-sdk-ios) プロトコルを実装します。

`logins` メソッドを実装するときは、`AWSIdentityProviderFacebook` を含むディクショナリを返します。以下のコード例にあるように、このディクショナリはキーとして機能し、認証された Facebook ユーザーからの現在のアクセストークンが値として機能します。

```
class FacebookProvider: NSObject, AWSIdentityProviderManager {
    func logins() -> AWSTask<NSDictionary> {
        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"]))
    }
}
```

`AWSCognitoCredentialsProvider` をインスタンス化するときに、コンストラクターで `AWSIdentityProviderManager` の値として `identityProviderManager` を実装するクラスを渡します。詳細については、[https://github.com/aws-amplify/aws-sdk-ios](https://github.com/aws-amplify/aws-sdk-ios) リファレンスページに移動し、**initWithRegionType:identityPoolId:identityProviderManager** を選択してください。

### JavaScript
<a name="using-facebook-1.javascript"></a>

Facebook 認証を追加するには、「[ウェブ用の Facebook ログイン](https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.3)」に従って、ウェブサイトに「**Facebook でログイン**」ボタンを追加します。Facebook SDK は、その状態の追跡にセッションオブジェクトを使用します。Amazon Cognito は、このセッションオブジェクトのアクセストークンを使用してユーザーを認証し、一意の識別子を生成し、必要に応じてユーザーに他の AWS リソースへのアクセスを許可します。

Facebook SDK でユーザーを認証したら、Amazon Cognito 認証情報プロバイダーにセッショントークンを追加します。

```
FB.login(function (response) {

  // Check if the user logged in successfully.
  if (response.authResponse) {

    console.log('You are now logged in.');

    // Add the Facebook access token to the Amazon Cognito credentials login map.
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      IdentityPoolId: 'IDENTITY_POOL_ID',
      Logins: {
        'graph.facebook.com': response.authResponse.accessToken
      }
    });

    // Obtain AWS credentials
    AWS.config.credentials.get(function(){
        // Access AWS resources here.
    });

  } else {
    console.log('There was a problem logging you in.');
  }

});
```

Facebook SDK は、Amazon Cognito が認証されたエンドユーザーの AWS 認証情報を生成するために使用する OAuth トークンを取得します。Amazon Cognito は、この特定の Facebook アイデンティティに一致するユーザーの存在についてユーザーデータベースをチェックするためにもこのトークンを使用します。既にユーザーに存在する場合、API は既存の ID を返します。それ以外の場合、新しい ID が返されます。ID はローカルデバイスでクライアント SDK によって自動的にキャッシュされます。

**注記**  
ログインマップを設定した後、`refresh` または `get` を呼び出して、認証情報を取得します。コード例については、[JavaScript の README ファイル](https://github.com/amazon-archives/amazon-cognito-identity-js/blob/master/README.md)の「ユースケース 17: ユーザープールと Cognito ID の統合」を参照してください。

### Unity
<a name="using-facebook-1.unity"></a>

Facebook 認証を追加するには、まず [Facebook ガイド](https://developers.facebook.com/docs/unity)に従って、アプリケーションに Facebook SDK を統合します。Amazon Cognito は `FB` オブジェクトからの Facebook アクセストークンを使用して、Amazon Cognito アイデンティティに関連付けられた一意のユーザー 識別子を生成します。

Facebook SDK でユーザーを認証したら、Amazon Cognito 認証情報プロバイダーにセッショントークンを追加します。

```
void Start()
{
    FB.Init(delegate() {
        if (FB.IsLoggedIn) { //User already logged in from a previous session
            AddFacebookTokenToCognito();
        } else {
            FB.Login ("email", FacebookLoginCallback);
        }
    });
}

void FacebookLoginCallback(FBResult result)
{
    if (FB.IsLoggedIn)
    {
        AddFacebookTokenToCognito();
    }
    else
    {
        Debug.Log("FB Login error");
    }
}

void AddFacebookTokenToCognito()
{
    credentials.AddLogin ("graph.facebook.com", AccessToken.CurrentAccessToken.TokenString);
}
```

`FB.AccessToken` を使用する前に、`FB.Login()` を呼び出し、`FB.IsLoggedIn` が true であることを確認してください。

### Xamarin
<a name="using-facebook-1.xamarin"></a>

**Xamarin for Android:**

```
public void InitializeFacebook() {
    FacebookSdk.SdkInitialize(this.ApplicationContext);
    callbackManager = CallbackManagerFactory.Create();
    LoginManager.Instance.RegisterCallback(callbackManager, new FacebookCallback &lt; LoginResult &gt; () {
      HandleSuccess = loginResult = &gt; {
        var accessToken = loginResult.AccessToken;
        credentials.AddLogin("graph.facebook.com", accessToken.Token);
        //open new activity
      },
      HandleCancel = () = &gt; {
        //throw error message
      },
      HandleError = loginError = &gt; {
        //throw error message
      }
    });
    LoginManager.Instance.LogInWithReadPermissions(this, new List &lt; string &gt; {
      "public_profile"
    });
  }
```

**Xamarin for iOS:**

```
public void InitializeFacebook() {
  LoginManager login = new LoginManager();
  login.LogInWithReadPermissions(readPermissions.ToArray(), delegate(LoginManagerLoginResult result, NSError error) {
    if (error != null) {
      //throw error message
    } else if (result.IsCancelled) {
      //throw error message
    } else {
      var accessToken = loginResult.AccessToken;
      credentials.AddLogin("graph.facebook.com", accessToken.Token);
      //open new view controller
    }
  });
}
```