javascript - 使用 AWS 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
您认为代码有什么问题?
解决方案
我认为代码没有任何问题,但要使其与 Cognito 一起使用,您需要为 Hasura 设置提供 JWT 声明功能,如同一指南中所示,https: //hasura.io/docs/最新/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 将在生成令牌之前触发此功能,允许您将 Hasura 所需的声明添加到您的令牌中。
下一步是通过HASURA_GRAPHQL_JWT_SECRET
在设置期间提供来告诉 Hasura 在哪里查找 JWT 声明,这本质上是一个指向您的 Cognito 设置的 URL,使用池 ID 生成。
最后,您可以idToken
在成功登录后从您的用户会话中获取 ,并将该令牌作为您的 Hasura 请求的 Authentication 标头传递。描述在这里。
所有这些步骤实际上都在您链接的指南中进行了描述,但可能并不那么清楚。我相信您当前设置不起作用的原因是您的 Hasura 设置缺少HASURA_GRAPHQL_ADMIN_SECRET
,它需要与x-hasura-admin-secret
您在请求中使用的相同。
请注意,如果您x-hasura-admin-secret
在您的应用程序中使用并将其公开给您的用户,从而授予他们管理员访问权限,这会产生潜在的安全问题,任何拥有该秘密的人都可以擦除您的数据。x-hasura-admin-secret
应该为您的管理任务保留,而不是在计划使用 AWS Cognito 身份验证的应用程序中使用。
推荐阅读
- android - 使用 coroutine kotlin 是否可以使用 sharedPrefrence
- ruby - 如果改为传递定位参数,如何设置关键字参数
- sql - 如何按升序对字符串数据(时间 12 小时格式)进行排序?
- php - 修改 composer.lock 文件后,“composer install”会更新供应商文件吗?
- sql - 根据月差拆分记录
- python - Django views.py 中的类 - 困惑
- java - 如何修复 dagger2 库中的“如果没有 @Provides-annotated 方法就无法提供”错误
- ios - 将长字符串设置为 UILabel 冻结我的应用程序但未检测到错误
- html - 单击 mat-select 选项元素注册为外部单击在角度 8 中使用 hostlistiner
- linux - 错误没有找到这样的文件或目录 | Linux |