我在使用Lambda配置Hasura auth钩子时遇到了一些问题。出于安全原因,我需要这样一个函数,因为我将JWT令牌存储在一个仅限HTTP的cookie中。
我使用了一个无服务器函数,它可以返回正确的响应(无论是在直接测试curl请求时,还是在记录lambda时):
{
    "statusCode":200,
    "body":"{\"X-Hasura-User-Id\":\"74d3bfa9-0983-4f09-be02-6a36888b382e\",\"X-Hasura-Role\":\"user\"}"
}然而,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']
        })
    }
}知道是怎么回事吗?请注意,我正在脱机使用无服务器,以防。:)
发布于 2020-02-07 20:38:57
在AWS Lambda中,规范要求响应体被串行化,实际的响应将是一个解析的JSON对象,这是Hasura将从auth webhook接收的。
当您使用serverless-offline时,响应主体将以字符串的形式返回(因为使用了JSON.stringify ),而不会被解析。一个简单的卷曲就能给你带来不同的效果。
上面的代码将在Lambda上工作,但不能在使用无服务器-离线的本地开发上工作。您将不得不使用event对象来查看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"}) };
}无服务器-离线存储库中的Official example以及错误处理。
相关问题:
https://stackoverflow.com/questions/60111908
复制相似问题