在Ruby中为无服务器框架编写授权者

时间:2019-04-12 15:22:49

标签: ruby lambda serverless-framework

我正在尝试编写一个授权器,以保护使用无服务器框架对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令我很困惑:我无法在该策略上创建策略...?我应该在哪里设置此权限?在IAMserverless.yml上?因为我已经设置了在无服务器中对密钥进行编码/解码的权限,所以也许我应该这样做吗?

1 个答案:

答案 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/