

 [適用於 JavaScript 的 AWS SDK V3 API 參考指南](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/)詳細說明 第 3 版 適用於 JavaScript 的 AWS SDK (V3) 的所有 API 操作。

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

# 設定登入資料
<a name="setting-credentials"></a>

AWS 使用登入資料來識別誰正在呼叫 服務，以及是否允許存取請求的資源。

不論是在 web 瀏覽器或 Node.js 伺服器上執行，JavaScript 程式碼必須包含有效的登入資料，才能透過 API 存取服務。您可以將登入資料直接傳遞至服務物件，以為每個服務設定登入資料。

有幾個方式可以來設定在 web 瀏覽器中 Node.js 和 JavaScript 之間不同的登入資料。本節的主題說明如何在 Node.js 或 Web 瀏覽器設定登入資料。在每個案例中，選項會以建議的順序呈現。

## 登入資料的最佳實務
<a name="credentials-best-practices"></a>

適當設定登入資料可確保您的應用程式或瀏覽器指令碼可以存取所需的服務與資源，同時將可能影響關鍵任務應用程式或洩漏敏感資料的安全性問題的接觸降到最低。

在特定登入資料時要套用的重要原則，即是一律授予任務所需的最低權限。提供資源的最低許可並視需要新增進一步許可是較安全的作法，而不是提供超過最低權限的許可，而造成您必須修復在稍後可能發現的安全性問題。例如，除非您需要讀取和寫入個別資源，例如 Amazon S3 儲存貯體或 DynamoDB 資料表中的物件，否則請將這些許可設定為唯讀。

如需授予最低權限的詳細資訊，請參閱《*IAM 使用者指南*》中最佳實務主題的[授予最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)一節。

**Topics**
+ [登入資料的最佳實務](#credentials-best-practices)
+ [在 Node.js 中設定登入資料](setting-credentials-node.md)
+ [在 Web 瀏覽器中設定登入資料](setting-credentials-browser.md)

# 在 Node.js 中設定登入資料
<a name="setting-credentials-node"></a>

我們建議在本機開發 的新使用者，而不是由其雇主提供身分驗證方法來設定 AWS IAM Identity Center。如需詳細資訊，請參閱[使用 進行 SDK 身分驗證 AWS](getting-your-credentials.md)。

在 Node.js 中將登入資料提供給軟體開發套件有幾種方法。有些方法比較安全，有些在開發應用程式時更方便。在 Node.js 中取得登入資料時，請小心依賴多個來源，例如環境變數和您載入的 JSON 檔案。您可以變更程式碼執行所用的許可，而不需了解發生的變更。

適用於 JavaScript 的 AWS SDK V3 在 Node.js 中提供預設登入資料提供者鏈結，因此您不需要明確提供登入資料提供者。預設[登入資料提供者鏈結](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html#credentialProviderChain)會嘗試在指定優先順序中從各種不同來源解析登入資料，直到其中一個來源傳回登入資料為止。您可以在[此處](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-credential-providers/#fromnodeproviderchain)找到適用於 JavaScript V3 的 SDK 的登入資料提供者鏈結。

## 登入資料提供者鏈結
<a name="credchain"></a>

所有 SDKs 都有一系列位置 （或來源） 可供他們檢查，以取得可用於向 提出請求的有效登入資料 AWS 服務。找到有效的憑證後，系統就會停止搜尋。此系統化搜尋稱為預設登入資料提供者鏈結。

對於鏈結中的每個步驟，有不同的方法來設定值。直接在程式碼中設定值一律優先，接著設定為環境變數，然後在共用 AWS `config`檔案中設定。如需詳細資訊，請參閱 *AWS SDKs 和工具參考指南*中的[設定優先順序](https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html#precedenceOfSettings)。

*AWS SDKs和工具參考指南*提供 AWS SDKs和 所使用的開發套件組態設定資訊 AWS CLI。若要進一步了解如何透過共用 AWS `config`檔案設定 SDK，請參閱[共用組態和登入資料檔案](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。若要進一步了解如何透過設定環境變數來設定 SDK，請參閱[環境變數支援](https://docs.aws.amazon.com/sdkref/latest/guide/environment-variables.html)。

若要使用 驗證 AWS， 會依照下表列出的順序 適用於 JavaScript 的 AWS SDK 檢查登入資料提供者。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html)

如果您遵循建議的方法讓新使用者開始使用，您可以在開始使用主題[使用 進行 SDK 身分驗證 AWS](getting-your-credentials.md)期間設定 AWS IAM Identity Center 身分驗證。其他身分驗證方法適用於不同的情況。為了避免安全風險，我們建議您一律使用短期登入資料。如需其他身分驗證方法程序，請參閱*AWS SDKs和工具參考指南》中的身分*[驗證和存取](https://docs.aws.amazon.com/sdkref/latest/guide/access.html)。

本節的主題說明如何在 Node.js 中載入登入資料。

**Topics**
+ [登入資料提供者鏈結](#credchain)
+ [從 Amazon EC2 的 IAM 角色載入 Node.js 中的登入資料](loading-node-credentials-iam.md)
+ [載入 Node.js Lambda 函數的登入資料](loading-node-credentials-lambda.md)

# 從 Amazon EC2 的 IAM 角色載入 Node.js 中的登入資料
<a name="loading-node-credentials-iam"></a>

如果您在 Amazon EC2 執行個體上執行 Node.js 應用程式，您可以利用 Amazon EC2 的 IAM 角色自動提供登入資料給執行個體。如果您將執行個體設定為使用 IAM 角色，開發套件會自動選取應用程式的 IAM 登入資料，無需手動提供登入資料。

如需將 IAM 角色新增至 Amazon EC2 執行個體的詳細資訊，請參閱 [Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。

# 載入 Node.js Lambda 函數的登入資料
<a name="loading-node-credentials-lambda"></a>

建立 AWS Lambda 函數時，您必須建立具有執行函數許可的特殊 IAM 角色。此角色稱為*執行角色*。設定 Lambda 函數時，您必須指定您建立的 IAM 角色做為對應的執行角色。

執行角色會提供 Lambda 函數執行 和 呼叫其他 Web 服務所需的登入資料。因此，您不需要提供登入資料給在 Lambda 函數中寫入的 Node.js 程式碼。

如需建立 Lambda 執行角色的詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[管理許可：使用 IAM 角色 （執行角色）](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role)。

# 在 Web 瀏覽器中設定登入資料
<a name="setting-credentials-browser"></a>

透過瀏覽器指令碼將登入資料提供給軟體開發套件有幾種方法。有些方法比較安全，有些在開發指令碼時更方便。

 以下是您可以依建議順序提供登入資料的方式：

1. 使用 Amazon Cognito Identity 驗證使用者並提供登入資料

1. 使用 Web 聯合身分

**警告**  
我們不建議硬式編碼指令碼中的 AWS 登入資料。將登入資料寫死會造成存取金鑰 ID 和私密存取金鑰遭暴露的風險。

**Topics**
+ [使用 Amazon Cognito Identity 來驗證使用者](loading-browser-credentials-cognito.md)

# 使用 Amazon Cognito Identity 來驗證使用者
<a name="loading-browser-credentials-cognito"></a>

為瀏覽器指令碼取得 AWS 登入資料的建議方法是使用 Amazon Cognito Identity 登入資料用戶端 `CognitoIdentityClient`。Amazon Cognito 可透過第三方身分提供者對使用者進行身分驗證。

若要使用 Amazon Cognito Identity，您必須先在 Amazon Cognito 主控台中建立身分集區。身分集區代表應用程式提供給使用者的身分群組。提供給使用者的身分可唯一識別每個使用者帳戶。Amazon Cognito 身分不是憑證。在 AWS Security Token Service () 中使用 Web 聯合身分支援交換憑證AWS STS。

Amazon Cognito 可協助您管理多個身分提供者的身分抽象。接著，會將載入的身分交換為在 AWS STS中的登入資料。

## 設定 Amazon Cognito Identity 登入資料物件
<a name="browser-cognito-configuration"></a>

如果您尚未建立身分集區，請先在 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito)中建立身分集區，以與瀏覽器指令碼搭配使用，再設定 Amazon Cognito 用戶端。建立身分集區的已驗證和未驗證 IAM 角色，並將其建立關聯。如需詳細資訊，請參閱《*Amazon Cognito 開發人員指南*》中的[教學課程：建立身分集](https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-create-identity-pool.html)區。

未驗證的使用者未驗證其身分，因此此角色適合應用程式的訪客使用者，或在使用者是否驗證其身分無關緊要的情況下。已驗證使用者透過驗證其身分的第三方身分提供者來登入應用程式。請務必適當地限制資源許可範圍，以避免從未經授權的使用者授與資源的存取權。

設定身分集區之後，請使用 中的 `fromCognitoIdentityPool`方法`@aws-sdk/credential-providers`，從身分集區擷取登入資料。在建立 Amazon S3 用戶端的下列範例中，將 *AWS\$1REGION* 取代為區域，並將 *IDENTITY\$1POOL\$1ID* 取代為身分集區 ID。

```
// Import required AWS SDK clients and command for Node.js
import {S3Client} from "@aws-sdk/client-s3";
import {fromCognitoIdentityPool} from "@aws-sdk/credential-providers";

const REGION = AWS_REGION;

const s3Client = new S3Client({
  region: REGION,
  credentials: fromCognitoIdentityPool({
    clientConfig: { region: REGION }, // Configure the underlying CognitoIdentityClient.
    identityPoolId: 'IDENTITY_POOL_ID',
    logins: {
            // Optional tokens, used for authenticated login.
        },
  })
});
```

選用的 `logins` 屬性是身分提供者名稱與這些身分提供者的身分權杖的對應。您從身分提供者取得權杖的方式，取決於您使用的供應商。例如，如果您使用 Amazon Cognito 使用者集區做為身分驗證提供者，您可以使用類似以下的方法。

```
// Get the Amazon Cognito ID token for the user. 'getToken()' below.
let idToken = getToken();
let COGNITO_ID = "COGNITO_ID"; // 'COGNITO_ID' has the format 'cognito-idp.REGION.amazonaws.com/COGNITO_USER_POOL_ID'
let loginData = {
  [COGNITO_ID]: idToken,
};
const s3Client = new S3Client({
    region: REGION,
    credentials: fromCognitoIdentityPool({
    clientConfig: { region: REGION }, // Configure the underlying CognitoIdentityClient.
    identityPoolId: 'IDENTITY_POOL_ID',
    logins: loginData
  })
});

// Strips the token ID from the URL after authentication.
window.getToken = function () {
  var idtoken = window.location.href;
  var idtoken1 = idtoken.split("=")[1];
  var idtoken2 = idtoken1.split("&")[0];
  var idtoken3 = idtoken2.split("&")[0];
  return idtoken3;
};
```

## 將未驗證的使用者切換為已驗證的使用者
<a name="browser-switching-unauthenticated-users"></a>

Amazon Cognito 支援已驗證和未驗證的使用者。未驗證的使用者即使沒有以任何身分提供者登入，也能存取您的資源。這個程度的存取能在使用者登入前就顯示內容，非常有用。每個未驗證的使用者在 Amazon Cognito 中都有唯一的身分，即使他們尚未個別登入和驗證。

### 最初未驗證的使用者
<a name="browser-initially-unauthenticated-user"></a>

使用者通常會以未經驗證的角色開始，您會為該角色設定組態物件的登入資料屬性，而不使用 `logins` 屬性。在這種情況下，您的預設登入資料可能如下所示：

```
// Import the required 適用於 JavaScript 的 AWS SDK v3 modules.                   
import {fromCognitoIdentityPool} from "@aws-sdk/credential-providers";
// Set the default credentials.
const creds = fromCognitoIdentityPool({
  identityPoolId: 'IDENTITY_POOL_ID',
  clientConfig: { region: REGION } // Configure the underlying CognitoIdentityClient.
});
```

### 切換到已驗證使用者
<a name="switch-to-authenticated"></a>

當未驗證的使用者登入身分提供者且您擁有權杖時，您可以呼叫更新憑證物件並新增`logins`權杖的自訂函數，將使用者從未驗證切換到已驗證。

```
// Called when an identity provider has a token for a logged in user
function userLoggedIn(providerName, token) {
  creds.params.Logins = creds.params.logins || {};
  creds.params.Logins[providerName] = token;
                    
  // Expire credentials to refresh them on the next request
  creds.expired = true;
}
```