我有以下serverless.yaml:
getSth:
handler: src/handlers/getSth.getSth
events:
- http:
path: getSth
method: get
cors: true
private: true
authorizer: authorizerFunc
authorizerFunc:
handler: src/handlers/authorizer.authorizer
getSth处理程序:
module.exports.getSth = async (event, context) => {
const response = {
statusCode: 200,
body: JSON.stringify({message: "nice you can call this});
}
return response;
}
authorizerFunc:
module.exports.authorizer = async (event, context) => {
console.log('i will fail your authorization');
let response = {
isAuthorized: false,
context: {
stringKey: "value",
numberKey: 1,
booleanKey: true,
arrayKey: ["value1", "value2"],
mapKey: { value1: "value2" },
},
};
return response;
}
这导致得到响应200,尽管授权者不应该允许执行该getSth函数。控制台日志"我将使您的授权失败"也没有记录。
我做错了什么?
我已经尝试分析您的代码,并找到可以开始挖掘的几个点。
私人功能
密钥private: true
实际上使API网关需要API密钥。我现在没有尝试自己,但也许private: true
和授权人不在一起。
奇怪的是,你居然能调用函数。如何调用函数?从CLI或通过API网关和API测试工具,如Postman或Insomnia?
授权人配置
您的authorizer配置绝对正确。我们的代码中确实有完全相同的设置。
授权人事件
authorizer函数在中获得一个APIGatewayTokenAuthorizerEvent
,并应使用APIGatewayAuthorizerResult
进行回复。后者看起来非常像IAM语句,并且我们没有像您的示例那样使用字段isAuthorized: false
。我不明白这个领域是从哪里来的。我们允许请求的结果看起来或多或少如下:
{
"principalId": "<our auth0 user-id>",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "*"
}]
}
}
请注意字段principalId
是如何引用我们从身份提供者(Auth0(获得的用户名的。实际上看起来是这样的:auth0|6f84a3z162c72d0d0d000a00
。
此外,我们可以通过Effect
字段允许或拒绝函数调用,该字段可以保存值Allow
或Deny
。
最后,您可以指定允许调用者调用的资源。为了简单起见,我把*
放在那里。当然,在现实世界中,您可以从事件和上下文中提取被调用函数的ARN,并将其传递到策略文档中。
意见
通过AWS的文档,我们也很难弄清楚这一点。当然,对于AWS来说,首选的集成是通过AWS Cognito(我也更喜欢它,因为集成更精简。我们从这里使用TypeScript中受益匪浅,我们使用TypeScript在无服务器功能中强制执行类型。这样就很容易弄清楚响应的样子。
背景
我们使用自定义authorizer集成,允许Auth0中已经存在的用户群通过应用程序客户端或单页应用程序使用我们基于无服务器的API。