如何在Api网关上使用自定义授权器?

时间:2017-10-11 10:53:48

标签: amazon-web-services aws-lambda aws-api-gateway

自定义授权
Lambda执行角色:完全访问Api网关和Lambda
令牌来源: method.request.header.Authorization
令牌验证:空白

将此自定义授权添加到api方法请求。授权人测试是成功的,但是要求邮递员api然后401.

{
    "message": "Unauthorized"
}

Authorizers Test Image
Postman Image
Api Method Request Image

自定义授权人Lambda

console.log('Loading function');

exports.handler = function(event, context, callback) {

    console.log("event:",JSON.stringify(event));    console.log("event:",JSON.stringify(context));
    console.log('Client token: ' + event.authorizationToken);
    console.log('Method ARN: ' + event.methodArn);
callback(null, {
    "principalId": "18",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Stmt1459758003000",
                "Effect": "Allow",
                "Action": [
                    "execute-api:Invoke"
                ],
                "Resource": [
                    "arn:aws:execute-api:*"
                ]
            }
        ]
    }
});

}

邮递员代码:

    curl --request GET \
  --url {url} \
  --header 'authorization: Test Token' \
  --header 'cache-control: no-cache' \
  --header 'content-type: application/json' \
  --header 'postman-token: c9110a92-414e-e1aa-61fb-194758dace86'

解决方案
令牌来源:授权

3 个答案:

答案 0 :(得分:1)

API Gateway已于今年1月18日发生变化。需要了解以下内容。

  1. 如果方法的集成请求不是lambda代理。在创建自定义授权器时(在“授权器”选项卡中),您应该输入令牌源作为"授权"而不是" method.request.header.Authorization"。此外,在方法的方法请求选项卡(例如GET)中,您应该为“授权”设置HTTP标头映射。
  2. 如果代理方法的集成请求,则不需要映射。所有请求正文+标题+参数+ AWSextraStuff都可以在lambda的event []对象中使用。因此,不需要映射。
  3. 更多的陷阱要小心。 - 使用标准字符串,例如'授权' (这是一个标准),是你使用不同的字符串,改变每一个地方。 - 传递给lambda的授权令牌,没有代理集成请求,作为事件[' authorizationToken']而不是事件['授权'] - 如果你得到像Lambda Malform这样的错误......,那是因为你使用的是Lambda Proxy,它需要特定格式的响应,而不是以格式发送数据。 - 如果您使用邮递员,请切换到' raw'反对'漂亮'模式。

答案 1 :(得分:0)

使用自定义TOKEN授权程序调用API

  • 打开邮递员,选择GET方法并将API的调用URL粘贴到相邻的URL字段中。

添加自定义授权令牌标头并将值设置为allow。选择发送。

enter image description here

值得一读 - http://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html#call-api-with-api-gateway-custom-authorization

答案 2 :(得分:0)

您不会通过Postman调用自定义授权程序,这是API网关的工作。

每次调用受自定义授权程序保护的端点时,API网关都会检查其策略缓存中是否存在给定授权标头的值。如果该值不存在,将调用您的自定义授权程序来验证请求。

流程的简单表示:

Lambda Handler (handles a protected endpoint GET /users/{id})
    |
    | ------------ 
    |            |
    |     Custom Authorizer
    |          /
    |         / (if the request is not authorized yet)
    |        /
 Api Gateway 
    |
    |
    |
Request (with Authorization Header)

您只需将资源方法的授权设置为自定义授权程序,然后让API网关完成所有工作。