

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 Facebook 設定為身分集區 IdP
<a name="facebook"></a>

Amazon Cognito 身分集區可與 Facebook 搭配使用，為您的應用程式使用者提供聯合身分驗證。本節說明如何使用 Facebook 做為 IdP 來註冊及設定您的應用程式。

## 設定 Facebook
<a name="set-up-facebook"></a>

請先向 Facebook 註冊您的應用程式，再驗證 Facebook 使用者，並與 Facebook API 互動。

[Facebook 開發人員入口網站](https://developers.facebook.com/)可幫助您設定應用程式。您在 Amazon Cognito 身分集區中整合 Facebook 之前，請先執行此操作程序：

**注意**  
Amazon Cognito 身分集區聯合與 [Facebook Limited Login](https://developers.facebook.com/docs/facebook-login/limited-login) 不相容。如需如何設定適用於 iOS 的 Facebook Login 而不超過有限登入許可集的詳細資訊，請參閱適用於 [iOS 的 Facebook Login - 開發人員的 Meta 快速入門](https://developers.facebook.com/docs/facebook-login/ios)。 **

**設定 Facebook**

1. 在 [Facebook 開發人員入口網站](https://developers.facebook.com/)中，使用您的 Facebook 登入資料來登入。

1. 從 **Apps (應用程式)** 功能表中，選取 **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 Web 應用程式與 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>

使用下列程序設定您的身分提供者。

**若要新增 Facebook 身分提供者 (IdP)**

1. 從 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)選擇 **身分池**。選取身分池。

1. 選擇 **使用者存取權** 索引標籤。

1. 選取 **新增身分供應商**。

1. 選擇 **Facebook**。

1. 輸入您在[開發人員中繼資料](https://developers.facebook.com/)中建立的 OAuth 專案**應用程式 ID**。如需詳細資訊，請參閱開發人員文件中繼資料中的 [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 軟體開發套件整合至您的應用程式中。然後，新增 [**Login with Facebook** (使用 Facebook 登入) 按鈕](https://developers.facebook.com/docs/facebook-login/android)至您的 Android 使用者界面。Facebook 軟體開發套件會使用工作階段物件來追蹤其狀態。Amazon Cognito 使用此工作階段物件的存取權杖來驗證使用者、產生唯一識別符，並視需要授予使用者對其他 AWS 資源的存取權。

使用 Facebook 軟體開發套件來驗證您的使用者之後，請將工作階段權杖新增至 Amazon Cognito 憑證供應商。

Facebook 軟體開發套件 4.0 或更新版本：

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

4.0 之前的 Facebook 軟體開發套件：

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

Facebook 登入程序會在其軟體開發套件中初始化單一工作階段。Facebook 工作階段物件包含 OAuth 權杖，Amazon Cognito 會使用此權杖來為已驗證的最終使用者產生 AWS 登入資料。Amazon Cognito 也會使用權杖來檢查您的使用者資料庫中是否有符合此特定 Facebook 身分的使用者存在。如果該使用者已存在，API 會傳回現有的識別符，否則，API 會傳回新的識別符。用戶端開發套件會自動將識別符快取在本機裝置上。

**注意**  
設定登入映射後，呼叫 `refresh`或 `get` 以擷取 AWS 登入資料。

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

若要新增 Facebook 身分驗證，請先遵循 [Facebook 指南](https://developers.facebook.com/docs/ios)，並將 Facebook 軟體開發套件整合至您的應用程式中。然後，將 [Login with Facebook (使用 Facebook 登入) 按鈕](https://developers.facebook.com/docs/facebook-login/ios)新增至您的使用者界面。Facebook 軟體開發套件會使用工作階段物件來追蹤其狀態。Amazon Cognito 會使用來自此工作階段物件的存取權杖進行使用者身分驗證，並將其繫結至唯一 Amazon Cognito 身分集區 (聯合身分)。

若要提供 Facebook 存取權杖給 Amazon Cognito，請實作 [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 軟體開發套件整合至您的應用程式中。然後，將 [Login with Facebook (使用 Facebook 登入) 按鈕](https://developers.facebook.com/docs/facebook-login/ios)新增至您的使用者界面。Facebook 軟體開發套件會使用工作階段物件來追蹤其狀態。Amazon Cognito 會使用來自此工作階段物件的存取權杖進行使用者身分驗證，並將其繫結至唯一 Amazon Cognito 身分集區 (聯合身分)。

**注意**  
Amazon Cognito 身分集區聯合與 [Facebook Limited Login](https://developers.facebook.com/docs/facebook-login/limited-login) 不相容。如需如何設定適用於 iOS 的 Facebook Login 而不超過有限登入許可集的詳細資訊，請參閱適用於 [iOS 的 Facebook Login - 開發人員的 Meta 快速入門](https://developers.facebook.com/docs/facebook-login/ios)。 **

若要提供 Facebook 存取權杖給 Amazon Cognito，請實作 [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)，在您的網站上新增 **Login with Facebook** (使用 Facebook 登入) 按鈕。Facebook 軟體開發套件會使用工作階段物件來追蹤其狀態。Amazon Cognito 使用此工作階段物件的存取權杖來驗證使用者、產生唯一識別符，並視需要授予使用者對其他 AWS 資源的存取權。

使用 Facebook 軟體開發套件來驗證您的使用者之後，請將工作階段權杖新增至 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 會傳回現有的識別符，否則就會傳回新的識別符。用戶端軟體開發套件會自動將識別符快取在本機裝置上。

**注意**  
設定登入對應之後，必須發出 `refresh` 或 `get` 呼叫，以取得憑證。如需程式碼範例，請參閱 [JavaScript README 檔案](https://github.com/amazon-archives/amazon-cognito-identity-js/blob/master/README.md)中的「使用案例 17：將使用者集區與 Cognito 身分整合」。

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

若要新增 Facebook 身分驗證，請先遵循 [Facebook 指南](https://developers.facebook.com/docs/unity)，並將 Facebook 軟體開發套件整合至您的應用程式中。Amazon Cognito 會使用來自 `FB` 物件的 Facebook 存取權杖，產生與 Amazon Cognito 身分相關聯的唯一使用者識別符。

使用 Facebook 軟體開發套件來驗證您的使用者之後，請將工作階段權杖新增至 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>

**適用於 Android 的 Xamarin：**

```
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"
    });
  }
```

**適用於 iOS 的 Xamarin：**

```
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
    }
  });
}
```