1

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 );
        } );
    };
} );
4

0 に答える 0