Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript KeyClope js自动令牌引用_Javascript_Keycloak - Fatal编程技术网

Javascript KeyClope js自动令牌引用

Javascript KeyClope js自动令牌引用,javascript,keycloak,Javascript,Keycloak,我有一段使用KeyClope和JS的代码。 当令牌过期时,除了刷新令牌方法外,代码工作正常。如何在令牌过期时自动刷新令牌 var keycloak = Keycloak('keycloak.json'); keycloak.init({ onLoad: 'login-required' }) .success(reloadData) .error(function(errorData) { document.getElementByI

我有一段使用KeyClope和JS的代码。 当令牌过期时,除了刷新令牌方法外,代码工作正常。如何在令牌过期时自动刷新令牌

 var keycloak = Keycloak('keycloak.json');

 keycloak.init({ onLoad: 'login-required' })
        .success(reloadData)
        .error(function(errorData) {
            document.getElementById('customers').innerHTML = '<b>Failed to load data. Error: ' + JSON.stringify(errorData) + '</b>';
    });

 var loadData = function () {
        document.getElementById('subject').innerHTML = keycloak.subject;
        if (keycloak.idToken) {
            document.getElementById('profileType').innerHTML = 'IDToken';
            document.getElementById('username').innerHTML = keycloak.idTokenParsed.preferred_username;
            document.getElementById('email').innerHTML = keycloak.idTokenParsed.email;
            document.getElementById('name').innerHTML = keycloak.idTokenParsed.name;
            document.getElementById('givenName').innerHTML = keycloak.idTokenParsed.given_name;
            document.getElementById('familyName').innerHTML = keycloak.idTokenParsed.family_name;
        } else {
            keycloak.loadUserProfile(function() {
                document.getElementById('profileType').innerHTML = 'Account Service';
                document.getElementById('username').innerHTML = keycloak.profile.username;
                document.getElementById('email').innerHTML = keycloak.profile.email;
                document.getElementById('name').innerHTML = keycloak.profile.firstName + ' ' + keycloak.profile.lastName;
                document.getElementById('givenName').innerHTML = keycloak.profile.firstName;
                document.getElementById('familyName').innerHTML = keycloak.profile.lastName;
            }, function() {
                document.getElementById('profileType').innerHTML = 'Failed to retrieve user details. Please enable claims or account role';
            });
        }

        var url = '/database/customers';
        var req = new XMLHttpRequest();
        req.open('GET', url, true);
        req.setRequestHeader('Accept', 'application/json');
        req.setRequestHeader('Authorization', 'Bearer ' + keycloak.token);
        req.onreadystatechange = function () {
            if (req.readyState == 4) {
                if (req.status == 200) {
                    var users = JSON.parse(req.responseText);
                    var html = '';
                    for (var i = 0; i < users.length; i++) {
                        html += '<p>' + users[i] + '</p>';
                    }
                    document.getElementById('customers').innerHTML = html;
                    console.log('finished loading data');
                }
            }
        }
        req.send();
    };
    var loadFailure = function () {
        document.getElementById('customers').innerHTML = '<b>Failed to load data.  Check console log</b>';
    };
    var reloadData = function () {
        keycloak.updateToken(10)
                .success(loadData)
                .error(function() {
                    document.getElementById('customers').innerHTML = '<b>Failed to load data.  User is logged out.</b>';
                });
    }
var keydape=keydape('keydape.json'); init({onLoad:'login required'}) .成功(重新加载数据) .错误(功能(错误数据){ document.getElementById('customers')。innerHTML='未能加载数据。错误:'+JSON.stringify(errorData)+'; }); var loadData=函数(){ document.getElementById('subject').innerHTML=keydape.subject; if(keydape.idToken){ document.getElementById('profileType')。innerHTML='IDToken'; document.getElementById('username')。innerHTML=keydape.idTokenParsed.preferred_username; document.getElementById('email').innerHTML=keydape.idTokenParsed.email; document.getElementById('name').innerHTML=keydape.idTokenParsed.name; document.getElementById('givenName')。innerHTML=keydape.idTokenParsed.given_name; document.getElementById('familyName')。innerHTML=keydape.idTokenParsed.family_name; }否则{ loadUserProfile(函数(){ document.getElementById('profileType')。innerHTML='Account Service'; document.getElementById('username').innerHTML=keydape.profile.username; document.getElementById('email').innerHTML=keydape.profile.email; document.getElementById('name').innerHTML=keydrope.profile.firstName+''+keydrope.profile.lastName; document.getElementById('givenName')。innerHTML=keydape.profile.firstName; document.getElementById('familyName')。innerHTML=keydape.profile.lastName; },函数(){ document.getElementById('profileType')。innerHTML='检索用户详细信息失败。请启用声明或帐户角色'; }); } var url='/database/customers'; var req=新的XMLHttpRequest(); 请求打开('GET',url,true); setRequestHeader('Accept','application/json'); 请求setRequestHeader('授权','承载'+密钥斗篷令牌); req.onreadystatechange=函数(){ 如果(req.readyState==4){ 如果(请求状态==200){ var users=JSON.parse(req.responseText); var html=''; 对于(var i=0;i'; } document.getElementById('customers').innerHTML=html; console.log(“已完成加载数据”); } } } 请求发送(); }; var loadFailure=函数(){ document.getElementById('customers')。innerHTML='未能加载数据。请检查控制台日志'; }; var reloadData=函数(){ keydepeat.updateToken(10) .成功(加载数据) .错误(函数(){ document.getElementById('customers')。innerHTML='未能加载数据。用户已注销'; }); }
我知道现在已经很晚了,但这个答案仅供将来参考

不知道它是否是新的,并且这个处理程序在2017年没有实现,但我使用
keydape.onTokenExpired
来实现

举个例子:


这仅适用于标准流或混合流。隐式流期间不可能刷新令牌

只要刷新的令牌(SSO会话空闲)尚未过期,就会刷新令牌(访问令牌寿命)。这将在SSO会话最大持续时间内有效

示例令牌(访问令牌寿命)将在2分钟后过期。您可以使用刷新的令牌(SSO会话空闲)在5分钟内刷新它。它最多可在10小时SSO会话期间工作


访问令牌寿命可能会在客户端(请参阅右侧导航)设置选项卡中被覆盖,向下滚动至高级设置

尝试此链接:即使现有令牌过期,令牌是否也会被刷新?如果处理程序基于超时且最小有效期大于当前时间戳,然后,刷新令牌应该适合生成新的有效访问令牌。
keycloak.onTokenExpired = () => {
    console.log('token expired', keycloak.token);
    keycloak.updateToken(30).success(() => {
        console.log('successfully get a new token', keycloak.token);
        ...
    }).error(() => {...});
}