授權與驗證 - AWS AppSync

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

授權與驗證

本區段說明為您的應用程式設定安全性與資料保護的選項。

授權類型

您可以透過五種方式授權應用程式與 AWS AppSync GraphQL API 進行互動。您可以在 AWS AppSync API 或 CLI 呼叫中指定下列其中一個授權類型值,以指定所使用的授權類型:

  • API_KEY

    使用 API 金鑰。

  • AWS_LAMBDA

    用於使用 AWS Lambda 功能。

  • AWS_IAM

    適用於使用 AWS Identity and Access Management (IAM) 許可。

  • OPENID_CONNECT

    對於使用您的 OpenID Connect 提供者。

  • AMAZON_COGNITO_USER_POOLS

    用於使用 Amazon Cognito 用戶池。

這些基本授權類型適用於大多數的開發人員。對於更進階的使用案例,您可以透過主控台、CLI 和 AWS CloudFormation. 對於其他授權模式, AWS AppSync 提供採用上述值的授權類型 (即API_KEYAWS_LAMBDAAWS_IAMOPENID_CONNECT、、和AMAZON_COGNITO_USER_POOLS)。

當您指定API_KEYAWS_LAMBDA、或AWS_IAM做為主要或預設授權類型時,您無法再將它們指定為其中一種額外的授權模式。同樣,您不能複製API_KEYAWS_LAMBDA也不能在其他授權模式中AWS_IAM進行複製。您可以使用多個 Amazon Cognito 使用者集區和 OpenID Connect 供應商。但是,您無法在預設授權模式和任何其他授權模式之間使用複製的 Amazon Cognito 使用者集區或 OpenID Connect 提供者。您可以使用對應的組態規則運算式,為 Amazon Cognito 使用者集區或 OpenID Connect 提供者指定不同的用戶端。

API 金鑰授權

未驗證的 API 相較於已驗證 API 需要更嚴格的調節。其中一種控制未授權 GraphQL 端點調節的方法就是使用 API 金鑰。API 金鑰是應用程式中的硬式編碼值,由 AWS AppSync 服務在您建立未經驗證的 GraphQL 端點時產生。您可以從主控台、CLI 或 AWS AppSync API 參考輪換 API 金鑰。

Console
  1. 登入 AWS Management Console 並開啟AppSync主控台

    1. API 儀表板中,選擇您的 GraphQL API。

    2. 側邊欄中,選擇設定

  2. 在「預設授權模式」下,選擇「API 金鑰」。

  3. 在「API 金鑰」表格中,選擇「新增 API 金鑰」。

    表格中會產生新的 API 金鑰。

    1. 若要刪除舊的 API 金鑰,請在表格中選取 API 金鑰,然後選擇 [刪除]。

  4. 選擇頁面底部的 Save (儲存)。

CLI
  1. 如果您尚未這樣做,請設定您對 AWS CLI 的存取權限。如需詳細資訊,請參閱組態基本知識

  2. 透過執行update-graphql-api命令來建立 GraphQL API 物件。

    您需要為此特定命令輸入兩個參數:

    1. api-id的 GraphQL 應用程式介面。

    2. 您的 API name 的新功能。您可以使用相同的name

    3. authentication-type,這將是API_KEY

    注意

    必須設定其他參數Region,例如,但通常會預設為 CLI 組態值。

    範例命令可能如下所示:

    aws appsync update-graphql-api --api-id abcdefghijklmnopqrstuvwxyz --name TestAPI --authentication-type API_KEY

    輸出將在 CLI 中返回。以下是 JSON 中的一個示例:

    { "graphqlApi": { "xrayEnabled": false, "name": "TestAPI", "authenticationType": "API_KEY", "tags": {}, "apiId": "abcdefghijklmnopqrstuvwxyz", "uris": { "GRAPHQL": "https://s8i3kk3ufhe9034ujnv73r513e.appsync-api.us-west-2.amazonaws.com/graphql", "REALTIME": "wss://s8i3kk3ufhe9034ujnv73r513e.appsync-realtime-api.us-west-2.amazonaws.com/graphql" }, "arn": "arn:aws:appsync:us-west-2:348581070237:apis/abcdefghijklmnopqrstuvwxyz" } }

API 金鑰可設定為最多 365 天,您可以從過期日開始再延展現有的過期日期的最多 365 天。用於開發目的或者需安全公開公用 API 時,建議使用 API 金鑰。

在用戶端上,由標題 x-api-key 指定 API 金鑰。

例如,如果您的 API_KEY'ABC123',您可以經由 curl 來傳送 GraphQL 查詢,如下所示:

$ curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:ABC123" -d '{ "query": "query { movies { id } }" }' https://YOURAPPSYNCENDPOINT/graphql

AW_Lambda 授權

您可以使用 AWS Lambda 函數實現自己的 API 授權邏輯。您可以將 Lambda 函數用於主要或次要授權者,但每個 API 只能有一個 Lambda 授權函數。使用 Lambda 函數進行授權時,適用下列條件:

  • 如果 API 啟用了AWS_LAMBDAAWS_IAM授權模式,則無法將 Sigv4 簽名用作AWS_LAMBDA授權令牌。

  • 如果 API 具有AWS_LAMBDAOPENID_CONNECT授權模式或啟用了AMAZON_COGNITO_USER_POOLS授權模式,則 OIDC 令牌不能用作AWS_LAMBDA授權令牌。請注意,OIDC 令牌可以是承載計劃。

  • Lambda 函數不得為解析器傳回超過 5MB 的上下文資料。

例如,如果您的授權令牌是'ABC123',則可以通過 curl 發送 GraphQL 查詢,如下所示:

$ curl -XPOST -H "Content-Type:application/graphql" -H "Authorization:ABC123" -d '{ "query": "query { movies { id } }" }' https://YOURAPPSYNCENDPOINT/graphql

Lambda 函數在每個查詢或突變之前被調用。返回值可以根據 API ID 和身份驗證令牌進行緩存。默認情況下,緩存不打開,但可以在 API 級別或通過在函數的返回ttlOverride值中設置值來啟用緩存。

如果需要,可以指定在調用函數之前驗證授權令牌的正則表達式。這些正則表達式用於在調用函數之前驗證授權令牌是否具有正確的格式。使用與此正則表達式不匹配的令牌的任何請求都將被自動拒絕。

用於授權的 Lambda 函數需appsync.amazonaws.com要對其套用主體政策,以 AWS AppSync 允許呼叫它們。這個動作會在 AWS AppSync 主控台中自動完成; AWS AppSync 主控台會移除原則。如需將政策附加至 Lambda 函數的詳細資訊,請參閱 AWS Lambda 開發人員指南中的資源型政策

您指定的 Lambda 函數將收到具有以下形狀的事件:

{ "authorizationToken": "ExampleAUTHtoken123123123", "requestContext": { "apiId": "aaaaaa123123123example123", "accountId": "111122223333", "requestId": "f4081827-1111-4444-5555-5cf4695f339f", "queryString": "mutation CreateEvent {...}\n\nquery MyQuery {...}\n", "operationName": "MyQuery", "variables": {} } "requestHeaders": { application request headers } }

event對象包含從應用程序客戶端發送到的請求中發送的標頭 AWS AppSync。

授權函數必須至少返回一個布爾值isAuthorized,指示請求是否被授權。 AWS AppSync 可辨識從 Lambda 授權函數傳回的下列金鑰:

isAuthorized(布林值,必要)

布林值,指出中的值authorizationToken是否獲得對 GraphQL API 進行呼叫的授權。

如果此值為真,則會繼續執行 GraphQL API。如果這個值是假的,一個UnauthorizedException被提高

deniedFields(字符串列表,可選)

即使從解析器返回一個值null,其列表也會被強制更改為。

每個項目都是形式的完全合格欄位 ARN arn:aws:appsync:us-east-1:111122223333:apis/GraphQLApiId/types/TypeName/fields/FieldName 或簡短格式。TypeName.FieldName當兩個 API 共享一個 Lambda 函數授權器時,應使用完整的 ARN 表單,並且兩個 API 之間的常見類型和字段之間可能存在歧義。

resolverContext(JSON 對象,可選)

在解析器模板$ctx.identity.resolverContext中可見的 JSON 對象。例如,如果解析器返回以下結構:

{ "isAuthorized":true "resolverContext": { "banana":"very yellow", "apple":"very green" } }

解析程式範本ctx.identity.resolverContext.apple中的值將是 "" very green。該對resolverContext象僅支持鍵值對。不支援巢狀索引鍵。

警告

此 JSON 物件的總大小不得超過 5MB。

ttlOverride(整數,可選)

應快取回應的秒數。如果未傳回任何值,則會使用 API 的值。如果這是 0,則不會緩存響應。

Lambda 授權者的逾時時間為 10 秒。我們建議您設計函數,以盡可能在最短的時間內執行,以擴展 API 的效能。

多個 AWS AppSync API 可以共用單一驗證 Lambda 函數。不允許跨帳戶授權者使用。

在多個 API 之間共用授權函式時,請注意,短格式欄位名稱 (typename.fieldname) 可能會無意間隱藏欄位。若要消除中某個欄位的歧義deniedFields,您可以以的形式指定明確的欄位 ARN。arn:aws:appsync:region:accountId:apis/GraphQLApiId/types/typeName/fields/fieldName

若要在中新增 Lambda 函數做為預設授權模式 AWS AppSync:

Console
  1. 登入主 AWS AppSync 控台並瀏覽至您要更新的 API。

  2. 導航到 API 的「設置」頁面。

    將 API 層級授權變更為。AWS Lambda

  3. 選擇要對其進行 API 呼叫授權的 AWS 區域 和 Lambda ARN。

    注意

    系統會自動新增適當的主體政策, AWS AppSync 讓您呼叫 Lambda 函數。

  4. 選擇性地設定回應 TTL 和權杖驗證規則運算式。

AWS CLI
  1. 將下列原則附加至正在使用的 Lambda 函數:

    aws lambda add-permission --function-name "my-function" --statement-id "appsync" --principal appsync.amazonaws.com --action lambda:InvokeFunction --output text
    重要

    如果您希望將函數的政策鎖定為單一 GraphQL API,則可以執行以下命令:

    aws lambda add-permission --function-name “my-function” --statement-id “appsync” --principal appsync.amazonaws.com --action lambda:InvokeFunction --source-arn “<my AppSync API ARN>” --output text
  2. 更新您的 AWS AppSync API 以使用給定的 Lambda 函數 ARN 作為授權者:

    aws appsync update-graphql-api --api-id example2f0ur2oid7acexample --name exampleAPI --authentication-type AWS_LAMBDA --lambda-authorizer-config authorizerUri="arn:aws:lambda:us-east-2:111122223333:function:my-function"
    注意

    您也可以包含其他組態選項,例如 Token 規則運算式。

下列範例說明 Lambda 函數,該函數示範 Lambda 函數用作 AWS AppSync 授權機制時可能具有的各種驗證和失敗狀態:

def handler(event, context): # This is the authorization token passed by the client token = event.get('authorizationToken') # If a lambda authorizer throws an exception, it will be treated as unauthorized. if 'Fail' in token: raise Exception('Purposefully thrown exception in Lambda Authorizer.') if 'Authorized' in token and 'ReturnContext' in token: return { 'isAuthorized': True, 'resolverContext': { 'key': 'value' } } # Authorized with no f if 'Authorized' in token: return { 'isAuthorized': True } # Partial authorization if 'Partial' in token: return { 'isAuthorized': True, 'deniedFields':['user.favoriteColor'] } if 'NeverCache' in token: return { 'isAuthorized': True, 'ttlOverride': 0 } if 'Unauthorized' in token: return { 'isAuthorized': False } # if nothing is returned, then the authorization fails. return {}

規避簽名 V4 和 OIDC 令牌授權限制

當啟用某些授權模式時,可以使用以下方法來避免無法使用您的 SIGv4 簽名或 OIDC 權杖做為 Lambda 授權權杖的問題。

如果您想要在為 API 啟用AWS_IAM和授權模式時使用 Sigv4 簽章做為 Lambda AWS_LAMBDA 授權權杖,請執行下列動作: AWS AppSync

  • 若要建立新的 Lambda 授權權杖,請在 Sigv4 簽章中新增隨機字尾和/或前置字元。

  • 若要擷取原始 Sigv4 簽章,請移除 Lambda 授權權杖中的隨機前置詞和/或尾碼,以更新 Lambda 函數。然後,使用原始的 Sigv4 簽名進行身份驗證。

如果您想要在為 API 啟用授權模式或AMAZON_COGNITO_USER_POOLS和授權模式時使用 OIDC OPENID_CONNECT 權杖做為 Lambda AWS_LAMBDA 授權權杖,請執行以下操作: AWS AppSync

  • 若要建立新的 Lambda 授權權杖,請在 OIDC 權杖中新增隨機字尾和/或前置字元。Lambda 授權令牌不應包含承載方案前綴。

  • 若要擷取原始 OIDC 權杖,請移除 Lambda 授權權杖中的隨機字首和/或尾碼,以更新 Lambda 函數。然後,使用原始的 OIDC 令牌進行身份驗證。

IAM 授權

此授權類型會在 GraphQL API 上強制執行簽AWS 章版本 4 簽署程序。您可以將身分與存取管理 (IAM) 的存取政策與此授權類型建立關聯。您的應用程式可以使用存取金鑰 (由存取金鑰 ID 和秘密存取金鑰組成),或使用 Amazon Cognito 聯合身分提供的短期暫時登入資料,利用此關聯性。

如果您希望角色擁有執行所有資料操作的存取權限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "appsync:GraphQL" ], "Resource": [ "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/*" ] } ] }

您可以YourGraphQLApiId從主 AppSync控台的主要 API 清單頁面,直接在 API 名稱下找到。或者,您可以使用 CLI 來取得該資訊:aws appsync list-graphql-apis

如果您想要僅限制對於特定 GraphQL 操作的存取權限,您可以在根 QueryMutation 以及 Subscription 欄位執行此操作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "appsync:GraphQL" ], "Resource": [ "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-1>", "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-2>", "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Mutation/fields/<Field-1>", "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Subscription/fields/<Field-1>" ] } ] }

例如,假設您有以下結構描述且您想要限制取得所有文章的存取:

schema { query: Query mutation: Mutation } type Query { posts:[Post!]! } type Mutation { addPost(id:ID!, title:String!):Post! }

角色的對應 IAM 政策 (例如,您可以附加至 Amazon Cognito 身分集區) 如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "appsync:GraphQL" ], "Resource": [ "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/posts" ] } ] }

開放連接授權

此授權類型會強制執行 OIDC 相容服務所提供的 OpenID 連線 (OIDC) 權杖。您的應用程式可以運用由 OIDC 提供者定義的使用者與權限來控制存取權限。

發行者 URL 是您提供給的唯一必要組態值 AWS AppSync (例如,https://auth.example.com)。此網址必須可透過 HTTPS 進行定址。 AWS AppSync 附加/.well-known/openid-configuration到發行者網址,並https://auth.example.com/.well-known/openid-configuration根據 OpenID Connect 發現規範找到 Open ID 配置。它預期會在此 URL 擷取相容於 RFC5785 的 JSON 文件。這個 JSON 文檔必須包含一個jwks_uri密鑰,該密鑰指向帶有簽名密鑰的 JSON Web 密鑰集(JWKS)文檔。 AWS AppSync 要求 JWKS 包含和的 kty JSON 欄位。kid

AWS AppSync 支持廣泛的簽名算法。

簽署演算法
RS256
RS384
RS512
PS256
PS384
PS512
HS256
HS384
HS512
ES256
ES384
ES512

我們建議您使用 RSA 演算法。由提供者發行的字符必須包含字符發行的時間 (iat),且可包含驗證時的時間 (auth_time)。您可以提供 OpenID Connect 組態中的發行時間的 TTL 值 (iatTTL) 和身分驗證時間 (authTTL),以供額外驗證。如果您的提供者授權多個應用程式,您也可以提供用於根據用戶端 ID 授權的一般表達式 (clientId)。當 OpenID Connect 配置中存在時,通過要求與令牌中的audazp聲明匹配clientId來 AWS AppSync 驗證聲明。clientId

若要驗證多個用戶端 ID,請使用管線運算子 (「|」),它是規則運算式中的「or」。例如,如果您的 OIDC 應用程式有四個具有用戶端識別碼 (例如 0A1S2D、1F4G9H、1J6L4B、6GS5MG) 的用戶端,以便僅驗證前三個用戶端識別碼,您可以在用戶端識別碼欄位中放置 1F4G9H|1J6L4B|6GS5MG。

亞馬遜用戶池授權

此授權類型會強制執行 Amazon Cognito 使用者集區提供的 OIDC 權杖。您的應用程式可以利用來自其他 AWS 帳戶的使用者集區和使用者集區中的使用者和群組,並將這些使用者和群組與 GraphQL 欄位關聯以控制存取。

使用 Amazon Cognito 使用者集區時,您可以建立使用者所屬的群組。此資訊會在傳送 GraphQL 作業時,以應用程式在授權標頭 AWS AppSync 中傳送至的 JWT 權杖編碼。您可以使用結構描述上的 GraphQL 指令來控制哪些群組可以叫用欄位上的哪些解析程式,進而為您的客戶提供更具控制性的存取權限。

例如,假設您有下列 GraphQL 結構描述:

schema { query: Query mutation: Mutation } type Query { posts:[Post!]! } type Mutation { addPost(id:ID!, title:String!):Post! } ...

如果您在 Amazon Cognito 用戶池中有兩個組-博客作者和讀者-並且您想要限制讀者,以便他們無法添加新條目,那麼您的模式應該如下所示:

schema { query: Query mutation: Mutation }
type Query { posts:[Post!]! @aws_auth(cognito_groups: ["Bloggers", "Readers"]) } type Mutation { addPost(id:ID!, title:String!):Post! @aws_auth(cognito_groups: ["Bloggers"]) } ...

請注意,如果您想要預設使用特定存取策略,可以省 grant-or-deny 略該@aws_auth指令。當您透過主控台或透過下列 CLI 命令建立 GraphQL API 時,您可以在使用者集區設定中指定 grant-or-deny 策略:

$ aws appsync --region us-west-2 create-graphql-api --authentication-type AMAZON_COGNITO_USER_POOLS --name userpoolstest --user-pool-config '{ "userPoolId":"test", "defaultEffect":"ALLOW", "awsRegion":"us-west-2"}'

使用其他授權模式

當您新增其他授權模式時,您可以直接在 AWS AppSync GraphQL API 層級設定授權設定 (也就是您可以直接在GraphqlApi物件上設定的authenticationType欄位) 上設定授權設定,並做為結構描述的預設值。這表示沒有特定指示詞的任何類型必須傳遞 API 層級授權設定。

在結構描述層級上,您可以在結構描述上使用指示詞來指定其他授權模式。您可以在結構描述中的個別欄位上指定授權模式。例如,針對 API_KEY 授權,您可以在結構描述物件類型定義/欄位上使用 @aws_api_key。結構描述欄位和物件類型定義支援下列指示詞:

  • @aws_api_key - 指定欄位會經由 API_KEY 授權。

  • @aws_iam - 指定欄位會經由 AWS_IAM 授權。

  • @aws_oidc - 指定欄位會經由 OPENID_CONNECT 授權。

  • @aws_cognito_user_pools - 指定欄位會經由 AMAZON_COGNITO_USER_POOLS 授權。

  • @aws_lambda - 指定欄位會經由 AWS_LAMBDA 授權。

您無法將 @aws_auth 指示詞搭配使用其他授權模式。@aws_auth 只能在沒有其他授權模式的 AMAZON_COGNITO_USER_POOLS 授權內容中運作。但是,您可以搭配相同的引數,使用 @aws_cognito_user_pools 指示詞來取代 @aws_auth 指示詞。這兩者的主要差異是您可以在任何欄位和物件類型定義上指定 @aws_cognito_user_pools

為了了解其他授權模式如何運作以及如何在結構描述上指定這些模式,讓我們看看以下結構描述:

schema { query: Query mutation: Mutation } type Query { getPost(id: ID): Post getAllPosts(): [Post] @aws_api_key } type Mutation { addPost( id: ID! author: String! title: String! content: String! url: String! ): Post! } type Post @aws_api_key @aws_iam { id: ID! author: String title: String content: String url: String ups: Int! downs: Int! version: Int! } ...

對於此結構描述,假設這AWS_IAM是 AWS AppSync GraphQL API 上的預設授權類型。這表示沒有指示詞的欄位會使用 AWS_IAM 進行保護。例如,Query 類型的 getPost 欄位就是這種情況。結構描述指示詞可讓您使用超過一種授權模式。例如,您可以在 AWS AppSync GraphQL API 上API_KEY設定為其他授權模式,並且可以使用@aws_api_key指示詞來標記欄位 (例如,getAllPosts在本範例中)。指示詞會在欄位層級運作,因此您也需要將 API_KEY 存取權限提供給 Post 類型。您可以透過在 Post 類型中使用指示詞標記每個欄位,或是使用 @aws_api_key 指示詞標記 Post 類型,來執行此作業。

若要進一步限制對 Post 類型中欄位的存取,您可以針對 Post 類型中的個別欄位使用指示詞,如下所示。

例如,您可以將 restrictedContent 欄位新增到 Post 類型,並使用 @aws_iam 指示詞限制對該項目進行存取。AWS_IAM 已驗證請求可以存取 restrictedContent,但 API_KEY 請求將無法存取它。

type Post @aws_api_key @aws_iam{ id: ID! author: String title: String content: String url: String ups: Int! downs: Int! version: Int! restrictedContent: String! @aws_iam } ...

精細定義存取控制

上述資訊示範了如何限制存取權限,或將存取權限授予特定 GraphQL 欄位。若您希望根據特定條件設定資料的存取控制 (例如根據進行呼叫的使用者,以及使用者是否擁有資料),您可以在解析程式中使用映射範本。您也可以執行更複雜的商業邏輯;我們會在篩選資訊中進行說明。

本節說明如何使用 DynamoDB 解析器對應範本設定資料的存取控制。

在繼續進行任何操作之前,如果您不熟悉中的對應範本 AWS AppSync,您可能需要檢閱 DynamoDB 的解析器對映範本參考解析器對映範本參考。

在下列使用 DynamoDB 的範例中,假設您使用先前的部落格文章結構描述,且只有建立貼文的使用者才能編輯該貼文。評估程序需使用者獲得應用程式的登入資料,例如使用 Amazon Cognito 使用者集區,然後將這些登入資料做為 GraphQL 操作的一部分。映射範本接著將取代在條件式陳述式中的登入資料值 (例如使用者名稱),此資訊接著將與資料庫中的值進行比較。

若要新增此功能,請新增 editPost 的 GraphQL 欄位,如下所示:

schema { query: Query mutation: Mutation } type Query { posts:[Post!]! } type Mutation { editPost(id:ID!, title:String, content:String):Post addPost(id:ID!, title:String!):Post! } ...

editPost 的解析程式映射範本 (顯示於本區段末端的範例中) 需要針對您的資料存放區執行邏輯檢查,只允許建立文章的使用者可對其進行編輯。由於這是一項編輯作業,因此它對應於 DynamoDB UpdateItem 中的一個。在執行此動作前可以使用透過使用者身分驗證傳遞的上下文來執行條件檢查。此資訊存放在 Identity 物件中,有以下值:

{ "accountId" : "12321434323", "cognitoIdentityPoolId" : "", "cognitoIdentityId" : "", "sourceIP" : "", "caller" : "ThisistheprincipalARN", "username" : "username", "userArn" : "Sameasabove" }

若要在 DynamoDB UpdateItem 呼叫中使用此物件,您需要將使用者識別資訊儲存在表格中以進行比較。首先,您的 addPost 變動需要儲存建立者。其次,您的 editPost 變動需在更新前執行條件式檢查。

以下是將使用者身分儲存為資料行的解析程式程式碼範例AuthoraddPost

import { util, Context } from '@aws-appsync/utils'; import { put } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { id: postId, ...item } = ctx.args; return put({ key: { postId }, item: { ...item, Author: ctx.identity.username }, condition: { postId: { attributeExists: false } }, }); } export const response = (ctx) => ctx.result;

請注意,Author 屬性從來自於應用程式的 Identity 物件發布。

最後,以下是解析器代碼的示例editPost,如果請求來自創建帖子的用戶,該代碼僅更新博客文章的內容:

import { util, Context } from '@aws-appsync/utils'; import { put } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { id, ...item } = ctx.args; return put({ key: { id }, item, condition: { author: { contains: ctx.identity.username } }, }); } export const response = (ctx) => ctx.result;

這個範例會使用覆PutItem寫所有值而非覆寫值UpdateItem,但同樣的概念適用於condition陳述式區塊。

篩選資訊

在某些情況下,您無法控制資料來源的回應,但又不想在成功寫入或讀取資料來源時,將不必要的資訊傳送給用戶端。如果發生這些情況,您可以使用回應映射範本來篩選資訊。

例如,假設您的部落格文章 DynamoDB 表格上沒有適當的索引 (例如上Author的索引)。您可以使用以下解析器:

import { util, Context } from '@aws-appsync/utils'; import { get } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { return get({ key: { ctx.args.id } }); } export function response(ctx) { if (ctx.result.author === ctx.identity.username) { return ctx.result; } return null; }

即使調用者不是創建帖子的作者,請求處理程序也會獲取該項目。為了防止傳回所有資料,回應處理常式會檢查以確定呼叫者與項目的作者相符。如果發起人不符合此檢查,只會傳回 nul在某些情況下,您無法控制數據源的響應,但又不想在成功寫入或讀取數據源時將不必要的信息發送給客戶端。l 回應。

資料來源存取

AWS AppSync 使用身分識別和存取管理 (IAM) 角色和存取政策與資料來源通訊。如果您使用現有的角色,則需要新增信任原則才能擔任該角色。 AWS AppSync 信任關係如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "appsync.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

縮小角色的存取政策範圍,使其只能對必要的最少資源集合採取行動,是非常重要的。使用 AppSync 主控台建立資料來源並建立角色時,會自動為您完成此操作。不過,當使用 IAM 主控台的內建範例範本在主控台外部建立角色時,不會自動縮減資源的許可範圍,您應該在將應用程式移至生產環境之前執行此動作。 AWS AppSync