Amazon web services 使用AWS Lambda对Hasura auth钩子的空响应
我在使用Lambda配置Hasura auth钩子时遇到了一些问题。出于安全考虑,我需要这样一个函数,因为我正在将我的JWT令牌存储在一个仅限HTTP的cookie中 我使用的是一个无服务器函数,它返回正确的响应(直接测试curl请求时,甚至在记录lambda时): 然而,Hasura hook似乎没有意识到这种反应: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"
{
"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"}) };
}