

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

# 使用使用者屬性
<a name="user-pool-settings-attributes"></a>

屬性是協助您識別個別使用者的細項資訊，例如名稱、電子郵件地址和電話號碼。新使用者集區具有一組預設的*標準屬性*。您也可以在 中將自訂屬性新增至使用者集區定義 AWS 管理主控台。此主題會詳細說明那些屬性，並提供設定使用者集區的秘訣。

請勿將所有的使用者相關資訊都存放在屬性中。例如，將經常變更的使用者資料，例如用量統計資料或遊戲分數，保存在個別的資料存放區中，例如 Amazon Cognito Sync 或 Amazon DynamoDB。

請先清理使用者屬性字串值的輸入，再將其提交至使用者集區。分析提議使用者屬性值的一種方法是使用 Lambda 觸發程序，例如[註冊前](user-pool-lambda-pre-sign-up.md)。

**注意**  
某些文件和標準將屬性稱為*成員*。

**Topics**
+ [標準屬性](#cognito-user-pools-standard-attributes)
+ [使用者名稱和偏好的使用者名稱](#user-pool-settings-usernames)
+ [自訂登入屬性](#user-pool-settings-aliases)
+ [自訂屬性](#user-pool-settings-custom-attributes)
+ [屬性許可和範圍](#user-pool-settings-attribute-permissions-and-scopes)

## 標準屬性
<a name="cognito-user-pools-standard-attributes"></a>

Amazon Cognito 會根據 [OpenID Connect 規格](http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)為所有使用者指派一組標準屬性。根據預設，標準和自訂屬性值可以是長度上限 2048 個字元的任何字串，但某些屬性值有格式限制。

標準屬性包括：
+ `name`
+ `family_name`
+ `given_name`
+ `middle_name`
+ `nickname`
+ `preferred_username`
+ `profile`
+ `picture`
+ `website`
+ `gender`
+ `birthdate`
+ `zoneinfo`
+ `locale`
+ `updated_at`
+ `address`
+ `email`
+ `phone_number`
+ `sub`

除了 `sub`，所有使用者的標準屬性預設都是選用的。若要設定為必要屬性，請在使用者集區建立程序期間，勾選屬性旁邊的 **Required** (必要) 核取方塊。Amazon Cognito 會為每個使用者的 `sub` 屬性指派唯一的使用者識別碼值。只有 **email** 和 **phone\$1number** 屬性能夠驗證。

標準屬性具有預先定義的屬性，您可以在 [DescribeUserPool API 回應](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPool.html#API_DescribeUserPool_ResponseSyntax)的 `SchemaAttributes` 參數中檢視這些屬性。您可以為這些屬性屬性設定自訂值，例如資料類型、可變性和長度限制。若要修改標準屬性屬性，請在 [CreateUserPool 結構描述參數](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-Schema)中設定其自訂值。結構描述也是您設定必要屬性的位置。當您在 Amazon Cognito 主控台中建立使用者集區時，您無法修改標準屬性的屬性。

**注意**  
 將標準屬性標示為 **Required (必要)** 後，使用者必須提供該屬性的值，才能註冊。若要建立使用者而不為所需屬性提供值，管理員可以使用 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html) API。建立使用者集區之後，您便無法讓屬性在必要和非必要之間切換。標準屬性詳細資訊和格式限制

**birthdate**  
值必須是 10 個字元的有效日期，且格式為 YYYY-MM-DD。

**email**  
使用者和管理員可以驗證電子郵件地址值。  
具有適當 AWS 帳戶 許可的管理員可以變更使用者的電子郵件地址，並將其標記為已驗證。使用 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API 或 [admin-update-user-attributes](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-update-user-attributes.html) AWS Command Line Interface (AWS CLI) 命令將電子郵件地址標記為已驗證。管理員可以使用此命令將 `email_verified` 屬性變更為 `true`。您也可以在 Amazon Cognito 主控台**的使用者**選單中編輯使用者，將電子郵件地址標記為已驗證。  
值必須是符合 @ 符號和網域的標準電子郵件格式[的有效電子郵件地址字串](https://datatracker.ietf.org/doc/html/rfc3696#section-3)，長度上限為 2048 個字元。

**phone\$1number**  
如果 SMS 多重要素驗證 (MFA) 處於作用中狀態，則使用者必須提供電話號碼。如需詳細資訊，請參閱[將 MFA 新增到使用者集區](user-pool-settings-mfa.md)。  
使用者和管理員可以驗證電話號碼值。  
具有適當 AWS 帳戶 許可的管理員可以變更使用者的電話號碼，並將其標記為已驗證。使用 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API 或 [admin-update-user-attributes](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-update-user-attributes.html) AWS CLI 命令將電話號碼標記為已驗證。管理員可以使用此命令將 `phone_number_verified` 屬性變更為 `true`。您也可以在 Amazon Cognito 主控台**的使用者**選單中編輯使用者，將電話號碼標記為已驗證。  
電話號碼必須遵循下列格式規則：電話號碼必須以加號 (**\$1**) 開頭，後面緊接著國碼。電話號碼只能包含 **\$1** 號和數字。請先移除電話號碼中的任何其他字元，例如括號、空格或連字號 (**-**)，您才能將該值提交至服務。例如，美國地區的電話號碼必須遵循此格式：**\$114325551212**。

**preferred\$1username**  
您可以選取 `preferred_username` 為必填或別名，但不能同時為兩者。如果 `preferred_username` 是別名，在確認使用者後，您可以向 [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html) API 操作請求並新增屬性值。

**sub**  
根據 `sub` 屬性建立索引與搜尋您的使用者。`sub` 屬性是每個使用者集區中的唯一使用者識別碼。使用者可以變更屬性，如 `phone_number` 和 `email`。`sub` 屬性具有固定的值。如需尋找使用者的詳細資訊，請參閱 [管理及搜尋使用者帳戶](how-to-manage-user-accounts.md)。

### 檢視必要的屬性
<a name="how-to-edit-standard-attributes"></a>

使用下列處理程序檢視指定使用者集區的必要屬性。

**注意**  
建立使用者集區之後，您就無法變更必要的屬性。

**檢視必要的屬性**

1. 前往 中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home) AWS 管理主控台。如果主控台提示您，請輸入您的 AWS 登入資料。

1. 選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區。

1. 選擇**註冊**功能表。

1. 在 **Required attributes** (必要的屬性) 區段中，檢視使用者集區的必要屬性。

## 使用者名稱和偏好的使用者名稱
<a name="user-pool-settings-usernames"></a>

`username` 值是另一個屬性，不同於 `name` 屬性。每個使用者都有 `username` 屬性。Amazon Cognito 會自動為聯合身分使用者產生使用者名稱。您必須提供 `username` 屬性，以便在 Amazon Cognito 目錄中建立本機使用者。在您建立使用者之後，您無法變更 `username` 屬性。

開發人員可以使用 `preferred_username` 屬性，以提供使用者可以變更的使用者名稱。如需詳細資訊，請參閱[自訂登入屬性](#user-pool-settings-aliases)。

如果您的應用程式不需要使用者名稱，則不需要求使用者提供。您的應用程式可以在背景為使用者建立唯一的使用者名稱。如果您希望使用者以電子郵件地址和密碼來註冊及登入，這會非常有用。如需詳細資訊，請參閱[自訂登入屬性](#user-pool-settings-aliases)。

`username` 在使用者集區中必須是唯一的。`username` 只有在其已遭刪除且不再使用的情況下方可重新使用。如需 `username` 屬性的字串限制的相關資訊，請參閱 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html#CognitoUserPools-SignUp-request-Username) API 請求的 *username* 屬性。

## 自訂登入屬性
<a name="user-pool-settings-aliases"></a>

建立使用者集區時，如果您希望使用者以電子郵件地址或電話號碼做為使用者名稱進行註冊和登入，可以設定*使用者名稱屬性*。或者，您可以設定別名屬性，為使用者提供選項：他們可以在註冊時包含多個屬性，然後以使用者名稱、偏好的使用者名稱、電子郵件地址或電話號碼登入。

**重要**  
建立使用者集區之後，您就無法變更此設定。

### 如何在別名屬性和使用者名稱屬性之間進行選擇
<a name="user-pool-settings-aliases-settings"></a>


| 您的要求 | 別名屬性 | 使用者名稱屬性 | 
| --- |--- |--- |
| Users have multiple sign-in attributes | Yes¹ | No² | 
| Users must verify email address or phone number before they can sign in with it | Yes | No | 
| Sign up users with duplicate email addresses or phone numbers and prevent UsernameExistsException errors³ | Yes | No | 
| Can assign the same email address or phone number attribute value to more than one user | Yes⁴ | No | 

¹ 可用的登入屬性為使用者名稱、電子郵件地址和偏好的使用者名稱。

² 可以使用電子郵件地址或電話號碼登入。

³ 使用者使用可能重複的電子郵件地址或電話號碼註冊，但沒有使用者名稱時，使用者集區不會產生 `UsernameExistsException` 錯誤。這種行為與**防止使用者名稱存在錯誤**無關，它適用於登入，但不適用於註冊操作。

⁴ 只有最後一位已驗證屬性的使用者才能使用該屬性登入。

#### 選項 1：多個登入屬性 (別名屬性)
<a name="user-pool-settings-aliases-settings-option-1"></a>

當使用者擁有使用者名稱，但也可以使用該屬性登入時，屬性即為*別名*。當您想要允許使用者在登入表單的使用者名稱欄位中選擇其使用者名稱和其他屬性值時，請設定別名。`username` 屬性是使用者無法變更的固定值。如果您將屬性標記為別名，使用者就可以使用該屬性代替使用者名稱來登入。您可以將電子郵件地址、電話號碼和偏好的使用者名稱屬性標記為別名。例如，如果您為使用者集區選擇將電子郵件和電話號碼做為別名，該使用者集區中的使用者就可以使用其使用者名稱、電子郵件地址或電話號碼並搭配其密碼來登入。

若要選擇別名屬性，請在建立使用者集區時選取 **User name** (使用者名稱) 和至少另一個登入選項。

**注意**  
當您將使用者集區設定為不區分大小寫時，使用者可以使用小寫或大寫字母來註冊或使用別名登入。如需詳細資訊，請參閱 *Amazon Cognito 使用者集區 API 參考*中的 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html)。

如果您選取電子郵件地址做為別名，Amazon Cognito 不會接受與有效電子郵件地址格式相符的使用者名稱。同樣地，如果您選擇電話號碼做為別名，Amazon Cognito 不會接受與有效電話號碼格式相符的使用者集區的使用者名稱。

**注意**  
別名值在使用者集區中必須是唯一的。如果您為電子郵件地址或電話號碼設定別名，所提供的值只能在一個帳戶中是已驗證狀態。註冊期間，如果您的使用者提供電子郵件地址或電話號碼做為別名值，而另一個使用者已使用該別名值，則註冊會成功。不過，當使用者嘗試使用此電子郵件 (或電話號碼) 來確認帳戶，並輸入有效的驗證碼時，Amazon Cognito 會傳回 `AliasExistsException` 錯誤。該錯誤會向使用者指出使用此電子郵件地址 (或電話號碼) 的帳戶已存在。此時，使用者可以放棄嘗試建立新帳戶，並改為嘗試為舊帳戶重設密碼。如果使用者繼續建立新帳戶，您的應用程式必須以 `forceAliasCreation` 選項呼叫 `ConfirmSignUp` API。具有 `forceAliasCreation` 的 `ConfirmSignUp` 會將先前的帳戶移到新建立的帳戶，並在先前的帳戶中，將該屬性標記為未驗證。

電話號碼和電子郵件地址只有在經過使用者驗證後，才會成為使用者的作用中別名。如果要使用電子郵件地址和電話號碼做為別名，建議您選擇自動驗證。

選擇別名屬性，以防止使用者註冊時發生電子郵件地址和電話號碼屬性 `UsernameExistsException` 錯誤。

啟用 `preferred_username` 屬性，以便您的使用者可以變更用於登入的使用者名稱，而 `username` 屬性值不會變更。如果您想要設定此使用者體驗，請提交新的 `username`值做為 `preferred_username`，並選擇 `preferred_username` 做為別名。如此一來，使用者就可以使用其輸入的新值來登入。如果您選取 `preferred_username` 做為別名，則使用者只有在確認帳戶後，才能提供該值。使用者在註冊期間無法提供該值。

當使用者以使用者名稱進行註冊時，您可以選擇使用者是否可以使用下列一或多個別名來登入。
+ 已驗證的電子郵件地址
+ 已驗證的電話號碼
+ 偏好的使用者名稱

使用者完成註冊之後，便可以變更這些別名。

**重要**  
在您的使用者集區支援使用別名登入，且您想授權或查詢使用者時，請勿透過使用者的任何登入屬性來識別您的使用者。固定值使用者識別符 `sub` 是使用者身份的唯一一致指標。

當您建立使用者集區時，請包括下列步驟，以便使用者可以使用別名登入。

------
#### [ Phone number or email address (console) ]

建立使用者集區時，您必須將電子郵件地址和電話號碼設定為別名屬性。

**在 Amazon Cognito 主控台中使用使用者名稱別名建立使用者集區**

1. 前往 AWS 管理主控台中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home)。如果主控台提示您，請輸入您的 AWS 登入資料。

1. 使用**開始使用**或建立使用者集區按鈕**建立新的使用者集區**。

1. 在**定義您的**應用程式中選擇應用程式設定。

1. 在**登入識別碼選項**下的**設定選項**中，選取**使用者名稱**旁的核取方塊，以及至少一個其他選項：**電子郵件**和**電話號碼**。

1. 選擇別名屬性做為**註冊的必要屬性**。在受管登入註冊表單中，Amazon Cognito 會提示新使用者提供必要屬性的值。

1. 在**新增傳回 URL** 下，設定受管登入登入後重新導向的應用程式回呼 URL。

1. 選擇**建立**。

------
#### [ Phone number or email address (API/SDK) ]

使用 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) API 操作建立新的使用者集區。設定 `AliasAttributes` 參數，如下所示。如果您只想要電話號碼別名，您可以移除`email`項目，或者如果您只想要電子郵件地址別名，則可以移除`phone_number`項目。

```
"AliasAttributes": [
   "email",
   "phone_number"
],
```

------
#### [ Preferred username (API/SDK) ]

Amazon Cognito 主控台會建立不含 `preferred_username`做為別名的使用者集區。若要使用別名建立使用者集區，請在 AWS SDK `preferred_username` 中使用 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) API 請求設定使用者集區。若要支援在註冊時建立偏好的使用者名稱屬性，請將 `preferred_username`設定為必要的屬性。在受管登入註冊表單中，Amazon Cognito 會提示新使用者提供必要屬性的值。*您可以在* Amazon Cognito 主控台中將 設定為`preferred_username`必要屬性，但這不會將其用作別名。

**將 設定為別名**  
在`CreateUserPool`請求的 `AliasAttributes` 參數中將 `preferred_username`設定為別名，如下所示。從清單中移除您不想做為別名屬性的任何值。

```
"AliasAttributes": [
   "email",
   "phone_number",
   "preferred_username"
],
```

**視需要設定**  
在受管登入註冊表單中，Amazon Cognito 會提示新使用者提供必要屬性的值。在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 請求的 `SchemaAttributes` 參數中`preferred_username`視需要設定 。

若要將偏好的使用者名稱設定為必要的屬性，請如所示進行設定。下列範例會修改 的預設結構描述`preferred_username`，以將其設定為必要。其他結構描述參數，例如 `AttributeDataType`（預設為 `string`) 和 `StringAttributeConstraints`（預設為長度 1-99 個字元） 會假設預設值。

```
"Schema": [
   {
      "Name": "preferred_username",
      "Required": true
   }
]
```

------

#### 選項 2：以電子郵件地址或電話號碼作為登入屬性 (使用者名稱屬性)
<a name="user-pool-settings-aliases-settings-option-2"></a>

當使用者以電子郵件地址或電話號碼做為使用者名稱進行註冊時，您可以選擇使用者是否可以僅使用電子郵件地址、僅電話號碼或兩者之一來註冊。

若要選擇使用者名稱屬性，請勿在建立使用者集區時選取**使用者名稱**做為登入選項。

電子郵件地址或電話號碼必須是唯一的，而且不能是已由其他使用者所使用。這不需要驗證。使用者以電子郵件地址或電話號碼註冊之後，即無法以相同的電子郵件地址或電話號碼來建立新帳戶。使用者只能重複使用現有的帳戶，並依需要重設帳戶密碼。不過，使用者可以將電子郵件地址或電話號碼變更為新的電子郵件地址或電話號碼。如果電子郵件地址或電話號碼尚未使用，就會變成新的使用者名稱。

當您同時選取電子郵件地址和電話號碼做為使用者名稱屬性時，使用者可以使用一個或另一個屬性登入，即使兩者都提供值。登入使用者名稱是根據您在 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html#CognitoUserPools-SignUp-request-Username) `Username` 參數中傳遞的值。

**注意**  
如果使用者以電子郵件地址做為使用者名稱來註冊，使用者可以將使用者名稱變更為另一個電子郵件地址，但不能將其變更為電話號碼。如果使用者以電話號碼來註冊，則可以將使用者名稱變更為另一個電話號碼，但不能將其變更為電子郵件地址。

在使用者集區建立程序期間使用下列步驟，以設定使用電子郵件地址或電話號碼來註冊及登入。

------
#### [ Username attributes (console) ]

下列程序會建立具有電子郵件地址或電話號碼使用者名稱屬性的使用者集區。Amazon Cognito 主控台中使用者名稱屬性的程序差異在於，您也不會將**使用者名稱**設定為登入屬性。

**在 Amazon Cognito 主控台中建立具有使用者名稱屬性的使用者集區**

1. 前往 AWS 管理主控台中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home)。如果主控台提示您，請輸入您的 AWS 登入資料。

1. 使用**開始使用**或建立使用者集區按鈕**建立新的使用者集區**。

1. 在**定義您的**應用程式中選擇應用程式設定。

1. 在**登入識別碼選項**下的**設定選項**中，選取您的使用者名稱屬性：**電子郵件**、**電話號碼**或兩者。不勾選**使用者名稱**。

1. 最佳實務是，選取您的使用者名稱屬性做為**註冊的必要屬性**。在受管登入註冊表單中，Amazon Cognito 會提示新使用者提供必要屬性的值。如果您未視需要設定使用者名稱屬性，Amazon Cognito 不會提示新使用者為其提供值。在這種情況下，您必須將應用程式設定為收集和提交每個使用者的電子郵件地址或電話號碼，然後才能登入。

1. 在**新增傳回 URL** 下，設定受管登入登入後重新導向的應用程式回呼 URL。

1. 選擇**建立**。

------
#### [ Username attributes (API/SDK) ]

在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 請求中，設定 `UsernameAttributes` 參數，如下所示。若要僅允許使用電子郵件地址使用者名稱登入，請在此清單中`email`單獨指定 。若要僅允許使用電話號碼使用者名稱登入，請`phone_number`單獨指定 。此參數會將使用者名稱覆寫為登入選項。

```
"UsernameAttributes": [ 
   "email",
   "phone_number"
],
```

------

當您設定使用者名稱屬性時，您的 可以發出 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) API 請求，在 `username` 參數中傳遞電子郵件地址或電話號碼。以下是程式碼`SignUp` API 操作與使用者名稱屬性的行為。
+ 如果`username`字串是有效的電子郵件地址格式，例如 `user@example.com`，則使用者集區會自動以 `username`值填入使用者的`email`屬性。
+ 如果`username`字串是有效的電話號碼格式，例如 `+12065551212`，則使用者集區會自動以 `username`值填入使用者的`phone_number`屬性。
+ 如果 `username` 字串格式不是電子郵地址或電話號碼格式，`SignUp` API 會傳回例外狀況。
+ 如果 `username` 字串中包含已使用中的電子郵件地址或電話號碼，`SignUp` API 會傳回例外狀況。
+ `SignUp` API 會使用 [UUID](cognito-terms.md#terms-uuid) 為您的使用者填入`username`屬性。此 UUID 的值與使用者身分字符中的 `sub` 宣告相同。

您可以使用電子郵件地址或電話號碼來取代 [ListUsers](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html) 操作以外的所有 APIs 中的使用者名稱。在 `ListUsers` API 請求中，您可以指定 `email`或 `Filter`的 `phone_number`。如果您依 篩選`username`，則必須提供 UUID 使用者名稱，而不是電子郵件地址或電話號碼。

## 自訂屬性
<a name="user-pool-settings-custom-attributes"></a>

您可以新增最多 50 個自訂屬性到您的使用者集區。您可以指定自訂屬性的長度下限及/或上限。不過，任何自訂屬性的長度上限不能超過 2048 個字元。自訂屬性的名稱必須符合 [SchemaAttributeType](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SchemaAttributeType.html) `Name` 參數中所述的規則表達式模式。

**每個自訂屬性具有下列特性：**
+ 您可以將其定義為字串、數字、布林值或`DateTime`物件。Amazon Cognito 僅將自訂屬性值做為字串寫入 ID 權杖。
**注意**  
在 Amazon Cognito 主控台中，您只能新增字串和數字資料類型的自訂屬性。布林值和`DateTime`屬性資料類型等其他選項僅適用於 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 和 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 請求的 `SchemaAttributes` 屬性。
+ 您不能要求使用者為屬性提供值。
+ 將它新增至使用者集區之後，便無法移除或變更它。
+ 屬性名稱的字元長度在 Amazon Cognito 接受的限制範圍內。如需詳細資訊，請參閱[Amazon Cognito 的配額](quotas.md)。
+ 可以是*可變*或*不可變*。建立使用者時，您只能將值寫入不可變屬性中。如果您的應用程式用戶端對該屬性具有寫入許可，則可以變更可變屬性的值。如需詳細資訊，請參閱[屬性許可和範圍](#user-pool-settings-attribute-permissions-and-scopes)。

**注意**  
在您的程式碼以及 [使用以角色為基礎的存取控制](role-based-access-control.md) 的規則設定中，自訂屬性需要 `custom:` 字首來將其與標準屬性區分。

您也可以在建立使用者集區時，於 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 的 `SchemaAttributes` 屬性中新增*開發人員屬性*。開發人員屬性帶有 `dev:` 字首。您只能使用 AWS 登入資料修改使用者的開發人員屬性。開發人員屬性是舊版功能，Amazon Cognito 已將它取代為應用程式用戶端讀寫許可。

請使用下列處理程序建立新的自訂屬性。

**使用主控台新增自訂屬性**

1. 前往 中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home) AWS 管理主控台。如果主控台提示您，請輸入您的 AWS 登入資料。

1. 選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區。

1. 選擇**註冊**功能表，然後在**自訂屬性**區段中，選擇**新增自訂屬性**。

1. 在 **Add custom attributes** (新增自訂屬性) 頁面中，提供下列有關新屬性的詳細資訊：
   + 輸入 **Name** (名稱)。
   + 選取 **Type** (類型) 為 **String** (字串) 或 **Number** (數字)。
   + 輸入 **Min** (最小) 字串長度或數字值。
   + 輸入 **Max** (最大) 字串長度或數字值。
   + 如果您想要許可使用者在設定初始值之後，可以變更自訂屬性的值，請選擇 **Mutable** (可變)。

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

## 屬性許可和範圍
<a name="user-pool-settings-attribute-permissions-and-scopes"></a>

針對每個應用程式用戶端，您可以設定每個使用者屬性的讀取和寫入許可。透過這種方式，您可以控制任何應用程式所擁有讀取和修改您為使用者所存放每個屬性的存取權。例如，您有一個自訂屬性指出使用者是否為付費客戶。您的應用程式可能可以看到此屬性，但不能直接變更。反之，您會使用管理工具或背景處理程序來更新此屬性。您可以從 Amazon Cognito 主控台、Amazon Cognito API 或 AWS CLI設定使用者屬性的許可。預設情況下，除非您設定自訂屬性的讀取和寫入許可，否則任何新的自訂屬性都無法使用。根據預設，當您建立新的應用程式用戶端時，您會授予應用程式所有標準和自訂屬性的讀取和寫入許可。若要限制應用程式只能擁有所需的資訊量，請在應用程式用戶端組態中指派特定許可給屬性。

最佳實務是在建立應用程式用戶端時指定屬性讀取和寫入許可。授予應用程式用戶端存取應用程式操作所需的最低使用者屬性集。

**注意**  
[DescribeUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPoolClient.html) 只有在您設定非預設值的應用程式用戶端許可時，才會針對 `ReadAttributes` 和 `WriteAttributes` 傳回值。

**若要更新屬性許可 (AWS 管理主控台)**

1. 前往 中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home) AWS 管理主控台。如果主控台提示您，請輸入您的 AWS 登入資料。

1. 選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區。

1. 選擇**應用程式用戶端**選單，然後從清單中選擇應用程式用戶端。

1. 在**屬性許可**索引標籤中，選擇**編輯**。

1. 在 **Edit attribute read and write permissions** (編輯屬性讀取和寫入許可) 頁面設定您的讀取和寫入許可，然後選擇 **Save changes** (儲存變更)。

對使用自訂屬性的每個應用程式用戶端重複以上步驟。

對於每個應用程式用戶端，您可以將屬性標記為可讀或可寫入。同樣適用於標準和自訂屬性。您的應用程式可以擷取標記為可讀取之屬性的值，而且可以設定或修改標記為可寫入之屬性的值。如果您的應用程式嘗試為未授權寫入的屬性設定值，則 Amazon Cognito 會傳回 `NotAuthorizedException`。[GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html) 請求會在應用程式用戶端宣告中包含存取權杖；Amazon Cognito 只會針對您的應用程式用戶端能夠讀取的屬性傳回值。來自應用程式的使用者 ID 權杖僅包含與可讀屬性對應的宣告。所有應用程式用戶端都可以寫入使用者集區所需的屬性。只有在您同時為任何尚未具有值的必要屬性提供值時，您才能在 Amazon Cognito 使用者集區 API 請求中設定屬性的值。

自訂屬性對於讀取和寫入許可擁有不同的功能。您可針對使用者集區建立可變或不可變的屬性，也可以將其設定為任何應用程式用戶端的讀取或寫入屬性。

不可變的自訂屬性可在使用者建立期間更新一次。您可以使用以下方法填入不可變屬性。
+ `SignUp`：使用者在具有不可變自訂屬性的寫入存取權的應用程式用戶端註冊。使用者會為該屬性提供值。
+ 使用第三方 IdP 登入：使用者在具有不可變自訂屬性的寫入存取權的應用程式用戶端登入。您對於其 IdP 的使用者集區組態設有一項規則，會將提供的宣告映射至不可變屬性。這雖然可行，但並不實際，因為使用者只能登入一次。在第一次登入嘗試之後，Amazon Cognito 會拒絕嘗試，因為 會將規則映射至現在無法寫入的屬性。
+ `AdminCreateUser`：您為不可變屬性提供值。

### 具有範圍的屬性許可
<a name="user-pool-settings-attribute-scope-based-permissions"></a>

在您使用 AWS SDK 或 CDK、REST API 或 設定的使用者集區中 AWS CLI，您可以使用 OIDC 範圍 設定應用程式用戶端讀取或寫入存取權`oidc:profile`。`oidc:profile` 授予下列標準屬性的讀取或寫入存取權：
+ `name`
+ `family_name`
+ `given_name`
+ `middle_name`
+ `nickname`
+ `preferred_username`
+ `profile`
+ `picture`
+ `website`
+ `gender`
+ `birthdate`
+ `zoneinfo`
+ `locale`

此清單是 OIDC 標準屬性減去 `email`、`sub`、 `phone_number`和 `address`，如 [OIDC 規格第 2.4](https://openid.net/specs/openid-connect-basic-1_0.html#Scopes) 節所定義。如需可指派至應用程式用戶端的範圍相關資訊，請參閱 [範圍、M2M 和資源伺服器](cognito-user-pools-define-resource-servers.md)。

若要將應用程式用戶端設定為寫入`oidc:profile`範圍內的屬性，請在 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 或 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) API 請求中，將 [WriteAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html#CognitoUserPools-CreateUserPoolClient-request-WriteAttributes) 的值設定為 ，`oidc:profile`以及您想要允許應用程式修改的任何其他屬性。同樣地，若要授予這些屬性的讀取存取權，請將 `oidc:profile`新增至 [ReadAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html#CognitoUserPools-CreateUserPoolClient-request-ReadAttributes) 的值。

您可以在使用者集區建立之後，變更屬性的許可和範圍。