该问题可能是由于Keycloak中的协议映射器(Protocol Mappers)配置不正确导致的。解决方法可以是在协议映射器中使用固定值替换client roles或使用JS脚本来处理。以下是使用JS脚本的示例代码:
var roles = user.getRoleMappings();
var roleNames = [];
for (var i = 0; i < roles.length; i++) {
var role = roles[i].getName();
roleNames.push(role);
}
var context = 'clientId=' + context.clientId;
var attributes = {
'client_roles': roleNames
};
var mapper = '${jsonContext(attributes)}';
token = token.substr(0, token.lastIndexOf('.')) + '.' + base64UrlEncode(mapper);
需要确保在映射期间正确标识上下文。