Amazon web services 使用AWS Lambda对Hasura auth钩子的空响应

Amazon web services 使用AWS Lambda对Hasura auth钩子的空响应,amazon-web-services,serverless,hasura,Amazon Web Services,Serverless,Hasura,我在使用Lambda配置Hasura auth钩子时遇到了一些问题。出于安全考虑,我需要这样一个函数,因为我正在将我的JWT令牌存储在一个仅限HTTP的cookie中 我使用的是一个无服务器函数,它返回正确的响应(直接测试curl请求时,甚至在记录lambda时): 然而,Hasura hook似乎没有意识到这种反应: { "type": "webhook-log", "timestamp": "2020-02-07T10:27:34.844+0000", "level"

我在使用Lambda配置Hasura auth钩子时遇到了一些问题。出于安全考虑,我需要这样一个函数,因为我正在将我的JWT令牌存储在一个仅限HTTP的cookie中

我使用的是一个无服务器函数,它返回正确的响应(直接测试curl请求时,甚至在记录lambda时):

然而,Hasura hook似乎没有意识到这种反应:

{
    "type": "webhook-log",
    "timestamp": "2020-02-07T10:27:34.844+0000",
    "level": "info",
    "detail": {
        "response": null,
        "url": "http://serverless:3000/auth",
        "method": "GET",
        "http_error": null,
        "status_code": 200
    }
}
这两行日志在我的日志中是相邻的。我只是稍微重新格式化了一下,以便于阅读

我的lambda代码如下所示:

export const handler = async (event) => {
    const cookies = getCookiesFromHeader(event.headers);
    const { access_token: accessToken } = cookies;

    let decodedToken = null;

    try {
        const cert = fs.readFileSync("./src/pem/dev.pem");
        decodedToken = jwt.verify(accessToken, cert);
    } catch (err) {
        console.error(err);
        return {
            statusCode: 401,
        };
    }

    const hasuraClaims = decodedToken['https://hasura.io/jwt/claims'];

    return {
        statusCode: 200,
        body: JSON.stringify({
            "X-Hasura-User-Id": hasuraClaims['x-hasura-user-id'],
            "X-Hasura-Role": hasuraClaims['x-hasura-default-role']
        })
    }
}

知道发生了什么事吗?请注意,在以下情况下,我使用的是无服务器脱机:

在AWS Lambda中,规范要求将响应主体字符串化,实际响应将是一个解析的JSON对象,这是Hasura将从auth webhook接收的对象

当您使用
serverless offline
时,响应主体将作为字符串返回(因为使用了JSON.stringify),而不进行解析。一个简单的卷曲会让你有所不同

上面的代码将在Lambda上运行,但在使用无服务器脱机的本地开发中不起作用。您必须使用
事件
对象来查看
isOffline
是否为真,并直接返回JSON,如果不是,则返回字符串化版本

示例代码:

if(event.isOffline) {
 // make it work with serverless-offline
 return { "x-hasura-role": "user" ....};
} else {
 // make it work with lambda
 return { statusCode: 200, body: JSON.stringify({"x-hasura-role": "user"}) };
}
在无服务器脱机repo中以及错误处理

相关问题:

if(event.isOffline) {
 // make it work with serverless-offline
 return { "x-hasura-role": "user" ....};
} else {
 // make it work with lambda
 return { statusCode: 200, body: JSON.stringify({"x-hasura-role": "user"}) };
}