如何在 Appsync Lambda Resolver 中检索 cognito 识别数据(使用 cdk)
Posted
技术标签:
【中文标题】如何在 Appsync Lambda Resolver 中检索 cognito 识别数据(使用 cdk)【英文标题】:How to retrieve cognito identification data in Appsync Lambda Resolver (Using cdk) 【发布时间】:2021-11-30 15:23:29 【问题描述】:我有一个 appsync lambda 解析器,它将查询 postgresql 数据库。 Appsync 请求使用 API 密钥授权给未经授权的用户,并使用 cognito 用户池授权给授权用户。当经过身份验证的用户发出请求时,我想从我的 lambda 解析器中的 cognito 检索标识数据,但我不知道该怎么做。首先,这是我对 appsync 和 lambda 解析器的设置:
this.api = new appsync.GraphqlApi(this, "API-NAME",
name: "API-NAME",
schema: appsync.Schema.fromAsset("graphql/schema.graphql"),
authorizationConfig:
defaultAuthorization:
authorizationType: appsync.AuthorizationType.API_KEY,
apiKeyConfig:
expires: cdk.Expiration.after(cdk.Duration.days(365)),
,
,
additionalAuthorizationModes: [
authorizationType: appsync.AuthorizationType.USER_POOL,
userPoolConfig:
userPool: props.userPool,
,
,
],
,
);
const lambdaDs = this.api.addLambdaDataSource(
"lambdaDatasource",
props.LambdaConnectingGraphqlToDatabase
);
lambdaDs.createResolver(
typeName: "Query",
fieldName: "listUsers",
);
// etc. etc.
在我的 lambda 解析器中,即使经过身份验证的用户发出请求,context.identity 也是未定义的。我曾尝试在 lambdaDs.createResolver() 中使用请求映射模板,但我不知道如何使其工作,或者这是否是正确的方法。
如何在我的 lambda 解析器中查看身份验证数据?谢谢。
【问题讨论】:
【参考方案1】:您可以通过解析器映射模板向您的 lambda 提供身份信息,请参阅https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html
context.identity
部分是相关部分。
有一个部分包含可用于AMAZON_COGNITO_USER_POOLS
授权的字段。
但是,请注意,对于 API_KEY
,context.identity
的信息不会被填充。
但是,您可以区分这两种场景,因为您将在 lambda 中拥有 Cognito 场景的身份信息,并且没有任何 API 密钥场景的身份信息(因此您可以假设它是来自未经授权的用户使用 API 密钥的请求) .
【讨论】:
谢谢你。我正在这样做,但我无法弄清楚为什么它不起作用。但我意识到我需要将 aws cognito 指令放在我的 schema.graphql 中。之前,我一直在使用 api_key 授权,甚至都不知道。因此,对其他人来说:在客户端(如果使用放大客户端库)和服务器端使用 authMode="AMAZON_COGNITO_USER_POOLS",请务必将 @aws_cognito_user_pools 添加到查询/突变和数据类型。以上是关于如何在 Appsync Lambda Resolver 中检索 cognito 识别数据(使用 cdk)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 cloudwatch 上跟踪 appsync 验证错误?
当 AWS AppSync 使用 Cognito 时如何验证 Lambda 生成的突变
如何将签名的 HTTP 请求从 AWS Lambda 发送到 AppSync GraphQL?
AWS AppSync Lambda 解析器获取查询返回类型