我们计划使用 keycloak 来保护一堆网络应用程序,有些是用 Java 编写的,有些是用 JavaScript(使用 React)编写的。
用户通过 keycloak 登录后,每个 Web 应用程序都需要检索登录的用户以及用户拥有的领域/客户端 Angular 色。
- 对于 Java 应用程序,我们尝试了 keycloak Java API
(request -> KeycloakSecurityContext -> getIdToken -> getPreferredUsername/getOtherClaims)
。他们似乎工作正常 对于 JavaScript 应用程序,我们尝试了以下代码,但无法让 Keycloak 成功初始化(请注意,这是在用户已经通过 keycloak 进行身份验证后的网络应用程序代码中,该应用程序仅尝试检索登录者扮演什么 Angular 色):
var kc = Keycloak({ url: 'https://135.112.123.194:8666/auth', realm: 'oneRealm', clientId: 'main' }); //this does not work as it can't find the keycloak.json file under WEB-INF //var kc = Keycloak('./keycloak.json'); kc.init().success(function () { console.log("kc.idToken.preferred_username: " + kc.idToken.preferred_username); alert(JSON.stringify(kc.tokenParsed)); var authenticatedUser = kc.idTokenParsed.name; console.log(authenticatedUser); }).error(function () { window.location.reload(); });
我认为网络应用程序需要检索当前用户信息是很常见的。任何人都知道为什么上面的代码不起作用?
谢谢。
最佳答案
<script src="http://localhost:8080/auth/js/keycloak.js" type="text/javascript"></script>
<script type="text/javascript">
const keycloak = Keycloak({
"realm": "yourRealm",
"auth-server-url": "http://localhost:8080/auth",
"ssl-required": "external",
"resource": "yourRealm/keep it default",
"public-client": true,
"confidential-port": 0,
"url": 'http://localhost:8080/auth',
"clientId": 'yourClientId',
"enable-cors": true
});
const loadData = () => {
console.log(keycloak.subject);
if (keycloak.idToken) {
document.location.href = "?user="+keycloak.idTokenParsed.preferred_username;
console.log('IDToken');
console.log(keycloak.idTokenParsed.preferred_username);
console.log(keycloak.idTokenParsed.email);
console.log(keycloak.idTokenParsed.name);
console.log(keycloak.idTokenParsed.given_name);
console.log(keycloak.idTokenParsed.family_name);
} else {
keycloak.loadUserProfile(function() {
console.log('Account Service');
console.log(keycloak.profile.username);
console.log(keycloak.profile.email);
console.log(keycloak.profile.firstName + ' ' + keycloak.profile.lastName);
console.log(keycloak.profile.firstName);
console.log(keycloak.profile.lastName);
}, function() {
console.log('Failed to retrieve user details. Please enable claims or account role');
});
}
};
const loadFailure = () => {
console.log('Failed to load data. Check console log');
};
const reloadData = () => {
keycloak.updateToken(10)
.success(loadData)
.error(() => {
console.log('Failed to load data. User is logged out.');
});
}
keycloak.init({ onLoad: 'login-required' }).success(reloadData);
</script>
简单的 javascript 客户端身份验证没有框架。 对于仍在寻找的人...
关于javascript - 用于获取当前登录用户的 Keycloak JavaScript API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45019521/