我正在使用 AWS Cognito 用户池来保护我的 Web 应用程序、移动应用程序和 API。我有一个定义了角色和权限的数据库。我想在登录过程中将“角色”添加到访问令牌,这样我就不需要进行数据库调用来检查用户角色。
我将无法使用 Cognito 自定义属性,因为人们可以从前端创建自定义角色,并且所有这些信息都保存在数据库中。
Cognito 在 2023 年添加了对访问令牌自定义的支持。您必须激活高级功能,然后才能控制发出的声明。通常的 OAuth 模式是考虑包含声明的范围,并且仅在范围存在时才发出声明。我的博客文章有一些有关步骤的更多信息。
export const handler = function(event, context) {
const response = {
claimsAndScopeOverrideDetails: {
idTokenGeneration: {
claimsToSuppress: []
},
accessTokenGeneration: {
claimsToAddOrOverride: {}
}
}
};
if (event.request.scopes.indexOf('myscope') !== -1) {
const customClaims = response.claimsAndScopeOverrideDetails.accessTokenGeneration.claimsToAddOrOverride;
customClaims.role = event.request.userAttributes['custom:role'];
}
event.response = response;
context.done(null, event);
};
在支持此功能之前,我使用了另一种模式:在 API 代码中查找额外的声明,并根据访问令牌的哈希值将它们缓存在 API 中。如果您不想在 Cognito 中存储某些用户属性,通常仍然有充分的理由这样做。