0

我在使用 Lambda 配置 Hasura 身份验证挂钩时遇到了一些麻烦。出于安全原因,我需要这样的功能,因为我将 JWT 令牌存储在仅 HTTP 的 cookie 中。

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

{
    "statusCode":200,
    "body":"{\"X-Hasura-User-Id\":\"74d3bfa9-0983-4f09-be02-6a36888b382e\",\"X-Hasura-Role\":\"user\"}"
}

然而,Hasura 钩子似乎没有识别出响应:

{
    "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']
        })
    }
}

知道发生了什么吗?请注意,我正在使用无服务器离线,以防万一。:)

4

1 回答 1

1

在 AWS Lambda 中,规范要求对响应正文进行字符串化,并且实际响应将是一个解析的 JSON 对象,这是 Hasura 将从 auth webhook 接收的内容。

当您使用serverless-offline时,响应正文作为字符串返回(因为使用了 JSON.stringify)而不被解析。一个简单的卷曲会给你带来不同。

上面的代码适用于 Lambda,但不适用于使用 serverless-offline 的本地开发。您将不得不使用该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"}) };
}

serverless-offline repo 中的官方示例以及错误处理。

相关问题:

于 2020-02-07T12:38:57.263 回答