使用 AWS Cognito 进行 Hasura 身份验证时出错

时间:2021-03-29 01:22:20

标签: javascript graphql amazon-cognito hasura

我在使用 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

您认为代码有什么问题?

1 个答案:

答案 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 身份验证的应用程序中使用。