

适用于 JavaScript 的 AWS SDK v2 已终止支持。建议您迁移到 [适用于 JavaScript 的 AWS SDK v3](https://docs.aws.amazon.com//sdk-for-javascript/v3/developer-guide/)。有关更多详情和如何迁移的信息，请参阅本[公告](https://aws.amazon.com/blogs//developer/announcing-end-of-support-for-aws-sdk-for-javascript-v2/)。

# 使用 Web 联合身份验证来验证用户身份
<a name="loading-browser-credentials-federated-id"></a>

您可以使用 Web 身份联合验证直接配置各个身份提供商以访问 AWS 资源。AWS 目前支持通过多个身份提供商使用 Web 身份联合验证来验证用户身份：
+ [Login with Amazon](https://login.amazon.com)
+ [Facebook 登录](https://www.facebook.com/about/login)
+ [Google 登录](https://developers.google.com/identity/)

您必须首先向您的应用程序支持的提供商注册您的应用程序。接下来，创建 IAM 角色并为其设置权限。然后，您创建的 IAM 角色将通过相应的身份提供商授予您为其配置的权限。例如，您可以设置一个角色，允许通过 Facebook 登录的用户对您控制的特定 Amazon S3 桶具有读取权限。

有了配置了权限的 IAM 角色以及向所选身份提供商注册的应用程序之后，您可以将 SDK 设置为使用帮助程序代码获取 IAM 角色的凭证，如下所示：

```
AWS.config.credentials = new AWS.WebIdentityCredentials({
   RoleArn: 'arn:aws:iam::<AWS_ACCOUNT_ID>/:role/<WEB_IDENTITY_ROLE_NAME>',
   ProviderId: 'graph.facebook.com|www.amazon.com', // this is null for Google
   WebIdentityToken: ACCESS_TOKEN
});
```

`ProviderId` 参数中的值取决于指定的身份提供商。`WebIdentityToken` 参数中的值是从使用身份提供商成功登录时检索的访问令牌。有关如何为每个身份提供商配置和检索访问令牌的更多信息，请参阅身份提供商的相关文档。

## 步骤 1：向身份提供商注册
<a name="config-web-identity-register"></a>

首先，向您选择支持的身份提供商注册应用程序。系统会要求您提供信息来标识您的应用程序以及作者（在可能的情况下）。这可以确保身份提供商知道谁正在接收他们的用户信息。在每种情况下，身份提供商将发出用于配置用户角色的应用程序 ID。

## 步骤 2：为身份提供商创建 IAM 角色
<a name="config-web-identity-role"></a>

从身份提供商获取应用程序 ID 后，转到 IAM 控制台（地址：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)）以创建新的 IAM 角色。

**为身份提供商创建 IAM 角色**

1. 转到控制台的**角色**部分，然后选择**创建新角色**。

1. 键入新角色的名称，以帮助您跟踪其使用情况，例如 **facebookIdentity**，然后选择**下一步**。

1. 在**选择角色类型**中，选择**用于身份提供商访问的角色**。

1. 对于**授予 Web 身份提供商访问权限**，选择**选择**。

1. 在**身份提供商**列表中，选择要为此 IAM 角色使用的身份提供商。  
![\[选择“用于身份提供商访问的角色”。\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v2/developer-guide/images/iam-provider-select.png)

1. 在**应用程序 ID** 中键入身份提供商提供的应用程序 ID，然后选择**下一步**。

1. 配置要公开的资源的权限，以允许访问特定资源上的特定操作。有关 IAM 权限的更多信息，请参阅《IAM 用户指南》**中的 [AWS IAM 权限概述](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_permissions.html)。查看并根据需要自定义角色的信任关系，然后选择**下一步**。

1. 附加您需要的其他政策，然后选择**下一步**。有关 IAM policy 的更多信息，请参阅《IAM 用户指南》**中的 [IAM policy 概述](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。

1. 检查新角色，然后选择**创建角色**。

您可以为角色提供其他约束，例如将其限定为特定用户 ID。如果角色授予对资源的写入权限，请确保正确地将角色限定为具有正确权限的用户，否则具有 Amazon、Facebook 或 Google 身份的任何用户都将能够修改应用程序中的资源。

有关在 IAM 中使用 Web 身份联合验证的更多信息，请参阅《IAM 用户指南》**中的[关于 Web 身份联合验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html)。

## 步骤 3：登录后获取提供商访问令牌
<a name="config-web-identity-obtain-token"></a>

使用身份提供商的开发工具包为您的应用程序设置登录操作。您可以使用 OAuth 或 OpenID 从身份提供商下载并安装允许用户登录的 JavaScript 开发工具包。有关如何在应用程序中下载和设置开发工具包代码的信息，请参阅身份提供商的开发工具包文档：
+ [Login with Amazon](https://login.amazon.com/website)
+ [Facebook 登录](https://developers.facebook.com/docs/javascript)
+ [Google 登录](https://developers.google.com/identity/)

## 步骤 4：获取临时凭证
<a name="config-web-identity-get-credentials"></a>

在配置应用程序、角色和资源权限后，将代码添加到应用程序以获取临时凭证。通过 AWS Security Token Service 使用 Web 联合身份验证提供这些凭证。用户登录到身份提供商，该提供商返回访问令牌。针对您为此身份提供者创建的 IAM 角色，使用 ARN 设置 `AWS.WebIdentityCredentials` 对象：

```
AWS.config.credentials = new AWS.WebIdentityCredentials({
    RoleArn: 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<WEB_IDENTITY_ROLE_NAME>',
    ProviderId: 'graph.facebook.com|www.amazon.com', // Omit this for Google
    WebIdentityToken: ACCESS_TOKEN // Access token from identity provider
});
```

随后创建的服务对象将具有适当的凭证。在设置 `AWS.config.credentials` 属性之前创建的对象将不具有当前凭证。

您还可以在检索访问令牌之前创建 `AWS.WebIdentityCredentials`。这允许您在加载访问令牌之前创建依赖于凭证的服务对象。为此，请在不使用 `WebIdentityToken` 参数的情况下创建凭证对象：

```
AWS.config.credentials = new AWS.WebIdentityCredentials({
  RoleArn: 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<WEB_IDENTITY_ROLE_NAME>',
  ProviderId: 'graph.facebook.com|www.amazon.com' // Omit this for Google
});

// Create a service object
var s3 = new AWS.S3;
```

然后，在包含访问令牌的身份提供商开发工具包的回调中设置 `WebIdentityToken`：

```
AWS.config.credentials.params.WebIdentityToken = accessToken;
```