AWS AppSync允許您訪問您可以選擇存儲在DynamoDB表中的GraphQL解析器中的信息。對於來自Facebook配置文件的數據,您可以將此參數作爲參數傳遞給GraphQL突變或傳遞給AppSync,然後您可以通過$ctx.request.headers.NAME
在解析器中訪問,其中NAME是您的標題名稱。然後,您可以簡單地選擇要爲該用戶寫入DynamoDB的屬性作爲突變的一部分。更多信息的參考指南在這裏:https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html
既然你還問,你想先做檢查,看用戶是否已經在DDB第一,你可以只是做一個存在性檢查第一:
{
"version": "2017-02-28",
"operation": "PutItem",
"key": {
"userId": $util.dynamodb.toDynamoDBJson($ctx.identity.username),
},
"attributeValues": $util.dynamodb.toMapValuesJson($ctx.args.input),
"condition": {
"expression": "attribute_not_exists(userId)"
},
}
這會根據Cognito用戶池中的用戶名進行檢查。如果您使用的是Cognito Federated Identities功能,它將是ctx.identity.cognitoIdentityId
。如果記錄已經存在,返回的響應會告訴你哪個意味着用戶已經存在。您還可以通過使用條件語句查看$ctx.result
並通過從頭開始構建JSON響應或使用上述指南中的$util.error()
方法之一來在響應映射模板中轉換返回的消息。
最後,正如您所提到的,您將擁有公開的個人資料數據,您可能希望在某些記錄上標記以便進行控制。在AWS AppSync中,您可以過濾像這樣的授權元數據上的GraphQL響應。您只需在DynamoDB記錄上標記「公開」或「私有」的屬性(又名列)即可。然後你的迴應範本看起來像這樣:這這裏
#if($context.result.public == 'yes')
$utils.toJson($context.result)
#else
$utils.unauthorized()
#end
你可以看到更多的例子:https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html#public-and-private-records
但後來你會怎麼做授權未來API請求? Cognito會返回一個您可以添加爲標題的jwt,但是我認爲很難用發電機來模擬這種行爲? –
據我瞭解,如果提供的令牌是有效的,Cognito仍然會經歷與FB檢查的整個過程。如果Cognito回來並說其有效並給我一個jwt,然後我會提取用戶詳細信息並處理它在DDB中我自己。 – nishkaush
你碰巧有一些我可以查看的代碼片段嗎?這對我非常有幫助。謝謝你的回覆! –