Пустой ответ на крюке аутентификации Hasura с использованием AWS Lambda - PullRequest
0 голосов
/ 07 февраля 2020

У меня возникли проблемы с настройкой аутентификации Hasura с использованием лямбды. Мне нужна такая функция, поскольку я сохраняю свой токен JWT в поваре только для HTTP ie, из соображений безопасности.

Я использую функцию без сервера, которая возвращает правильный ответ (либо при тестировании завитка) запросить напрямую или даже при регистрации лямбды):

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

Тем не менее, хасура Хасуры, похоже, не распознает ответ:

{
    "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
    }
}

Эти две строки журналов соседствуют в моем журналы. Я просто переформатировал их немного, чтобы облегчить чтение.

Мой лямбда-код выглядит так:

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

Есть идеи о том, что происходит? Обратите внимание, что я использую автономный сервер, в случае. :)

1 Ответ

1 голос
/ 07 февраля 2020

В AWS лямбде, спецификация c требует, чтобы тело ответа было зачеркнуто, и фактический ответ будет проанализированным JSON объектом, который Хасура получит от 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"}) };
}

Официальный пример в автономном репо с сервером и обработкой ошибок.

Проблемы, связанные с данной:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...