1

我正在使用带有 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 );
        } );
    };
} );
4

0 回答 0