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