

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

# 身分集區第三方身分提供者
<a name="external-identity-providers"></a>

透過 Amazon Cognito 身分集區，您可以與各種外部身分提供者 (IdPs) 整合，以在應用程式中透過聯合身分驗證提供臨時 AWS 憑證。透過設定您的身分集區以使用這些外部 IdPs，您可以透過 Amazon Cognito 使用者集區、社交提供者、OIDC 提供者或 SAML 提供者進行身分驗證，為您的使用者授權存取後端 AWS 資源。本節涵蓋設定 IdPs 並將其與您的 Amazon Cognito 身分集區整合的步驟。

使用 `logins` 屬性，您便可設定從身分提供者 (IdP).收到的憑證。您也可以將身分集區與多個 IdPs建立關聯。例如，您可以在 `logins` 屬性中同時設定 Facebook 和 Google 權杖，以將唯一 Amazon Cognito 身分與這兩個 IdP 登入都建立關聯。使用者可以使用帳戶進行身分驗證，但 Amazon Cognito 會傳回相同的使用者識別符。

下列指示將引導您使用 Amazon Cognito 身分池支援的 IdP 進行身分驗證。

**Topics**
+ [將 Facebook 設定為身分集區 IdP](facebook.md)
+ [將 Login with Amazon 設定為身分集區 IdP](amazon.md)
+ [將 Google 設定為身分集區 IdP](google.md)
+ [設定使用 Apple 登入做為身分集區 IdP](apple.md)
+ [將 OIDC 供應商設定為身分集區 IdP](open-id.md)
+ [將 SAML 供應商設定為身分集區 IdP](saml-identity-provider.md)

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

# 將 Login with Amazon 設定為身分集區 IdP
<a name="amazon"></a>

Amazon Cognito 身分集區可與 Login with Amazon 搭配使用，為您的行動和 Web 應用程式使用者提供聯合身分驗證。本節說明如何使用登入 Amazon 做為身分提供者 (IdP) 來註冊及設定您的應用程式。

設定登入 Amazon 以使用[開發人員入口網站](https://developer.amazon.com/login-with-amazon)中的 Amazon Cognito。如需詳細資訊，請參閱登入 Amazon 常見問答集中的[設定登入 Amazon](https://developer.amazon.com/docs/login-with-amazon/faq.html#setting-up-login-with-amazon)。

**注意**  
若要將登入 Amazon 整合至 Xamarin 應用程式，請遵循 [Xamarin 入門指南](https://developer.xamarin.com/guides/cross-platform/getting_started/)。

**注意**  
您原本就無法在 Unity 平台上整合登入 Amazon。請改用 Web 檢視，然後進行瀏覽器登入流程。

## 設定登入 Amazon
<a name="login-with-amazon-setup"></a>

**實作 Login with Amazon**

在 [Amazon 開發人員入口網站](https://developer.amazon.com/apps-and-games/login-with-amazon)中，您可以設定 OAuth 應用程式以與您的身分集區整合、尋找登入 Amazon 文件，並下載開發套件。選擇 **Developer console** (開發人員主控台)，然後選擇開發人員入口網站中的 **Login with Amazon** (登入 Amazon)。您可以為您的應用程式建立安全性描述檔，然後在您的應用程式中建置登入 Amazon 身分驗證機制。請參閱 [取得憑證](getting-credentials.md) 以取得如何將登入 Amazon 身分驗證與應用程式整合的詳細資訊。

Amazon 為您的新安全性描述檔核發 OAuth 2.0 **用戶端 ID**。您可以在安全性描述檔的 **Web Settings** (Web 設定) 索引標籤上找到 **client ID** (用戶端 ID)。在您身分集區中登入 Amazon IdP 的**應用程式 ID**欄位中輸入**安全性設定檔 ID**。

**注意**  
在您身分集區中登入 Amazon IdP 的**應用程式 ID**欄位中輸入**安全性設定檔 ID**。這與使用**用戶端 ID** 的使用者集區不同。

## 在 Amazon Cognito 主控台中設定外部供應商
<a name="login-with-amazon-configure-provider"></a>

**若要新增使用 Amazon 登入身分提供者 (IdP)**

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

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

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

1. 選擇 **Login with Amazon**。

1. 輸入您在 [Login with Amazon](https://developer.amazon.com/apps-and-games/login-with-amazon) 中建立的 OAuth 專案 **應用程式 ID**。如需詳細資訊，請參閱 [Login with Amazon 說明文件](https://developer.amazon.com/docs/login-with-amazon/documentation-overview.html)。

1. 若要設定 Amazon Cognito 向已通過此提供者進行身分驗證的使用者發布憑證時的角色，請設定 **角色設定**。

   1. 您可以為該 IdP 使用者指派設定 **已驗證角色** 時的 **預設角色**，或您可以 **選擇具有規則的角色**。

     1. 如果您選擇 **使用規則選擇角色**，請輸入使用者身分驗證的 **宣告** 來源、比較宣告的 **操作員**、導致符合角色選擇的 **值**，以及當符合 **角色指派** 時您要指派的 **角色**。選取 **新增另一項** 以根據不同的條件建立其他規則。

     1. 選擇 **角色解析**。當您的使用者宣告與您的規則不符時，您可以拒絕憑證或向 **已驗證角色** 發出憑證。

1. 若要變更透過此提供者驗證使用者，Amazon Cognito 發布憑證時指派的主要索引標籤，請設定 **存取控制的屬性**。

   1. 若不套用主要索引標籤，請選擇 **非作用中**。

   1. 若要根據 `sub` 和 `aud` 宣告套用主要索引標籤，請選擇 **使用預設對應**。

   1. 若要建立您自己的自訂屬性結構描述至主要索引標籤，請選擇 **使用自訂對應**。然後，輸入您要從每個 **宣告** 中獲取的 **標籤金鑰**，顯示於索引標籤當中。

1. 選取**儲存變更**。

## 使用 Login with Amazon：Android
<a name="set-up-amazon-1.android"></a>

對 Amazon 登入進行身分驗證之後，您可以在 TokenListener 介面的 onSuccess 方法中，將權杖傳遞至 Amazon Cognito 憑證供應商。程式碼看起來像這樣：

```
@Override
public void onSuccess(Bundle response) {
    String token = response.getString(AuthzConstants.BUNDLE_KEY.TOKEN.val);
    Map<String, String> logins = new HashMap<String, String>();
    logins.put("www.amazon.com", token);
    credentialsProvider.setLogins(logins);
}
```

## 使用 Login with Amazon：iOS - Objective-C
<a name="set-up-amazon-1.ios-objc"></a>

對 Amazon 登入進行身分驗證之後，您可以在 AMZNAccessTokenDelegate 的 requestDidSucceed 方法中，將權杖傳遞給 Amazon Cognito 憑證供應商：

```
- (void)requestDidSucceed:(APIResult \*)apiResult {
    if (apiResult.api == kAPIAuthorizeUser) {
        [AIMobileLib getAccessTokenForScopes:[NSArray arrayWithObject:@"profile"] withOverrideParams:nil delegate:self];
    }
    else if (apiResult.api == kAPIGetAccessToken) {
        credentialsProvider.logins = @{ @(AWSCognitoLoginProviderKeyLoginWithAmazon): apiResult.result };
    }
}}
```

## 使用 Login with Amazon：iOS - Swift
<a name="set-up-amazon-1.ios-swift"></a>

對 Amazon 登入進行身分驗證之後，您可以在 `AMZNAccessTokenDelegate` 的 `requestDidSucceed` 方法中，將權杖傳遞給 Amazon Cognito 憑證供應商：

```
func requestDidSucceed(apiResult: APIResult!) {
    if apiResult.api == API.AuthorizeUser {
        AIMobileLib.getAccessTokenForScopes(["profile"], withOverrideParams: nil, delegate: self)
    } else if apiResult.api == API.GetAccessToken {
        credentialsProvider.logins = [AWSCognitoLoginProviderKey.LoginWithAmazon.rawValue: apiResult.result]
    }
}
```

## 使用 Login with Amazon：JavaScript
<a name="set-up-amazon-1.javascript"></a>

使用者以 Login with Amazon 進行驗證，並重新導向回您的網站之後，查詢字串中會提供 Login with Amazon access\$1token。請將該權杖傳遞至登入資料登入對應中。

```
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
   IdentityPoolId: 'IDENTITY_POOL_ID',
   Logins: {
       'www.amazon.com': 'Amazon Access Token'
   }
});
```

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

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

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

**注意**  
如果您的應用程式使用 Google 並且將可在多個行動平台上使用，則應將其設定為 [OpenID Connect 供應商](open-id.md)。將所有建立的用戶端 ID 新增為其他對象值，以便達到更佳的整合。若要進一步了解 Google 的跨用戶端身分模型，請參閱[跨用戶端身分](https://developers.google.com/accounts/docs/CrossClientAuth)。

**設定 Google**

若要啟用適用於 Android 的 Google 登入，請為應用程式建立 Google 開發人員主控台專案。

1. 前往 [Google 開發人員主控台](https://console.developers.google.com/)，並建立新的專案。

1. 選擇 **APIs & Services** (API 與服務)，然後選擇 **OAuth consent screen** (OAuth 同意畫面)。自訂當 Google 要求使用者同意將其設定檔資料與您的應用程式共享時，Google 要向使用者顯示的資訊。

1. 選擇 **Credentials** (憑證)，然後選擇 **Create credentials** (建立憑證)。選擇 **OAuth client ID** (OAuth 用戶端 ID)。選取 **Android** 做為 **Application type** (應用程式類型)。為開發應用程式所在的每個平台建立單獨的用戶端 ID。

1. 從 **Credentials** (憑證)，選擇 **Manage service accounts** (管理服務帳戶)。選擇 **Create service account** (建立服務帳戶)。輸入您的服務帳戶詳細資訊，然後選擇 **Create and continue** (建立並繼續)。

1. 將服務帳戶存取權授與您的專案。根據您應用程式的需求將服務帳戶的存取權授與使用者。

1. 選擇您的新服務帳戶，選擇 **Keys** (金鑰) 索引標籤，然後選擇 **Add key** (新增金鑰)。建立並下載新的 JSON 金鑰。

如需使用 Google 開發人員主控台的詳細資訊，請參閱 Google Cloud 文件中的[建立與管理專案](https://cloud.google.com/resource-manager/docs/creating-managing-projects)。

如需如何將 Google 整合到您的 Android 應用程式的詳細資訊，請參閱 Google Identity 文件中的[使用 Sign in with Google 驗證使用者](https://developer.android.com/identity/sign-in/credential-manager-siwg)。

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

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

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

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

1. 選擇 **Google**。

1. 輸入您在 [Google Cloud Platform](https://console.cloud.google.com/) 建立的 OAuth 專案 **用戶端 ID**。如需詳細資訊，請參閱《Google Cloud Platform 主控台幫助》中的[設定 OAuth 2.0](https://support.google.com/cloud/answer/6158849)。

1. 若要設定 Amazon Cognito 向已通過此提供者進行身分驗證的使用者發布憑證時的角色，請設定 **角色設定**。

   1. 您可以為該 IdP 使用者指派設定 **已驗證角色** 時的 **預設角色**，或您可以 **選擇具有規則的角色**。

     1. 如果您選擇 **使用規則選擇角色**，請輸入使用者身分驗證的 **宣告** 來源、比較宣告的 **操作員**、導致符合角色選擇的 **值**，以及當符合 **角色指派** 時您要指派的 **角色**。選取 **新增另一項** 以根據不同的條件建立其他規則。

     1. 選擇 **角色解析**。當您的使用者宣告與您的規則不符時，您可以拒絕憑證或向 **已驗證角色** 發出憑證。

1. 若要變更透過此提供者驗證使用者，Amazon Cognito 發布憑證時指派的主要索引標籤，請設定 **存取控制的屬性**。

   1. 若不套用主要索引標籤，請選擇 **非作用中**。

   1. 若要根據 `sub` 和 `aud` 宣告套用主要索引標籤，請選擇 **使用預設對應**。

   1. 若要建立您自己的自訂屬性結構描述至主要索引標籤，請選擇 **使用自訂對應**。然後，輸入您要從每個 **宣告** 中獲取的 **標籤金鑰**，顯示於索引標籤當中。

1. 選取**儲存變更**。

**使用 Google**

若要在您的應用程式中啟用以 Google 登入，請遵循[適用於 Android 的 Google 說明文件](https://developers.google.com/identity/sign-in/android/start)中的指示。當使用者登入時，他們會向 Google 請求 OpenID Connect 身分驗證權杖。然後 Amazon Cognito 會使用該權杖來驗證使用者身分，並產生唯一識別符。

下列範例程式碼說明如何從 Google Play 服務擷取身分驗證權杖：

```
GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
String token = GoogleAuthUtil.getToken(getApplicationContext(), accounts[0].name,
        "audience:server:client_id:YOUR_GOOGLE_CLIENT_ID");
Map<String, String> logins = new HashMap<String, String>();
logins.put("accounts.google.com", token);
credentialsProvider.setLogins(logins);
```

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

**注意**  
如果您的應用程式使用 Google 並且可在多個行動平台上使用，則應將 Google 設定為 [OpenID Connect 供應商](open-id.md)。將所有建立的用戶端 ID 新增為其他對象值，以便達到更佳的整合。若要進一步了解 Google 的跨用戶端身分模型，請參閱[跨用戶端身分](https://developers.google.com/accounts/docs/CrossClientAuth)。

**設定 Google**

若要啟用適用於 iOS 的 Google 登入，請為應用程式建立 Google 開發人員主控台專案。

1. 前往 [Google 開發人員主控台](https://console.developers.google.com/)，並建立新的專案。

1. 選擇 **APIs & Services** (API 與服務)，然後選擇 **OAuth consent screen** (OAuth 同意畫面)。自訂當 Google 要求使用者同意將其設定檔資料與您的應用程式共享時，Google 要向使用者顯示的資訊。

1. 選擇 **Credentials** (憑證)，然後選擇 **Create credentials** (建立憑證)。選擇 **OAuth client ID** (OAuth 用戶端 ID)。選取 **iOS** 做為 **Application type** (應用程式類型)。為開發應用程式所在的每個平台建立單獨的用戶端 ID。

1. 從 **Credentials** (憑證)，選擇 **Manage service accounts** (管理服務帳戶)。選擇 **Create service account** (建立服務帳戶)。輸入您的服務帳戶詳細資訊，然後選擇 **Create and continue** (建立並繼續)。

1. 將您專案的存取權授與服務帳戶。根據您應用程式的需求將服務帳戶的存取權授與使用者。

1. 選擇您的新服務帳戶。選擇 **Keys** (金鑰) 索引標籤，然後選擇 **Add key** (新增金鑰)。建立並下載新的 JSON 金鑰。

如需使用 Google 開發人員主控台的詳細資訊，請參閱 Google Cloud 文件中的[建立與管理專案](https://cloud.google.com/resource-manager/docs/creating-managing-projects)。

如需如何將 Google 整合到您 iOS 應用程式的詳細資訊，請參閱 Google Identity 文件中的[適用於 iOS 的 Google 登入](https://developers.google.com/identity/sign-in/ios/start-integrating)。

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

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

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

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

1. 選擇 **Google**。

1. 輸入您在 [Google Cloud Platform](https://console.cloud.google.com/) 建立的 OAuth 專案 **用戶端 ID**。如需詳細資訊，請參閱《Google Cloud Platform 主控台幫助》中的[設定 OAuth 2.0](https://support.google.com/cloud/answer/6158849)。

1. 若要設定 Amazon Cognito 向已通過此提供者進行身分驗證的使用者發布憑證時的角色，請設定 **角色設定**。

   1. 您可以為該 IdP 使用者指派設定 **已驗證角色** 時的 **預設角色**，或您可以 **選擇具有規則的角色**。

     1. 如果您選擇 **使用規則選擇角色**，請輸入使用者身分驗證的 **宣告** 來源、比較宣告的 **操作員**、導致符合角色選擇的 **值**，以及當符合 **角色指派** 時您要指派的 **角色**。選取 **新增另一項** 以根據不同的條件建立其他規則。

     1. 選擇 **角色解析**。當您的使用者宣告與您的規則不符時，您可以拒絕憑證或向 **已驗證角色** 發出憑證。

1. 若要變更透過此提供者驗證使用者，Amazon Cognito 發布憑證時指派的主要索引標籤，請設定 **存取控制的屬性**。

   1. 若不套用主要索引標籤，請選擇 **非作用中**。

   1. 若要根據 `sub` 和 `aud` 宣告套用主要索引標籤，請選擇 **使用預設對應**。

   1. 若要建立您自己的自訂屬性結構描述至主要索引標籤，請選擇 **使用自訂對應**。然後，輸入您要從每個 **宣告** 中獲取的 **標籤金鑰**，顯示於索引標籤當中。

1. 選取**儲存變更**。

**使用 Google**

若要在您的應用程式中啟用以 Google 登入，請遵循[適用於 iOS 的 Google 說明文件](https://developers.google.com/identity/sign-in/ios/start/)。身分驗證成功會產生 OpenID Connect 身分驗證權杖，Amazon Cognito 會用它來驗證使用者，並產生唯一識別符。

身分驗證成功會產生包含 `id_token` 的 `GTMOAuth2Authentication` 物件，Amazon Cognito 會用其來驗證使用者，並產生唯一識別符：

```
- (void)finishedWithAuth: (GTMOAuth2Authentication *)auth error: (NSError *) error {
        NSString *idToken = [auth.parameters objectForKey:@"id_token"];
        credentialsProvider.logins = @{ @(AWSCognitoLoginProviderKeyGoogle): idToken };
    }
```

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

**注意**  
如果您的應用程式使用 Google 並且可在多個行動平台上使用，則應將 Google 設定為 [OpenID Connect 供應商](open-id.md)。將所有建立的用戶端 ID 新增為其他對象值，以便達到更佳的整合。若要進一步了解 Google 的跨用戶端身分模型，請參閱[跨用戶端身分](https://developers.google.com/accounts/docs/CrossClientAuth)。

**設定 Google**

若要啟用適用於 iOS 的 Google 登入，請為應用程式建立 Google 開發人員主控台專案。

1. 前往 [Google 開發人員主控台](https://console.developers.google.com/)，並建立新的專案。

1. 選擇 **APIs & Services** (API 與服務)，然後選擇 **OAuth consent screen** (OAuth 同意畫面)。自訂當 Google 要求使用者同意將其設定檔資料與您的應用程式共享時，Google 要向使用者顯示的資訊。

1. 選擇 **Credentials** (憑證)，然後選擇 **Create credentials** (建立憑證)。選擇 **OAuth client ID** (OAuth 用戶端 ID)。選取 **iOS** 做為 **Application type** (應用程式類型)。為開發應用程式所在的每個平台建立單獨的用戶端 ID。

1. 從 **Credentials** (憑證)，選擇 **Manage service accounts** (管理服務帳戶)。選擇 **Create service account** (建立服務帳戶)。輸入您的服務帳戶詳細資訊，然後選擇 **Create and continue** (建立並繼續)。

1. 將您專案的存取權授與服務帳戶。根據您應用程式的需求將服務帳戶的存取權授與使用者。

1. 選擇您的新服務帳戶，選擇 **Keys** (金鑰) 索引標籤，然後選擇 **Add key** (新增金鑰)。建立並下載新的 JSON 金鑰。

如需使用 Google 開發人員主控台的詳細資訊，請參閱 Google Cloud 文件中的[建立與管理專案](https://cloud.google.com/resource-manager/docs/creating-managing-projects)。

如需如何將 Google 整合到您 iOS 應用程式的詳細資訊，請參閱 Google Identity 文件中的[適用於 iOS 的 Google 登入](https://developers.google.com/identity/sign-in/ios/start-integrating)。

從 [Amazon Cognito 主控台首頁](https://console.aws.amazon.com/cognito/home)選擇 **Manage Identity Pools (管理身分集區)**：

**在 Amazon Cognito 主控台中設定外部供應商**

1. 針對要啟用 Google 做為外部供應商的身分集區，選擇其名稱。該身分集區的 **Dashboard** (儀表板) 頁面隨即出現。

1. 在 **Dashboard (儀表板)** 頁面右上角，選擇 **Edit identity pool (編輯身分集區)**。Edit identity pool (編輯身分集區) 頁面隨即出現。

1. 向下捲動，然後選擇 **Authentication providers** (身分驗證供應商) 以展開該區段。

1. 選擇 **Google** 索引標籤。

1. 選擇 **Unlock (解除鎖定)**。

1. 輸入您從 Google 取得的 Google 用戶端 ID，然後選擇 **Save Changes** (儲存變更)。

**使用 Google**

若要在您的應用程式中啟用以 Google 登入，請遵循[適用於 iOS 的 Google 說明文件](https://developers.google.com/identity/sign-in/ios/start/)。身分驗證成功會產生 OpenID Connect 身分驗證權杖，Amazon Cognito 會用它來驗證使用者，並產生唯一識別符。

成功的身分驗證會產生 `GTMOAuth2Authentication` 物件，該物件包含 `id_token`。Amazon Cognito 會使用此權杖來驗證使用者身分，並產生唯一識別符。

```
func finishedWithAuth(auth: GTMOAuth2Authentication!, error: NSError!) {
    if error != nil {
      print(error.localizedDescription)
    }
    else {
      let idToken = auth.parameters.objectForKey("id_token")
      credentialsProvider.logins = [AWSCognitoLoginProviderKey.Google.rawValue: idToken!]
    }
}
```

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

**注意**  
如果您的應用程式使用 Google 並可在多個行動平台上使用，則應將 Google 設定為 [OpenID Connect 供應商](open-id.md)。將所有建立的用戶端 ID 新增為其他對象值，以便達到更佳的整合。若要進一步了解 Google 的跨用戶端身分模型，請參閱[跨用戶端身分](https://developers.google.com/accounts/docs/CrossClientAuth)。

**設定 Google**

若要啟用適用於 JavaScript Web 應用程式的 Google 登入，您必須為應用程式建立 Google 開發人員主控台專案。

1. 前往 [Google 開發人員主控台](https://console.developers.google.com/)，並建立新的專案。

1. 選擇 **APIs & Services** (API 與服務)，然後選擇 **OAuth consent screen** (OAuth 同意畫面)。自訂當 Google 要求使用者同意將其設定檔資料與您的應用程式共享時，Google 要向使用者顯示的資訊。

1. 選擇 **Credentials** (憑證)，然後選擇 **Create credentials** (建立憑證)。選擇 **OAuth client ID** (OAuth 用戶端 ID)。選取 **Web application** (Web 應用程式) 做為 **Application type** (應用程式類型)。為開發應用程式所在的每個平台建立單獨的用戶端 ID。

1. 從 **Credentials** (憑證)，選擇 **Manage service accounts** (管理服務帳戶)。選擇 **Create service account** (建立服務帳戶)。輸入您的服務帳戶詳細資訊，然後選擇 **Create and continue** (建立並繼續)。

1. 將您專案的存取權授與服務帳戶。根據您應用程式的需求將服務帳戶的存取權授與使用者。

1. 選擇您的新服務帳戶，選擇 **Keys** (金鑰) 索引標籤，然後選擇 **Add key** (新增金鑰)。建立並下載新的 JSON 金鑰。

如需使用 Google 開發人員主控台的詳細資訊，請參閱 Google Cloud 文件中的[建立與管理專案](https://cloud.google.com/resource-manager/docs/creating-managing-projects)。

如需如何將 Google 整合到您 Web 應用程式的詳細資訊，請參閱 Google Identity 文件中的[使用 Google 登入](https://developers.google.com/identity/gsi/web/guides/overview)。

**在 Amazon Cognito 主控台中設定外部供應商**

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

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

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

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

1. 選擇 **Google**。

1. 輸入您在 [Google Cloud Platform](https://console.cloud.google.com/) 建立的 OAuth 專案 **用戶端 ID**。如需詳細資訊，請參閱《Google Cloud Platform 主控台幫助》中的[設定 OAuth 2.0](https://support.google.com/cloud/answer/6158849)。

1. 若要設定 Amazon Cognito 向已通過此提供者進行身分驗證的使用者發布憑證時的角色，請設定 **角色設定**。

   1. 您可以為該 IdP 使用者指派設定 **已驗證角色** 時的 **預設角色**，或您可以 **選擇具有規則的角色**。

     1. 如果您選擇 **使用規則選擇角色**，請輸入使用者身分驗證的 **宣告** 來源、比較宣告的 **操作員**、導致符合角色選擇的 **值**，以及當符合 **角色指派** 時您要指派的 **角色**。選取 **新增另一項** 以根據不同的條件建立其他規則。

     1. 選擇 **角色解析**。當您的使用者宣告與您的規則不符時，您可以拒絕憑證或向 **已驗證角色** 發出憑證。

1. 若要變更透過此提供者驗證使用者，Amazon Cognito 發布憑證時指派的主要索引標籤，請設定 **存取控制的屬性**。

   1. 若不套用主要索引標籤，請選擇 **非作用中**。

   1. 若要根據 `sub` 和 `aud` 宣告套用主要索引標籤，請選擇 **使用預設對應**。

   1. 若要建立您自己的自訂屬性結構描述至主要索引標籤，請選擇 **使用自訂對應**。然後，輸入您要從每個 **宣告** 中獲取的 **標籤金鑰**，顯示於索引標籤當中。

1. 選取**儲存變更**。

**使用 Google**

若要在您的應用程式中啟用以 Google 登入，請遵循[適用於 Web 的 Google 說明文件](https://developers.google.com/identity/gsi/web/guides/overview)。

身分驗證成功會產生包含 `id_token` 的回應物件，Amazon Cognito 會用其來驗證使用者，並產生唯一識別符：

```
function signinCallback(authResult) {
  if (authResult['status']['signed_in']) {

     // Add the Google access token to the Amazon Cognito credentials login map.
     AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'IDENTITY_POOL_ID',
        Logins: {
           'accounts.google.com': authResult['id_token']
        }
     });

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

# 設定使用 Apple 登入做為身分集區 IdP
<a name="apple"></a>

Amazon Cognito 身分集區可與 Sign in with Apple 搭配使用，為您的行動應用程式和 Web 應用程式使用者提供聯合身分驗證。本節說明如何使用「使用 Apple 登入」做為身分提供者 (IdP) 來註冊及設定您的應用程式。

若要以身分驗證供應商身分將「使用 Apple 登入」新增至身分集區，您必須完成兩個程序。首先，在應用程式整合「使用 Apple 登入」，然後在身分集區中設定「使用 Apple 登入」。如需設定「使用 Apple 登入」的最新資訊，請參閱《Apple 開發人員文件》中的[設定您的環境以使用 Apple 登入](https://developer.apple.com/documentation/signinwithapple/configuring-your-environment-for-sign-in-with-apple)。

## 設定 Sign in with Apple
<a name="login-with-apple-setup"></a>

若要將「使用 Apple 登入」設定為 IdP，請向 Apple 註冊您的應用程式，以接收用戶端 ID。

1. [向 Apple 建立開發人員帳戶](https://developer.apple.com/programs/enroll/)。

1. 使用您的 Apple 憑證[登入](https://developer.apple.com/account/#/welcome)。

1. 在左側導覽窗格中，選擇 **Certificates, IDs & Profiles (憑證、ID 和描述檔)**。

1. 在左側導覽窗格中，選擇 **Identifiers (識別碼)**。

1. 在 **Identifiers (識別碼)** 頁面上，選擇 **\$1** 圖示。

1. 在 **Register a New Identifier (註冊新的識別碼)** 頁面上，選擇 **App IDs (應用程式 ID)**，然後選擇 **Continue (繼續)**。

1. 在 **Register an App ID** (註冊應用程式 ID) 頁面上，執行下列操作：

   1. 在 **Description** (說明) 下方，輸入說明內容。

   1. 在 **Bundle ID (套件 ID)** 下，輸入識別碼。記下此 **Bundle ID** (套件 ID)，因為您需要此值才能將 Apple 設定為身分集區中的供應商。

   1. 在 **Capabilities** (功能) 下方，選擇 **Sign In with Apple**，然後選擇 **Edit** (編輯)。

   1. 在 **使用 Apple 登入：應用程式 ID 組態** 頁面上，針對您的應用程式選取適當設定。然後選擇 **Save** (儲存)。

   1. 選擇**繼續**。

1. 在 **Confirm your App ID** (確認您的應用程式 ID) 頁面上，選擇 **Register** (註冊)。

1. 如果您想要將 Sign in with Apple 與原生 iOS 應用程式整合，請繼續進行步驟 10。步驟 11 適用於您想要與 Sign in wih Apple JS 整合的應用程式。

1. 在 **Identifiers** (識別碼) 頁面中，選擇 **App IDs** (應用程式 ID) 選單，然後選擇 **Services IDs** (服務 ID)。選擇 **\$1** 圖示。

1. 在 **Register a New Identifier** (註冊新的識別碼) 頁面上，選擇 **Services IDs** (服務 ID)，然後選擇 **Continue** (繼續)。

1. 在 **Register a Services ID** (註冊服務 ID) 頁面上，執行下列操作：

   1. 在 **Description** (說明) 下方，輸入說明內容。

   1. 在 **Identifier** (識別碼) 下方，輸入識別碼。記下服務 ID，因為您需要此數值才能將 Apple 設定為身分集區中的供應商。

   1. 選取 **Sign In with Apple**，然後選擇 **Configure (設定)**。

   1. 在 **Web Authentication Configuration (Web 驗證組態)** 頁面上，選擇 **Primary App ID (主要應用程式 ID)**。在 **Website URL’s** (網站 URL) 下方，選擇 **\$1** 圖示。在 **Domains and Subdomains (網域和子網域)** 中，輸入應用程式的網域名稱。在 **Return URLs (傳回 URL)** 中，輸入一個回呼 URL，當使用者在透過「使用 Apple 登入」驗證身分後，該授權會在此 URL 重新導向使用者。

   1. 選擇**下一步**。

   1. 選擇 **Continue** (繼續)，然後選擇 **Register** (註冊)。

1. 在左側導覽窗格中，選擇 **Keys (金鑰)**。

1. 在 **Keys** (金鑰) 頁面上，選擇 **\$1** 圖示。

1. 在 **Register a New Key** (註冊新的金鑰) 頁面上，執行下列操作：

   1. 在 **Key Name (金鑰名稱)** 底下，輸入金鑰名稱。

   1. 選擇 **Sign In with Apple**，然後選擇 **Configure (設定)**。

   1. 在 **Configure Key (設定金鑰)** 頁面上，選擇 **Primary App ID (主要應用程式 ID)**，然後選擇 **Save (儲存)**。

   1. 選擇 **Continue** (繼續)，然後選擇 **Register** (註冊)。

**注意**  
若要將 Sign in with Apple 與原生 iOS 應用程式整合，請參閱[使用 Sign in with Apple 實作使用者身分驗證。](https://developer.apple.com/documentation/authenticationservices/implementing-user-authentication-with-sign-in-with-apple)  
若要在原生 iOS 以外的平台中整合 Sign in with Apple，請參閱 [Sign in with Apple JS。](https://developer.apple.com/documentation/signinwithapplejs/)

## 在 Amazon Cognito 聯合身分主控台中設定外部供應商
<a name="login-with-apple-configure-provider"></a>

使用下列程序設定您的外部供應商。

**若要新增「使用 Apple 登入」身分提供者 (IdP)**

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

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

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

1. 選擇 **使用 Apple 登入**。

1. 輸入您使用 [Apple Developer](https://developer.apple.com) 建立的 OAuth 專案 **服務 ID**。如需詳細資訊，請參閱《使用 Apple 文檔登入》中的[使用 Apple 驗證登入使用者](https://developer.apple.com/documentation/signinwithapple/authenticating-users-with-sign-in-with-apple)。

1. 若要設定 Amazon Cognito 向已通過此提供者進行身分驗證的使用者發布憑證時的角色，請設定 **角色設定**。

   1. 您可以為該 IdP 使用者指派設定 **已驗證角色** 時的 **預設角色**，或您可以 **選擇具有規則的角色**。

     1. 如果您選擇 **使用規則選擇角色**，請輸入使用者身分驗證的 **宣告** 來源、比較宣告的 **操作員**、導致符合角色選擇的 **值**，以及當符合 **角色指派** 時您要指派的 **角色**。選取 **新增另一項** 以根據不同的條件建立其他規則。

     1. 選擇 **角色解析**。當您的使用者宣告與您的規則不符時，您可以拒絕憑證或向 **已驗證角色** 發出憑證。

1. 若要變更透過此提供者驗證使用者，Amazon Cognito 發布憑證時指派的主要索引標籤，請設定 **存取控制的屬性**。

   1. 若不套用主要索引標籤，請選擇 **非作用中**。

   1. 若要根據 `sub` 和 `aud` 宣告套用主要索引標籤，請選擇 **使用預設對應**。

   1. 若要建立您自己的自訂屬性結構描述至主要索引標籤，請選擇 **使用自訂對應**。然後，輸入您要從每個 **宣告** 中獲取的 **標籤金鑰**，顯示於索引標籤當中。

1. 選取**儲存變更**。

## Amazon Cognito 聯合身分 CLI 範例中以 Sign in with Apple 做為供應商
<a name="sign-in-with-apple-cli-examples"></a>

此範例會建立名為 `MyIdentityPool` 的身分集區，並以「使用 Apple 登入」做為 IdP。

`aws cognito-identity create-identity-pool --identity-pool-name MyIdentityPool --supported-login-providers appleid.apple.com="sameple.apple.clientid"`

 如需詳細資訊，請參閱[建立身分識別集區](https://docs.aws.amazon.com/cli/latest/reference/cognito-identity/create-identity-pool.html) 

**產生 Amazon Cognito 身分 ID**  
 此範例會產生 (或擷取) Amazon Cognito ID。這是一個公有 API，因此您不需要任何登入資料來呼叫此 API。

`aws cognito-identity get-id --identity-pool-id SampleIdentityPoolId --logins appleid.apple.com="SignInWithAppleIdToken"`

如需詳細資訊，請參閱[這裡。](https://docs.aws.amazon.com/cli/latest/reference/cognito-identity/get-id.html)

**取得 Amazon Cognito 身分 ID 的憑證**  
此範例會傳回所提供的身分 ID 和 Sign in with Apple 登入的登入資料。這是一個公有 API，因此您不需要任何登入資料來呼叫此 API。

`aws cognito-identity get-credentials-for-identity --identity-id SampleIdentityId --logins appleid.apple.com="SignInWithAppleIdToken" `

如需詳細資訊，請參閱 [get-credentials-for-identity](https://docs.aws.amazon.com/cli/latest/reference/cognito-identity/get-credentials-for-identity.html) 

## 使用 Sign in with Apple：Android系統
<a name="set-up-apple-1.android"></a>

Apple 不提供支援適用於 Android 之 Sign in with Apple 的開發套件。您可以改在 Web 檢視中使用 Web 流程。
+ 若要在您的應用程式中設定 Sign in with Apple，請遵循 Apple 文件中的 [Configuring Your Webpage for Sign In with Apple](https://developer.apple.com/documentation/signinwithapple/configuring-your-webpage-for-sign-in-with-apple)。
+ 若要將 **Sign in with Apple** 按鈕新增至 Android 使用者介面，請遵循 Apple 文件中的在 [Web 上顯示 Sign in with Apple 按鈕](https://developer.apple.com/documentation/signinwithapple/displaying-sign-in-with-apple-buttons-on-the-web)。
+ 若要使用「使用 Apple 登入」安全地對使用者進行身分驗證，請遵循 Apple 文件中的[使用「使用 Apple 登入」對使用者進行身分驗證](https://developer.apple.com/documentation/signinwithapple/authenticating-users-with-sign-in-with-apple)。

Sign in with Apple 會使用工作階段物件來追蹤其狀態。Amazon Cognito 使用此工作階段物件的 ID 字符來驗證使用者、產生唯一識別符，並視需要授予使用者對其他 AWS 資源的存取權。

```
@Override
public void onSuccess(Bundle response) {
    String token = response.getString("id_token");
    Map<String, String> logins = new HashMap<String, String>();
    logins.put("appleid.apple.com", token);
    credentialsProvider.setLogins(logins);
}
```

## 使用 Sign in with Apple：iOS - Objective-C
<a name="set-up-apple-1.ios-objc"></a>

Apple 在原生 iOS 應用程式中提供對 Sign in with Apple 的 SDK 支援。若要在原生 iOS 裝置中使用 Sign in with Apple 來實作使用者身分驗證，請遵循 Apple 文件中的 [Implementing User Authentication with Sign in with Apple](https://developer.apple.com/documentation/authenticationservices/implementing-user-authentication-with-sign-in-with-apple)。

Amazon Cognito 使用 ID 字符來驗證使用者、產生唯一識別符，並視需要授予使用者對其他 AWS 資源的存取權。

```
(void)finishedWithAuth: (ASAuthorizationAppleIDCredential *)auth error: (NSError *) error {
        NSString *idToken = [ASAuthorizationAppleIDCredential objectForKey:@"identityToken"];
        credentialsProvider.logins = @{ "appleid.apple.com": idToken };
    }
```

## 使用 Sign in with Apple：iOS - Swift
<a name="set-up-apple-1.ios-swift"></a>

Apple 在原生 iOS 應用程式中提供對 Sign in with Apple 的 SDK 支援。若要在原生 iOS 裝置中使用 Sign in with Apple 來實作使用者身分驗證，請遵循 Apple 文件中的 [Implementing User Authentication with Sign in with Apple](https://developer.apple.com/documentation/authenticationservices/implementing-user-authentication-with-sign-in-with-apple)。

Amazon Cognito 使用 ID 字符來驗證使用者、產生唯一識別符，並視需要授予使用者對其他 AWS 資源的存取權。

如需如何在 iOS 中設定「使用 Apple 登入」的詳細資訊，請參閱[設定「使用 Apple 登入」](https://docs.amplify.aws/sdk/auth/federated-identities/q/platform/ios#set-up-sign-in-with-apple)

```
func finishedWithAuth(auth: ASAuthorizationAppleIDCredential!, error: NSError!) {
    if error != nil {
      print(error.localizedDescription)
    }
    else {
      let idToken = auth.identityToken,
      credentialsProvider.logins = ["appleid.apple.com": idToken!]
    }
}
```

## 使用 Sign in with Apple：JavaScript
<a name="set-up-apple-1.javascript"></a>

Apple 不提供支援適用於 JavaScript 之 Sign in with Apple 的開發套件。您可以改在 Web 檢視中使用 Web 流程。
+ 若要在您的應用程式中設定 Sign in with Apple，請遵循 Apple 文件中的 [Configuring Your Webpage for Sign In with Apple](https://developer.apple.com/documentation/signinwithapple/configuring-your-webpage-for-sign-in-with-apple)。
+ 若要將 **Sign in with Apple** 按鈕新增至 JavaScript 使用者介面，請遵循 Apple 文件中的在 [Web 上顯示 Sign in with Apple 按鈕](https://developer.apple.com/documentation/signinwithapple/displaying-sign-in-with-apple-buttons-on-the-web)。
+ 若要使用「使用 Apple 登入」安全地對使用者進行身分驗證，請遵循 Apple 文件中的[使用「使用 Apple 登入」對使用者進行身分驗證](https://developer.apple.com/documentation/signinwithapple/authenticating-users-with-sign-in-with-apple)。

Sign in with Apple 會使用工作階段物件來追蹤其狀態。Amazon Cognito 使用此工作階段物件的 ID 字符來驗證使用者、產生唯一識別符，並視需要授予使用者對其他 AWS 資源的存取權。

```
function signinCallback(authResult) {
     // Add the apple's id token to the Amazon Cognito credentials login map.
     AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'IDENTITY_POOL_ID',
        Logins: {
           'appleid.apple.com': authResult['id_token']
        }
     });

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

# 將 OIDC 供應商設定為身分集區 IdP
<a name="open-id"></a>

[OpenID Connect](http://openid.net/connect/) 是一種用來進行身分驗證的開放標準，許多登入供應商皆支援。透過 Amazon Cognito，您可以將身分與透過 設定的 OpenID Connect 提供者連結[AWS Identity and Access Management](https://aws.amazon.com/iam/)。

**新增 OpenID Connect 供應商**

如需有關如何建立 OpenID Connect 供應商的詳細資訊，請參閱《AWS Identity and Access Management 使用者指南》中的[建立 OpenID Connect (OIDC) 身分提供者](https://docs.aws.amazon.com/IAM/latest/UserGuide/identity-providers-oidc.html)。

**將供應商與 Amazon Cognito 相關聯**

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

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

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

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

1. 選擇 **OpenID Connect (OIDC)**。

1. 從您 AWS 帳戶中的 IAM IdP 選擇一個 **OIDC 身分提供者**。如果要新增新的 SAML 提供者，請選擇 **建立新的提供者** 以前往 IAM 主控台。

1. 若要設定 Amazon Cognito 向已通過此提供者進行身分驗證的使用者發布憑證時的角色，請設定 **角色設定**。

   1. 您可以為該 IdP 使用者指派設定 **已驗證角色** 時的 **預設角色**，或您可以 **選擇具有規則的角色**。

     1. 如果您選擇 **使用規則選擇角色**，請輸入使用者身分驗證的 **宣告** 來源、比較宣告的 **操作員**、導致符合角色選擇的 **值**，以及當符合 **角色指派** 時您要指派的 **角色**。選取 **新增另一項** 以根據不同的條件建立其他規則。

     1. 選擇 **角色解析**。當您的使用者宣告與您的規則不符時，您可以拒絕憑證或向 **已驗證角色** 發出憑證。

1. 若要變更透過此提供者驗證使用者，Amazon Cognito 發布憑證時指派的主要索引標籤，請設定 **存取控制的屬性**。

   1. 若不套用主要索引標籤，請選擇 **非作用中**。

   1. 若要根據 `sub` 和 `aud` 宣告套用主要索引標籤，請選擇 **使用預設對應**。

   1. 若要建立您自己的自訂屬性結構描述至主要索引標籤，請選擇 **使用自訂對應**。然後，輸入您要從每個 **宣告** 中獲取的 **標籤金鑰**，顯示於索引標籤當中。

1. 選取**儲存變更**。

您可以將多個 OpenID Connect 供應商與單一身分集區相關聯。

**使用 OpenID Connect**

請參閱供應商的文件，了解如何登入和接收 ID 字符。

在您擁有權杖後，將該權杖新增至登入對映。使用供應商的 URI 作為金鑰。

**驗證 OpenID Connect 權杖**

第一次與 Amazon Cognito 整合時，您可能會收到 `InvalidToken` 例外狀況。請務必了解 Amazon Cognito 如何驗證 OpenID Connect (OIDC) 權杖。

**注意**  
本文指出 ([https://tools.ietf.org/html/rfc7523](https://tools.ietf.org/html/rfc7523))，Amazon Cognito 提供 5 分鐘的寬限期來處理系統間的所有時脈偏移。

1. `iss` 參數必須符合登入對應所使用的金鑰 (例如 login.provider.com)。

1. 這個簽章必須有效。簽章必須能夠透過 RSA 公開金鑰來驗證。
**注意**  
身分集區會短暫維護 OIDC IdP 簽署金鑰的快取。如果您的提供者變更其簽署金鑰，Amazon Cognito 可能會傳回`NoKeyFound`錯誤，直到此快取重新整理為止。如果您遇到此錯誤，請等待約十分鐘讓身分集區重新整理簽署金鑰。

1. 憑證公有金鑰的指紋符合您在建立 OIDC 供應商時在 IAM 中設定的指紋。

1. 如果 `azp` 參數存在，請對照 OIDC 供應商中列出的用戶端 ID 來檢查這個值。

1. 如果 `azp` 參數不存在，請對照 OIDC 供應商中列出的用戶端 ID 來檢查 `aud` 參數。

[jwt.io](http://jwt.io/) 網站是很寶貴的資源，您可使用此資源將權杖解碼並驗證這些值。

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

```
Map<String, String> logins = new HashMap<String, String>();
logins.put("login.provider.com", token);
credentialsProvider.setLogins(logins);
```

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

```
credentialsProvider.logins = @{ "login.provider.com": token }
```

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

```
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
 IdentityPoolId: 'IDENTITY_POOL_ID',
 Logins: {
    'login.provider.com': token
 }
});
```

# 將 SAML 供應商設定為身分集區 IdP
<a name="saml-identity-provider"></a>

使用 Amazon Cognito 身分集區，您可以透過 SAML 2.0 向身分提供者 (IdPs) 驗證使用者。您可以將支援 SAML 的 IdP 用於 Amazon Cognito，以為您的使用者提供簡單的登入流程。支援 SAML 的 IdP 會指定您的使用者可擔任的 IAM 角色。如此一來，不同的用戶可以收到不同的許可集。

## 為 SAML IdP 設定您的身分集區
<a name="configure-identity-pool-saml-provider"></a>

下列步驟說明如何設定您的身分集區來使用 SAML IdP。

**注意**  
在設定身分集區來支援 SAML 供應商之前，您必須先在 [IAM 主控台](https://console.aws.amazon.com/iam)中設定 SAML IdP。如需詳細資訊，請參閱[《IAM 使用者指南》](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml_3rd-party.html)中的*將第三方 SAML 解決方案供應商與 AWS整合*。

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

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

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

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

1. 選擇 **SAML**。

1. 從您 AWS 帳戶中的 IAM IdP 選擇一個 **SAML 身分提供者**。如果要新增新的 SAML 提供者，請選擇 **建立新的提供者** 以前往 IAM 主控台。

1. 若要設定 Amazon Cognito 向已通過此提供者進行身分驗證的使用者發布憑證時的角色，請設定 **角色設定**。

   1. 您可以為該 IdP 使用者指派設定 **已驗證角色** 時的 **預設角色**，或您可以 **選擇具有規則的角色**。

     1. 如果您選擇 **使用規則選擇角色**，請輸入使用者身分驗證的 **宣告** 來源、比較宣告的 **操作員**、導致符合角色選擇的 **值**，以及當符合 **角色指派** 時您要指派的 **角色**。選取 **新增另一項** 以根據不同的條件建立其他規則。

     1. 選擇 **角色解析**。當您的使用者宣告與您的規則不符時，您可以拒絕憑證或向 **已驗證角色** 發出憑證。

1. 若要變更透過此提供者驗證使用者，Amazon Cognito 發布憑證時指派的主要索引標籤，請設定 **存取控制的屬性**。

   1. 若不套用主要索引標籤，請選擇 **非作用中**。

   1. 若要根據 `sub` 和 `aud` 宣告套用主要索引標籤，請選擇 **使用預設對應**。

   1. 若要建立您自己的自訂屬性結構描述至主要索引標籤，請選擇 **使用自訂對應**。然後，輸入您要從每個 **宣告** 中獲取的 **標籤金鑰**，顯示於索引標籤當中。

1. 選取**儲存變更**。

## 設定 SAML IdP
<a name="configure-your-saml-identity-provider"></a>

建立 SAML 供應商之後，請設定您的 SAML IdP，以在您的 IdP 與 AWS之間新增依賴方信任。透過許多 IdP，您便可以指定 URL，以供 IdP 用於從 XML 文件讀取依賴方資訊和憑證。對於 AWS，您可以使用 [https://signin.aws.amazon.com/static/saml-metadata.xml](https://signin.aws.amazon.com/static/saml-metadata.xml)。下一個步驟是從 IdP 設定 SAML 聲明回應，以填入 AWS 所需的宣告。如需宣告組態的詳細資訊，請參閱[設定身分驗證回應的 SAML 聲明](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html)。

當您的 SAML IdP 在 SAML 中繼資料中包含多個簽署憑證時，在登入時，如果 SAML 聲明符合 SAML 中繼資料中的任何憑證，則您的身分集區會判斷 SAML 聲明是否有效。

## 使用 SAML 來自訂您的使用者角色
<a name="role-customization-saml"></a>

搭配 Amazon Cognito Identity 使用 SAML，您可以為最終使用者自訂角色。Amazon Cognito 僅支援基於 SAML 之 IdP 的[增強型流程](authentication-flow.md)。您不需要為身分集區指定已驗證或未驗證的角色，就能使用 SAML 型 IdP。`https://aws.amazon.com/SAML/Attributes/Role`宣告屬性會指定一或多組以逗號分隔的角色和供應商 ARN。這些都是使用者可以擔任的角色。您可以設定 SAML IdP 以根據 IdP 提供的使用者屬性資訊來填入角色屬性。如果您在 SAML 聲明中收到多個角色，則在呼叫 `customRoleArn` 時，應填入選擇性的 `getCredentialsForIdentity` 參數。如果該角色符合 SAML 聲明中宣告的角色，則使用者會擔任此 `customRoleArn`。

## 使用 SAML IdP 驗證使用者身分
<a name="authenticate-user-with-saml"></a>

若要與 SAML 型 IdP 聯合，請判斷使用者起始 login. AWS federation 使用 IdP 起始登入的 URL。在 AD FS 2.0 中，URL 採用的格式為 `https://<fqdn>/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=urn:amazon:webservices`。

若要在 Amazon Cognito 中新增對 SAML IdP 的支援，必須先從您的 iOS 或 Android 應用程式，使用您的 SAML 身分提供者來驗證使用者身分。用來透過 SAML IdP 進行整合和身分驗證的代碼是 SAML 供應商所特有的。在您對使用者進行身分驗證之後，便可以使用 Amazon Cognito API 將所產生的 SAML 聲明提供給 Amazon Cognito Identity。

您無法在身分識別集區 API 要求的 `Logins` 對應中重複或重新顯示 SAML 宣告。重新顯示的 SAML 宣告具有重複先前 API 要求 ID 的宣告 ID。可以在 `Logins` 對應中接受 SAML 判斷提示的 API 作業包括 [GetId](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html)、[GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html)、[GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html)，以及 [GetOpenIDTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html)。您可以在身分識別集區驗證流程中的每個 API 要求重新顯示一次 SAML 宣告 ID。例如，您可以在 `GetId` 要求和後續 `GetCredentialsForIdentity` 要求中提供相同的 SAML 宣告，但不能在第二個 `GetId` 要求中提供。