【问题标题】:How to use Custom Authorizer on Api Gateway?如何在 API 网关上使用自定义授权器?
【发布时间】:2018-03-23 00:31:59
【问题描述】:

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

将此自定义授权添加到 api 方法请求。授权人测试成功,但我请求 Postman 上的 api 然后 401。

{
    "message": "Unauthorized"
}



自定义授权方 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'

解决方案
令牌来源:授权

【问题讨论】:

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


    【解决方案1】:

    截至今天 1 月 18 日,API 网关已更改。需要了解以下内容。

    1. 如果方法的集成请求不是 lambda 代理。在创建自定义授权者(在 Authorizer 选项卡中)时,您应该将 Token Source 输入为“Authorization”,而不是“method.request.header.Authorization”。此外,在方法的“方法请求”选项卡(例如 GET)中,您应该为“授权”设置 HTTP 标头映射。
    2. 如果方法的集成请求被代理,则不需要映射。所有的请求体+标头+参数+AWSextraStuff 在 lambda 的 event[] 对象中可用。因此不需要映射。

    小心一些陷阱。 - 使用像'Authorization'这样的标准字符串(这是一个标准),你是否使用不同的字符串,改变每个地方。 - 传递给 lambda 时的授权令牌,对于没有代理的集成请求,作为 event['authorizationToken'] 而不是 event['Authorization'] - 如果您收到类似 Lambda Malform... 的错误,那是因为您使用的是 Lambda 代理,并且它需要特定格式的响应,您没有以 tha 格式发送数据。 - 如果您使用 Postman ,请切换到 'raw' 而不是 'pretty' 模式。

    【讨论】:

    • 我正在使用带有自定义授权的代理集成,我希望我的授权在我的事件对象中。那我还需要做哪些额外的设置,并且我已经设置了自定义授权配置?
    【解决方案2】:

    使用自定义 TOKEN 授权器调用 API

    • 打开 Postman,选择 GET 方法并将 API 的 Invoke URL 粘贴到相邻的 URL 字段中。

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

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

    【讨论】:

    • 感谢您的回答:) 我解决了问题是令牌来源:method.request.header.Authorization。必须是 Token Source: Authorization
    • 优秀的人:)。我分享的答案是否有帮助?
    【解决方案3】:

    您不会通过 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 网关完成所有工作。

    【讨论】:

    • 感谢您的回答:) 我解决了问题是令牌来源:method.request.header.Authorization。必须是 Token Source: Authorization
    • 为什么不能在答题环节添加你的答案?这样它也对其他人有帮助。我已经看到其他人问过你问的同样的问题。我已经给出了答案,但是如果您将其添加到答案会话中,那么我可以在答案和声誉出现时分享您的答案。我不想要功劳,因为这是你的解决方案:)
    • 我会补充。我不明白信用的事情。同时,我已经为这个问题添加了一个解决方案:)
    • 当您在社区中回答时,您将获得声誉:)。
    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 2019-06-29
    • 2020-11-16
    • 2018-07-25
    • 2017-08-09
    • 1970-01-01
    • 2018-03-24
    • 2017-08-22
    相关资源
    最近更新 更多