

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

# 使用 Web 聯合身分
<a name="WIF"></a>

如果您要撰寫以大量使用者為目標的應用程式，也可以選擇使用 *web 聯合身分*進行身分驗證和授權。Web 聯合身分讓您不再需要建立個別的使用者。反之，使用者可以登入身分提供者，然後從 AWS Security Token Service () 取得臨時安全登入資料AWS STS。然後，應用程式可以使用這些登入資料來存取 AWS 服務。

Web 聯合身分支援下列身分提供者：
+ 登入 Amazon
+ Facebook
+ Google

## Web 聯合身分的其他資源
<a name="WIF.AdditionalResources"></a>

下列資源可協助您進一步了解 Web 聯合身分：
+  AWS 開發人員部落格中的[使用 適用於 .NET 的 AWS SDK的 Web 聯合身分](https://aws.amazon.com/blogs/developer/web-identity-federation-using-the-aws-sdk-for-net)文章，會介紹如何使用 Facebook 的 Web 聯合身分。它包含 C\$1 中的程式碼片段，示範如何擔任具有 Web 身分的 IAM 角色，以及如何使用臨時安全登入資料來存取 AWS 資源。
+ [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/) 和 [適用於 Android 的 AWS Mobile SDK](https://aws.amazon.com/sdkforandroid/) 包含範例應用程式。這些應用程式所包含的程式碼示範如何調用身分提供者，接著示範如何使用這些供應商中的資訊來取得和使用暫時安全憑證。
+ 與[行動應用程式的 Web 聯合身分](https://aws.amazon.com/articles/4617974389850313)一文討論 Web 聯合身分，並顯示如何使用 Web 聯合身分存取 AWS 資源的範例。

## Web 聯合身分的範例政策
<a name="WIF.Example"></a>

若要顯示如何使用 DynamoDB 的 Web 聯合身分，請重新造訪 [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md) 中介紹的 *GameScores* 資料表。以下是 *GameScores* 的主索引鍵。


****  

| 資料表名稱 | 主索引鍵類型 | 分割區索引鍵名稱和類型 | 排序索引鍵名稱和類型 | 
| --- | --- | --- | --- | 
| GameScores (UserId、GameTitle ...) | 複合 | 屬性名稱：UserId 類型：字串 | 屬性名稱：GameTitle 類型：字串 | 

現在假設手機遊戲應用程式使用此資料表，而且應用程式需要支援數千或甚至數百萬使用者。就此規模而言，會變得很難管理個別應用程式使用者，且很難保證每位使用者只能存取 *GameScores* 資料表中的個別資料。好消息是，許多使用者都擁有第三方身分提供者 (例如 Facebook、Google 或 Login with Amazon) 的帳戶。因此可以合理地運用其中一個提供者來進行身分驗證任務。

若要使用 Web 聯合身分來執行這個操作，則應用程式開發人員必須向身分提供者 (例如 Login with Amazon) 註冊應用程式，並取得唯一應用程式 ID。接下來，開發人員需要建立 IAM 角色。(在此範例中，此角色的名稱為 *GameRole*。) 此角色必須已連接 IAM 政策文件、指定應用程式可存取 *GameScores* 資料表的條件。

使用者想要玩遊戲時，會從遊戲應用程式登入其 Login with Amazon 帳戶。應用程式接著會呼叫 AWS Security Token Service (AWS STS)，提供 Login with Amazon 應用程式 ID 並在 *GameRole* 中請求成員資格。 AWS STS 會傳回臨時 AWS 登入資料給應用程式，並允許其存取 *GameScores* 資料表，但需遵循 *GameRole* 政策文件。

下圖顯示這些部分如何一起使用。

![\[遊戲應用程式的工作流程。應用程式使用 Amazon ID 和 AWS STS 來取得存取 DynamoDB 資料表的臨時登入資料。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/wif-overview.png)


**Web 聯合身分概觀**

1. 應用程式會呼叫第三方身分提供者，以對使用者和應用程式進行身分驗證。身分提供者會將 Web 身分字符傳回給應用程式。

1. 應用程式會呼叫 AWS STS 並將 Web 身分字符做為輸入傳遞。 會 AWS STS 授權應用程式並提供其暫時 AWS 存取憑證。應用程式可以擔任 IAM 角色 (*GameRole*)，並根據角色的安全政策存取 AWS 資源。

1. 應用程式呼叫 DynamoDB 來存取 *GameScores* 資料表。因為應用程式已擔任 *GameRole*，所以受限於與該角色建立關聯的安全政策。政策文件會防止應用程式存取不屬於使用者的資料。

再說明一次，以下是顯示在 [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md) 中的 *GameRole* 安全性政策：

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`Condition` 子句決定 *GameScores* 在應用程式中可看到的項目。作法是比較 Login with Amazon ID 與 `UserId` 中的 `GameScores` 分割區索引鍵值。只有使用此政策中所列的其中一個 DynamoDB 動作才能處理屬於目前使用者的項目。但無法存取資料表中的其他項目。甚至，只能存取政策中所列的特定屬性。