AppSync:用于特定请求的授权函数

0

【以下的问题经过翻译处理】 我正在尝试为特定请求(这里是推送通知的主题订阅)设置授权函数。每当有人调用相应的“ function”/类型时,该函数应该被调用。

据我所了解,以下代码应该设置一个类型,该类型运行授权函数:

type Mutation {
	subscribe(topic: String, subscription: String): String
		@aws_lambda(name: "isAuthorizedToSubscribe")
}

请求映射模板如下所示:

{
    "version" : "2018-05-29",
    "operation": "PutItem",
    "key" : {
        "topic": { "S" :  "$ctx.args.topic" },
      	"subscription": $util.dynamodb.toDynamoDBJson($ctx.args.subscription)
    }
}

Lambda函数isAuthorizedToSubscribe

exports.handler = (event, context, callback) => {
    console.log("*** Authorization handler for subscription was called ***")
    return {isAuth: false} 
}

问题:Lambda函数没有被调用,请求总是通过。

注:

  • Lambda函数isAuthorizedToSubscribe有权被AppSync调用。
  • 这个问题仅涉及调用的授权问题。这不是关于身份验证的问题(应该通过其他措施(API密钥,Cognito等)在流程的早期完成)。
  • 我还尝试在映射模板中添加"authorizationFunction": "cbe-trial2-push-isAuthorizedToSubscribe",但请求时会导致Unsupported element '$[authorizationFunction]'的错误。
profile picture
专家
已提问 5 个月前65 查看次数
1 回答
0

【以下的回答经过翻译处理】 感谢您关于上述查询的联系。我想分享的是,我们可以使用***@aws_lambda*** AppSync指令来指定在使用多个授权模式时,应由AWS_LAMBDA授权模式授权类型的字段。通过此授权模式,我们可以使用Amazon Lambda函数实现自己的API授权逻辑。请注意,我们可以将Lambda函数用于主要或次要授权器之一,但每个API只能有一个Lambda授权函数。

例如,考虑以下样本模式,在其中我们将为特定请求调用Lambda授权函数:

type Author @aws_lambda {
	id: ID!
	title: String
}
type Mutation {
	createAuthor(input: CreateAuthorInput!): Author @aws_lambda
}

请注意,'@aws_lambda'指令将使用配置在AppSync API的授权模式中的Lambda函数。由于每个API只能使用一个Lambda授权函数,因此在使用此指令时不需要指定函数名称。

接下来,在我的测试设置中,我已执行了以下步骤以使授权生效:

  1. **编写Lambda函数以授权GraphQL API调用-**实现我们的业务逻辑以授权请求,在我的情况下,我实现了函数以检查授权令牌,如果值是自定义授权,则允许请求否则请求将被拒绝。
  2. **设置AWS Lambda作为AppSync授权模式-**将Lambda函数配置为AppSync API>>设置>>默认/附加授权模式(根据我们的用例)>> AWS_LAMBDA。 3.在从AppSync Console发出的变更请求时,将令牌传递给Lambda以进行验证。

使用上述步骤,我能够调用位于授权模式中设置的Lambda函数来授权请求。

有关详细信息,请参阅以下文档:

此外,如果您的用例是针对特定请求使用不同的 lambda 函数并在同一请求上处理/实现业务逻辑,那么您可以考虑针对该特定字段使用 Lambda 解析器。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则