@ebondu/angular2-keycloak
Version:
70 lines • 10 kB
JavaScript
/*
* Copyright 2022 ebondu and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Check login Iframe utility
*/
export class KeycloakCheckLoginIframe {
keycloak;
iframe;
interval;
iframeSrc;
constructor(keycloak, checkInterval) {
this.keycloak = keycloak;
this.interval = checkInterval;
this.iframeSrc = this.keycloak.getRealmUrl() + '/protocol/openid-connect/login-status-iframe.html';
this.initIframe();
}
initIframe() {
this.iframe = document.createElement('iframe');
this.iframe.setAttribute('src', this.iframeSrc);
this.iframe.style.display = 'none';
this.iframe.setAttribute('title', 'keycloak-session-iframe');
document.body.appendChild(this.iframe);
if (this.interval > 0) {
this.iframe.onload = (() => {
setTimeout(() => this.checkIframe(), this.interval);
});
}
window.addEventListener('message', () => this.processCallbackMessage(event), false);
}
checkIframe() {
const msg = this.keycloak.keycloakConfig.clientId + ' ' + (!!this.keycloak.sessionId ? this.keycloak.sessionId : '');
const origin = this.iframeSrc.substring(0, this.iframeSrc.indexOf('/', 8));
// console.log('sending message to iframe ' + msg + ' origin :' + origin);
this.iframe.contentWindow.postMessage(msg, origin);
if (this.interval > 0) {
setTimeout(() => this.checkIframe(), this.interval);
}
}
processCallbackMessage(event) {
const origin = this.iframeSrc.substring(0, this.iframeSrc.indexOf('/', 8));
// console.log('checking iframe message callback..' + event.data + ' ' + event.origin);
if ((event.origin !== origin) || (this.iframe.contentWindow !== event.source)) {
// console.log('event is not coming from the iframe, ignoring it');
return;
}
if (!(event.data === 'unchanged' || event.data === 'changed' || event.data === 'error')) {
// console.log('unknown event data, ignoring it');
return;
}
if (event.data !== 'unchanged') {
// console.log('event from the iframe, and data changed, clearing tokens');
this.keycloak.clearToken({});
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWsudXRpbHMuY2hlY2stbG9naW4taWZyYW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWJvbmR1L2FuZ3VsYXIta2V5Y2xvYWsvc3JjL2xpYi91dGlsL2tleWNsb2FrLnV0aWxzLmNoZWNrLWxvZ2luLWlmcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSDs7R0FFRztBQUNILE1BQU0sT0FBTyx3QkFBd0I7SUFLZjtJQUpaLE1BQU0sQ0FBTTtJQUNaLFFBQVEsQ0FBUztJQUNqQixTQUFTLENBQVM7SUFFMUIsWUFBb0IsUUFBeUIsRUFBRSxhQUFxQjtRQUFoRCxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsbURBQW1ELENBQUM7UUFDbkcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUM3RCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdkMsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU8sV0FBVztRQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckgsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNFLDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRW5ELElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQVU7UUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLHVGQUF1RjtRQUN2RixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzlFLG1FQUFtRTtZQUNuRSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4RixrREFBa0Q7WUFDbEQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDL0IsMkVBQTJFO1lBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjIgZWJvbmR1IGFuZC9vciBpdHMgYWZmaWxpYXRlc1xuICogYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyBhcyBpbmRpY2F0ZWQgYnkgdGhlIEBhdXRob3IgdGFncy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBLZXljbG9ha1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2tleWNsb2FrLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQ2hlY2sgbG9naW4gSWZyYW1lIHV0aWxpdHlcbiAqL1xuZXhwb3J0IGNsYXNzIEtleWNsb2FrQ2hlY2tMb2dpbklmcmFtZSB7XG4gIHByaXZhdGUgaWZyYW1lOiBhbnk7XG4gIHByaXZhdGUgaW50ZXJ2YWw6IG51bWJlcjtcbiAgcHJpdmF0ZSBpZnJhbWVTcmM6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGtleWNsb2FrOiBLZXljbG9ha1NlcnZpY2UsIGNoZWNrSW50ZXJ2YWw6IG51bWJlcikge1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBjaGVja0ludGVydmFsO1xuICAgIHRoaXMuaWZyYW1lU3JjID0gdGhpcy5rZXljbG9hay5nZXRSZWFsbVVybCgpICsgJy9wcm90b2NvbC9vcGVuaWQtY29ubmVjdC9sb2dpbi1zdGF0dXMtaWZyYW1lLmh0bWwnO1xuICAgIHRoaXMuaW5pdElmcmFtZSgpO1xuICB9XG5cbiAgaW5pdElmcmFtZSgpIHtcbiAgICB0aGlzLmlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgIHRoaXMuaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3JjJywgdGhpcy5pZnJhbWVTcmMpO1xuICAgIHRoaXMuaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5pZnJhbWUuc2V0QXR0cmlidXRlKCd0aXRsZScsICdrZXljbG9hay1zZXNzaW9uLWlmcmFtZScpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5pZnJhbWUpO1xuXG4gICAgaWYgKHRoaXMuaW50ZXJ2YWwgPiAwKSB7XG4gICAgICB0aGlzLmlmcmFtZS5vbmxvYWQgPSAoKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hlY2tJZnJhbWUoKSwgdGhpcy5pbnRlcnZhbCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoKSA9PiB0aGlzLnByb2Nlc3NDYWxsYmFja01lc3NhZ2UoZXZlbnQpLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZyYW1lKCkge1xuICAgIGNvbnN0IG1zZyA9IHRoaXMua2V5Y2xvYWsua2V5Y2xvYWtDb25maWcuY2xpZW50SWQgKyAnICcgKyAoISF0aGlzLmtleWNsb2FrLnNlc3Npb25JZCA/IHRoaXMua2V5Y2xvYWsuc2Vzc2lvbklkIDogJycpO1xuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuaWZyYW1lU3JjLnN1YnN0cmluZygwLCB0aGlzLmlmcmFtZVNyYy5pbmRleE9mKCcvJywgOCkpO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ3NlbmRpbmcgbWVzc2FnZSB0byBpZnJhbWUgJyArIG1zZyArICcgb3JpZ2luIDonICsgb3JpZ2luKTtcbiAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKG1zZywgb3JpZ2luKTtcblxuICAgIGlmICh0aGlzLmludGVydmFsID4gMCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNoZWNrSWZyYW1lKCksIHRoaXMuaW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0NhbGxiYWNrTWVzc2FnZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgb3JpZ2luID0gdGhpcy5pZnJhbWVTcmMuc3Vic3RyaW5nKDAsIHRoaXMuaWZyYW1lU3JjLmluZGV4T2YoJy8nLCA4KSk7XG4gICAgLy8gY29uc29sZS5sb2coJ2NoZWNraW5nIGlmcmFtZSBtZXNzYWdlIGNhbGxiYWNrLi4nICsgZXZlbnQuZGF0YSArICcgJyArIGV2ZW50Lm9yaWdpbik7XG4gICAgaWYgKChldmVudC5vcmlnaW4gIT09IG9yaWdpbikgfHwgKHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cgIT09IGV2ZW50LnNvdXJjZSkpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdldmVudCBpcyBub3QgY29taW5nIGZyb20gdGhlIGlmcmFtZSwgaWdub3JpbmcgaXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEoZXZlbnQuZGF0YSA9PT0gJ3VuY2hhbmdlZCcgfHwgZXZlbnQuZGF0YSA9PT0gJ2NoYW5nZWQnIHx8IGV2ZW50LmRhdGEgPT09ICdlcnJvcicpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZygndW5rbm93biBldmVudCBkYXRhLCBpZ25vcmluZyBpdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5kYXRhICE9PSAndW5jaGFuZ2VkJykge1xuICAgICAgLy8gY29uc29sZS5sb2coJ2V2ZW50IGZyb20gdGhlIGlmcmFtZSwgYW5kIGRhdGEgY2hhbmdlZCwgY2xlYXJpbmcgdG9rZW5zJyk7XG4gICAgICB0aGlzLmtleWNsb2FrLmNsZWFyVG9rZW4oe30pO1xuICAgIH1cbiAgfVxufVxuIl19