我正在尝试编写一个授权器,以保护使用无服务器框架对lambda的调用。我正在使用Ruby。
配置:
provider:
name: aws
runtime: ruby2.5
iamRoleStatements:
- Effect: Allow
Action:
- KMS:Decrypt
Resource: ${self:custom.kmsSecrets.keyArn}
functions:
authorize:
handler: handler.authorize
hello:
handler: handler.protected
events:
- http:
path: protected
method: get
authorizer: authorize
授权者:
def authorize(event:, context:)
if is_authorized?
{
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Resource": [ context.invoked_function_arn ],
"Effect": "Allow"
}
]
},
"principalId": "seeker"
}.to_json
end
end
我要实现的身份验证是基于令牌的:is_authorized?
方法将接收令牌,然后返回允许访问protected
lambda函数的策略。
我不确定PrincipalId
参数中的内容-我没有user.id
。
现在它抱怨:seeker-dev-authorize is not authorized to perform: iam:CreatePolicy on resource: policy seeker-allowed
令我很困惑:我无法在该策略上创建策略...?我应该在哪里设置此权限?在IAM
或serverless.yml
上?因为我已经设置了在无服务器中对密钥进行编码/解码的权限,所以也许我应该这样做吗?
答案 0 :(得分:1)
我以前没有使用过自定义授权者,但是我整理了一个小的hello world项目来尝试这一点,这就是我发现的东西。
受保护的功能和授权者的功能:
def authorize(event:, context:)
{
"principalId": "test",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": event["methodArn"]
}
]
}
}
end
def hello(event:, context:)
{ statusCode: 200, body: JSON.generate('This is a protected endpoint!') }
end
请注意,我使用to_json
返回哈希值而不是字符串,使用to_json
时授权者返回了一个错误。
还请注意,我使用event["methodArn"]
来获取受保护的lambda ARN,使用context.invoked_function_arn
也会导致我出错。
此外,在请求中不包含授权标头的情况下,将返回“未经授权的错误”:
curl -X GET https://endpoint/dev/hello -H 'Authorization: test'
最后,关于principalId
:
principalId是授权者响应上的必需属性。它代表呼叫者的主体标识符。这可能因应用程序而异,但是可以是用户名,电子邮件地址或唯一ID。
来源:https://www.alexdebrie.com/posts/lambda-custom-authorizers/