如何将AWS Cognito用户字段映射至Strapi用户
解决方案:重写Users & Permissions插件实现Cognito字段映射
1. 定位核心回调逻辑
Users & Permissions插件处理OAuth第三方登录回调的核心方法是node_modules/@strapi/plugin-users-permissions/server/controllers/auth.js里的callback函数,我们需要重写这个方法来添加字段映射逻辑。
2. 创建自定义扩展文件
在Strapi项目根目录下创建路径:src/extensions/users-permissions/server/controllers/auth.js,Strapi会优先加载该目录下的代码,覆盖插件默认逻辑。
3. 编写字段映射代码
以下是完整的重写示例,核心是在用户创建/更新环节,将Cognito返回的自定义字段同步到Strapi扩展的用户字段:
const { sanitize } = require('@strapi/utils'); const originalAuthController = require('@strapi/plugin-users-permissions/server/controllers/auth'); module.exports = { ...originalAuthController, async callback(ctx) { const provider = ctx.params.provider; const params = ctx.request.query; try { const { user } = await strapi.plugin('users-permissions').service('providers').connect(provider, params); // 从Cognito返回的用户属性中提取自定义字段 const cognitoAttrs = user.providerAttributes; const firstName = cognitoAttrs.given_name; const lastName = cognitoAttrs.family_name; const gender = cognitoAttrs.gender; // 更新Strapi用户的扩展字段 await strapi.entityService.update('plugin::users-permissions.user', user.id, { data: { firstName, lastName, gender, }, }); // 保留原有的登录响应逻辑 ctx.send({ jwt: strapi.plugin('users-permissions').service('jwt').issue({ id: user.id }), user: await sanitize.contentAPI.output(user, strapi.models['plugin::users-permissions.user']), }); } catch (error) { ctx.badRequest(error.message); } }, };
4. 关键前置检查
- 确认AWS Cognito用户池已配置
given_name、family_name、gender属性,且应用客户端已开启这些字段的读取权限。 - 确保Strapi的
Users内容类型已添加对应的firstName、lastName、gender字段,字段类型与Cognito返回值匹配(比如性别用字符串类型)。 - 重启Strapi服务后,新用户通过Cognito注册登录时,自定义字段会自动同步到Strapi用户数据中。
内容的提问来源于stack exchange,提问作者Mr.Fabulous
相关产品推荐
相关产品推荐

