我正在使用带有 Keycloak 的 Single Sign 开发 CMS AngularJS 单页。但是在 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 ) {
}
] );
注销Keycloak功能
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 );
} );
};
} );