我在使用 lambda 环境时遇到了一些问题。
希望设置一个对 Hasura 进行突变的函数,以便我可以将 Cognito 的 Auth 用户与我的应用信息相关联。
我在 Lamba 中设置了以下功能 Post Authentication 但它不起作用。
function Add(event, context, callback) {
const userId = event.user_id;
const hasuraAdminSecret = "xxx";
const url = "xxx";
const upsertUserQuery = `
mutation($userId: String!){
insert_RegistroAnimal_users(objects: [{ id: $userId }], on_conflict: { constraint: users_pkey, update_columns: [] }) {
affected_rows
}
}`
const graphqlReq = { "query": upsertUserQuery, "variables": { "userId": userId } }
request.post({
headers: {'content-type' : 'application/json', 'x-hasura-admin-secret': hasuraAdminSecret},
url: url,
body: JSON.stringify(graphqlReq)
}, function(error, response, body){
console.log(body);
callback(null, user, context);
});
}
遵循本教程:https://hasura.io/docs/latest/graphql/core/guides/integrations/aws-cognito.html#introduction
您认为代码有什么问题?
答案 0 :(得分:1)
我认为代码没有任何问题,但要使其与 Cognito 配合使用,您需要为您的 Hasura 设置提供 JWT 声明功能,如同一指南 https://hasura.io/docs/latest/graphql/core/guides/integrations/aws-cognito.html#create-a-lambda-function-to-add-claims-to-the-jwt 中所示。如果你想按照指南的建议去做,你需要像这样创建一个 lambda 函数;
exports.handler = (event, context, callback) => {
event.response = {
"claimsOverrideDetails": {
"claimsToAddOrOverride": {
"https://hasura.io/jwt/claims": JSON.stringify({
"x-hasura-user-id": event.request.userAttributes.sub,
"x-hasura-default-role": "user",
// do some custom logic to decide allowed roles
"x-hasura-allowed-roles": ["user"],
})
}
}
}
callback(null, event)
}
然后,您需要从用户池设置中选择此函数作为 PreTokenGeneration
触发器。然后在令牌生成之前 AWS Cognito will trigger 此函数,允许您将 Hasura 所需的声明添加到您的令牌中。
下一步是通过在设置期间提供 HASURA_GRAPHQL_JWT_SECRET
来告诉 Hasura 在哪里查找 JWT 声明,它本质上是一个指向您的 Cognito 设置的 URL,使用池 ID 生成。
最后,您可以在成功登录后从您的用户会话中获取 idToken
,并将该令牌作为您的 Hasura 请求的身份验证标头传递。描述here。
所有这些步骤实际上都在您链接的指南中进行了描述,但可能并不那么清楚。我认为您当前的设置不起作用的原因是您的 Hasura 设置缺少 HASURA_GRAPHQL_ADMIN_SECRET
,它需要与您在请求中使用的 x-hasura-admin-secret
相同。
请注意,如果您在应用中使用 x-hasura-admin-secret
并将其公开给您的用户并授予他们管理员访问权限,则会产生潜在的安全问题,任何拥有该机密的人都可以擦除您的数据。 x-hasura-admin-secret
应保留用于您的管理任务,而不是在计划使用 AWS Cognito 身份验证的应用程序中使用。