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

Error using AWS Cognito for authentication with Hasura

我在使用 lambda 环境时遇到了一些问题。

希望设置一个对 Hasura 进行突变的函数,以便我可以将 Cognito 的 Auth 用户与我的应用程序信息相关联。

我在 Lamba 中设置了以下功能 Post 身份验证,但它不起作用。

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

您认为代码有什么问题?

我认为代码没有任何问题,但要使其与 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 声明,这实际上是一个 URL 指向您的 Cognito 设置,使用池 ID 生成.

最后,您可以在成功登录后从用户 session 处获取 idToken,并将该令牌作为身份验证 header 传递给您的 Hasura 请求。描述 here.

所有这些步骤实际上都在您链接的指南中进行了描述,但可能不是很清楚。我认为您当前设置不起作用的原因是您的 Hasura 设置缺少 HASURA_GRAPHQL_ADMIN_SECRET,它需要与您在请求中使用的 x-hasura-admin-secret 相同。

请注意,如果您在您的应用中使用 x-hasura-admin-secret 并将其公开给您的用户以授予他们管理员访问权限,这会造成潜在的安全问题,任何知道该秘密的人都可以擦除您的数据。 x-hasura-admin-secret 应保留用于您的管理任务,而不应在计划使用 AWS Cognito 身份验证的应用程序中使用。