当前位置: 首页 > 知识库问答 >
问题:

Lambda授权程序未在node.js中使用callback()返回正确的错误消息

淳于博文
2023-03-14

我已经在AWS API网关上创建了一个Lambda授权器,它调用了一个Lambda函数。下面是用node.js8.0代码编写的Lambda函数的代码。

exports.handler =  function(event, context, callback) {
    var token = event.authorizationToken;
    switch (token.toLowerCase()) {
        case 'allow':
            callback(null, generatePolicy('user', 'Allow', event.methodArn));
            break;
        case 'deny':
            callback(null, generatePolicy('user', 'Deny', event.methodArn));
            break;
        case 'unauthorized':
            callback("Unauthorized");   // Return a 401 Unauthorized response
            break;
        default:
            callback("Error: Invalid token"); 
    }
};

// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
    var authResponse = {};

    authResponse.principalId = principalId;
    if (effect && resource) {
        var policyDocument = {};
        policyDocument.Version = '2012-10-17'; 
        policyDocument.Statement = [];
        var statementOne = {};
        statementOne.Action = 'execute-api:Invoke'; 
        statementOne.Effect = effect;
        statementOne.Resource = resource;
        policyDocument.Statement[0] = statementOne;
        authResponse.policyDocument = policyDocument;
    }

    // Optional output with custom properties of the String, Number or Boolean type.
    authResponse.context = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": true
    };
    return authResponse;
}

(以上示例代码来自网站https://markpollmann.com/lambda-authorizer/)

如果通过传递authorizationToken的无效值来保存并测试该函数,则会得到如下所示的预期结果。

Response:
{
  "errorMessage": "Error: Invalid token"
}

Request ID:
"e93567c0-fcbb-4cb1-b0b3-28e9c1b30162"

但是如果我从Postman调用这个API,通过传递头中的值,我得到以下响应。我得到这个错误的任何值在头,即,拒绝,允许,未经授权,错误等。

{
    "message": null
}

邮递员中的状态消息显示“500内部服务器错误”。下面是邮递员的标题部分的细节。

content-length →16
content-type →application/json
date →Fri, 08 Mar 2019 14:07:57 GMT
status →500
x-amz-apigw-id →W89kFDRDoEFxYg=
x-amzn-errortype →AuthorizerConfigurationException
x-amzn-requestid →92f31d11-41ab-11e9-9c36-97d38d96f31b

我不明白为什么API返回上面的响应和错误消息,而Lambda测试却运行良好。

我已经在SO中经历了以下两个线程,但是答案/评论对我的情况没有帮助。

带有自定义授权器的AWS API网关返回AuthorizerConfigurationException AWS API网关自定义授权器AuthorizerConfigurationException

共有1个答案

喻子航
2023-03-14

我已经理解了为什么我得到无效输入的message=null的原因。switch案例中的默认块在callback()方法中使用参数“error:Invalid token”。API网关只将“允许”、“拒绝”和“未经授权”标识为有效值。这些值也区分大小写。如果将这些值以外的任何字符串值传递给callback()方法,那么API网关将向客户端返回message=null。

 类似资料:
  • 我们正在使用AWS Lambda授权器和API网关来保护我们的下游API。 下面是我们基于Java的lambda授权程序的代码片段 我们需要401(“未经授权”)作为一个回应,有人能请帮助如何做这一点吗?我们有用Java编写的lambda授权器。

  • 我已经实现了一个lambda授权器,并将其与API网关上的lambda代理集成进行了集成。 当我从API网关测试authorizer时,它工作得很好,但是当我试图从Postman调用第二个lambda上的endpoint时,请求似乎跳过了authorizer并直接命中第二个lambda。

  • 我试图从当前上下文中的所有项目中找到一个项目,但我似乎总是收到以下错误消息: 请求失败。远程服务器返回错误:(401)未授权。 首先,我设置了访问交换服务的所有内容: 然后我定义要接收的项目(按ID): 最后但同样重要的是,我尝试在我的物品中搜索这个物品: 这就是我的错误发生的地方。我尝试过各种其他的方法,但无论我做什么,我都会被授权。 有人可以以正确的方式指导我,以解决这个问题吗? 编辑 我收到

  • 我得到了一个运行在Lambda中的graphql服务器,一切都运行得很好,我希望我的endpoint只能由经过身份验证的用户访问,我的身份验证提供者是cognito identity和cognito user pool以及Facebook。那么如何检查发送请求的用户是否经过身份验证呢?我是AWS的新手,所以,我的问题可能会让AWS专家感到困惑,但我的主要问题是“如何检查请求是否来自经过身份验证的用

  • 我已经尝试使用vb使用eventbrite api有一段时间了。net,我使用来使用api,但是它只返回当我使用postman调用具有相同头的相同方法时,它返回具有

  • 我使用spring ide在本地机器嵌入式apache服务器上部署了spring boot web应用程序,并访问了一个带有错误令牌的url,在这种情况下,它会返回未经授权的访问错误401和托管异常处理抛出的特定错误消息,而如果我在独立但相同的apache服务器上部署相同的应用程序,它会给我500个内部服务器错误而不是401或任何其他服务器端错误。 我捕获的日志只有以下一行不同: 下面是我用来处理