KeycloakでSingle Signを使用してCMS AngularJS Single Pageを開発しています。しかし、Keycloak JS で angular ui-router を使用すると問題が発生します。
ページの読み込み時にリダイレクト ループが作成されます。
したがって、再ルーティングしています:
https://website.com/#/code=XXXXXXXXXXXXXXXXXXXXXX&state=XXXXXXXXXXXXXXX
ただし、結果は次のようになります。
https://website.com/#code=XXXXXXXXXXXXXXXXXXXXXXX&state=XXXXXXXXXXXXXXXXXX
そして、次のようになります。
https://website.com/#/
コードは次のとおりです。
var consoleBaseUrl = window.location.href;
consoleBaseUrl = consoleBaseUrl.substring( 0, consoleBaseUrl.indexOf( "/platform" ) );
consoleBaseUrl = consoleBaseUrl + "/platform";
var auth = {};
var realm = "passqlub";
console.log( consoleBaseUrl );
/** PassQlub Angular App Initialice and dependency load. */
var app = angular.module( "PassQlub", [
'ui.router',
'ngSanitize'
] );
アプリブロックを実行
app
.run( [
'$rootScope',
'$state',
'$stateParams',
'$http',
'$window',
'$timeout',
function ( $rootScope, $state, $stateParams, $http, $window, $timeout ) {
}
] );
ログアウトキークローク機能
var logout = function () {
console.log( "*** PassQlub: logout..." );
auth.loggedIn = false;
auth.authz = null;
window.location = auth.logoutUrl;
};
/** Keycloak Element */
angular.element( document ).ready( function () {
var keycloakAuth = new Keycloak( "keycloak.json" );
auth.loggedIn = false;
keycloakAuth.init( { onLoad: 'login-required' } ).success( function () {
auth.loggedIn = true;
auth.authz = keycloakAuth;
auth.logoutUrl = keycloakAuth.authServerUrl + "/realms/" + realm + "/protocol/openid-connect/logout?redirect_uri=" + encodeURIComponent( "https://" + location.hostname + "/platform" );
app.factory( 'Auth', function () {
return auth;
} );
//angular.bootstrap( document, [ "PassQlub" ] );
} ).error( function () {
window.location.reload();
} );
} );
インターセプターファクトリー
app.factory( 'authInterceptor', function ( $q, Auth ) {
return {
request: function ( config ) {
var deferred = $q.defer();
if ( Auth.authz.token ) {
Auth.authz.updateToken( 5 ).success( function () {
config.headers = config.headers || {};
config.headers.Authorization = 'Bearer ' + Auth.authz.token;
deferred.resolve( config );
} ).error( function () {
deferred.reject( 'Failed to refresh token' );
} );
}
return deferred.promise;
}
};
} );
インターセプター ファクトリー エラー
app.factory( 'errorInterceptor', function ( $q ) {
return function ( promise ) {
return promise.then( function ( response ) {
return response;
}, function ( response ) {
if ( response.status == 401 ) {
console.log( '*** PassQlub: Session Timeout' );
logout();
} else if ( response.status == 403 ) {
alert( "PassQlub: Forbidden" );
} else if ( response.status == 404 ) {
alert( "PassQlub: Not found" );
} else if ( response.status ) {
if ( response.data && response.data.errorMessage ) {
alert( response.data.errorMessage );
} else {
alert( "PassQlub: An unexpected server error has occurred" );
}
}
return $q.reject( response );
} );
};
} );