获取当前登录用户的KeyClope JavaScript API

获取当前登录用户的KeyClope JavaScript API,javascript,authorization,keycloak,Javascript,Authorization,Keycloak,我们计划使用keydape来保护一系列web应用程序,一些是用Java编写的,一些是用JavaScript编写的(带有React) 在用户通过KeyClope登录后,每个web应用程序都需要检索已登录的用户以及该用户拥有的领域/客户端角色 对于Java应用程序,我们尝试了keydape Java API(请求->keydapertecuritycontext->getIdToken->getPreferredUsername/getOtherClaims)。他们似乎工作得很好 对于JavaSc

我们计划使用keydape来保护一系列web应用程序,一些是用Java编写的,一些是用JavaScript编写的(带有React)

在用户通过KeyClope登录后,每个web应用程序都需要检索已登录的用户以及该用户拥有的领域/客户端角色

  • 对于Java应用程序,我们尝试了keydape Java API
    (请求->keydapertecuritycontext->getIdToken->getPreferredUsername/getOtherClaims)
    。他们似乎工作得很好
  • 对于JavaScript应用程序,我们尝试了以下代码,但未能成功将Key斗篷设置为init(请注意,这是在web应用程序代码中,在用户已通过Key斗篷验证后,该应用程序仅尝试检索以何种角色登录的用户):

我认为web应用程序需要检索当前用户信息是相当普遍的。有人知道为什么上面的代码不起作用吗


谢谢。

您的代码要求KeyClope客户端库进行初始化,但它不会执行用户登录或检查用户是否已登录

详情请参阅手册:

您可能想做的事情:

  • 将check sso添加到init以检查用户是否已登录,并检索凭据
    keydove.init({onLoad:'check sso'…})
    。您甚至可以使用所需的登录名

  • 确保为前端注册一个单独的客户端。Java后端客户机的类型为机密(或仅限承载),而JavaScript客户机的类型为公共

您可以在这里找到一个非常简单的示例:

或者,您可以注册一个回调,以便在检索到用户信息后通知
onAuthSuccess


一旦您在前端使用keydove,您很快就会希望在后端调用REST资源时查看承载令牌。

此时您可能已经解决了这个问题。我希望这个答案能帮助其他陷入困境的人

当您使用JavaScript应用程序时 下面的javascript应该被添加到html页面中

    <script src="http://localhost:8080/auth/js/keycloak.js"></script>
            <script>
            /* If the keycloak.json file is in a different location you can specify it: 

Try adding file to application first, if you fail try the another method mentioned below. Both works perfectly.

            var keycloak = Keycloak('http://localhost:8080/myapp/keycloak.json'); */    

/* Else you can declare constructor manually  */
                var keycloak = Keycloak({
                    url: 'http://localhost:8080/auth',
                    realm: 'Internal_Projects',
                    clientId: 'payments'
                });


                keycloak.init({ onLoad: 'login-required' }).then(function(authenticated) {
                    alert(authenticated ? 'authenticated' : 'not authenticated');
                }).catch(function() {
                    alert('failed to initialize');
                });    

                function logout() {
                    //
                    keycloak.logout('http://auth-server/auth/realms/Internal_Projects/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri')
                    //alert("Logged Out");
                }
             </script>

/*如果keydape.json文件位于其他位置,则可以指定它:
首先尝试将文件添加到应用程序,如果失败,请尝试下面提到的另一种方法。两者都能完美地工作。
var keydove=keydove('http://localhost:8080/myapp/keycloak.json'); */    
/*否则您可以手动声明构造函数*/
var keydove=keydove({
网址:'http://localhost:8080/auth',
领域:'内部_项目',
客户ID:“付款”
});
init({onLoad:'login required'}){
警报(已验证?'authenticated':'notauthenticated');
}).catch(函数(){
警报(“初始化失败”);
});    
函数注销(){
//
keydape.logout('http://auth-server/auth/realms/Internal_Projects/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri')
//警报(“注销”);
}
参考链接

注意:阅读添加json凭据的两种方法的注释。


    <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>
const keydove=keydove({ “领域”:“你的领域”, “身份验证服务器url”:http://localhost:8080/auth", “需要ssl”:“外部”, “资源”:“yourRealm/保持默认值”, “公众客户”:没错, “机密端口”:0, “url”:http://localhost:8080/auth', “客户ID”:“yourClientId”, “启用cors”:真 }); 常量加载数据=()=>{ console.log(keydove.subject); if(keydape.idToken){ document.location.href=“?user=“+keydape.idTokenParsed.preferred\u用户名; log('IDToken'); log(keydape.idTokenParsed.preferred\u用户名); log(keydove.idTokenParsed.email); log(keydove.idTokenParsed.name); log(keydove.idTokenParsed.given_name); log(keydove.idTokenParsed.family_name); }否则{ loadUserProfile(函数(){ console.log(“帐户服务”); log(keydeport.profile.username); console.log(keydove.profile.email); console.log(keydove.profile.firstName+“”+keydove.profile.lastName); console.log(keydove.profile.firstName); log(keydeport.profile.lastName); },函数(){ console.log('检索用户详细信息失败。请启用声明或帐户角色'); }); } }; 常量加载失败=()=>{ console.log('加载数据失败。请检查控制台日志'); }; 常量重载数据=()=>{ keydepeat.updateToken(10) .成功(加载数据) .错误(()=>{ console.log('加载数据失败。用户已注销'); }); } init({onLoad:'login required'});
简单的javascript客户端身份验证没有框架。
对于仍在寻找的人…

您的密码已过期。你能提供一个新的吗?你的帖子让我意识到我不需要调用.loadUseProfile(),我只需要使用idTokenParsed…太棒了,谢谢!!
    <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>