

# 使用 Web 身份联合验证编写应用程序
<a name="WIF.RunningYourApp"></a>

要使用 Web 联合身份验证，应用程序必须代入您创建的 IAM 角色。这样，应用程序将遵守您附加到该角色的访问策略。

在运行期间，如果您的应用程序使用 Web 联合身份验证，它必须遵循以下步骤：

1. **使用第三方身份提供商进行身份验证。**您的应用程序必须使用身份提供商提供的接口对其进行调用。验证用户身份的确切方式取决于提供商和运行应用程序的平台。通常，如果用户尚未登录，则身份提供商负责显示该提供商的登录页面。

   身份提供商验证用户身份后，将向应用程序返回一个 Web 身份验证令牌。此令牌格式取决于提供商，但是，一般是非常长的字符串。

1. **获取临时 AWS 安全凭证。**要完成此操作，您的应用程序要向 `AssumeRoleWithWebIdentity` (AWS Security Token Service) 发送一个 AWS STS 请求。此请求包含以下内容：
   + 从之前步骤获取的 Web 身份验证令牌
   + 从身份提供商获取的应用程序 ID。
   + 您为此应用程序身份提供商创建的 IAM 角色的 Amazon Resource Name (ARN)

   AWS STS 会返回一组在一定时间后过期的 AWS 安全凭证（默认情况下是 3600 秒后过期）。

   下面是一个示例请求和 `AssumeRoleWithWebIdentity` 中 AWS STS 操作的响应。Web 身份验证令牌是从 Login with Amazon 身份提供商获取的。

   ```
   GET / HTTP/1.1
   Host: sts.amazonaws.com
   Content-Type: application/json; charset=utf-8
   URL: https://sts.amazonaws.com/?ProviderId=www.amazon.com
   &DurationSeconds=900&Action=AssumeRoleWithWebIdentity
   &Version=2011-06-15&RoleSessionName=web-identity-federation
   &RoleArn=arn:aws:iam::123456789012:role/GameRole
   &WebIdentityToken=Atza|IQEBLjAsAhQluyKqyBiYZ8-kclvGTYM81e...(remaining characters omitted)
   ```

   

   ```
   <AssumeRoleWithWebIdentityResponse
     xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
     <AssumeRoleWithWebIdentityResult>
       <SubjectFromWebIdentityToken>amzn1.account.AGJZDKHJKAUUSW6C44CHPEXAMPLE</SubjectFromWebIdentityToken>
       <Credentials>
         <SessionToken>AQoDYXdzEMf//////////wEa8AP6nNDwcSLnf+cHupC...(remaining characters omitted)</SessionToken>
         <SecretAccessKey>8Jhi60+EWUUbbUShTEsjTxqQtM8UKvsM6XAjdA==</SecretAccessKey>
         <Expiration>2013-10-01T22:14:35Z</Expiration>
         <AccessKeyId>06198791C436IEXAMPLE</AccessKeyId>
       </Credentials>
       <AssumedRoleUser>
         <Arn>arn:aws:sts::123456789012:assumed-role/GameRole/web-identity-federation</Arn>
         <AssumedRoleId>AROAJU4SA2VW5SZRF2YMG:web-identity-federation</AssumedRoleId>
       </AssumedRoleUser>
     </AssumeRoleWithWebIdentityResult>
     <ResponseMetadata>
       <RequestId>c265ac8e-2ae4-11e3-8775-6969323a932d</RequestId>
     </ResponseMetadata>
   </AssumeRoleWithWebIdentityResponse>
   ```

1. **访问 AWS 资源。**AWS STS 的响应包含访问 DynamoDB 资源时您的应用程序所需的信息：
   + `AccessKeyID`、`SecretAccessKey` 和 `SessionToken` 字段包含的安全凭证仅对此用户和此应用程序有效。
   + `Expiration` 字段标明了这些凭证的时间限制，超出时间后，凭证将不再有效。
   + `AssumedRoleId` 字段包含应用程序代入的会话特定 IAM 角色的名称。应用程序将遵守 IAM 策略文档中针对会话持续期间的访问控制。
   + `SubjectFromWebIdentityToken` 字段包含显示在此特定身份提供商的 IAM 策略变量中的唯一 ID。下面是支持的提供商的 IAM 策略变量以及一些示例值：  
****    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/WIF.RunningYourApp.html)

有关使用这些策略变量的示例 IAM 策略，请参阅[策略示例：使用条件实现精细访问控制](specifying-conditions.md#FGAC_DDB.Examples)。

有关 AWS STS 如何生成临时安全凭证的更多信息，请参阅《IAM 用户指南》**中的[请求临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)。