aurelia-contrib / aurelia-open-id-connect

An aurelia adapter for the IdentityModel/oidc-client-js
https://zamboni-app.azurewebsites.net
MIT License
54 stars 18 forks source link

The login and logout navigation strategies behave differently on returning Promises. #14

Closed shaunluttin closed 7 years ago

shaunluttin commented 7 years ago
private addLoginRoute(routerConfiguration: RouterConfiguration) {
    routerConfiguration.mapRoute({
        name: "login",
        nav: false,
        navigationStrategy: (instruction: NavigationInstruction) => {
            // no return
            // and do setRequiredNavigationInstructions.
            this.setRequiredNavigationInstructions(instruction);
            this.openIdConnectNavigationStrategies.login(instruction);
        },
        route: "login",
        settings: {
            roles: [
                OpenIdConnectRoles.Anonymous,
            ],
        },
    });
}

private addLogoutRoute(routerConfiguration: RouterConfiguration) {
    routerConfiguration.mapRoute({
        name: "logout",
        nav: false,
        navigationStrategy: (instruction: NavigationInstruction) => {
            // return
            // and do not setRequiredNavigationInstructions.
            // This leads to a nice-to-fix error:
            // "Cannot read property 'trim()' of undefined."
            return this.openIdConnectNavigationStrategies.logout(instruction);
        },
        route: "logout",
        settings: {
            roles: [
                OpenIdConnectRoles.Authorized,
            ],
        },
    });
}

private setRequiredNavigationInstructions(instruction: NavigationInstruction) {
    instruction.config.href = instruction.fragment;
    instruction.config.moduleId = instruction.fragment;
    instruction.config.redirect = instruction.fragment;
}

// openIdConnectNavigationStrategies
public login(instruction: NavigationInstruction): Promise<any> {
    let args: any = {};
    return this.userManager.signinRedirect(args);
}

// openIdConnectNavigationStrategies
public logout(instruction: NavigationInstruction): Promise<any> {
    let args: any = {};
    return this.userManager.signoutRedirect(args);
}
shaunluttin commented 7 years ago

These are the errors we receive with different attempts at a login NavigationStrategy in Chrome.

// TypeError: Cannot read property 'trim' of undefined at relativeToFile
return this.openIdConnectNavigationStrategies.login(instruction);
// TypeError: Cannot read property '__useDefault' of undefined at ensureOriginOnExports
instruction.config.moduleId = "";
return this.openIdConnectNavigationStrategies.login(instruction);
// TypeError: Invalid Route Config: Configuration for viewPort "default" was not found for route: "login."
instruction.config.viewPorts = "";
return this.openIdConnectNavigationStrategies.login(instruction);
// Warning: A promise was rejected with a non-error.
instruction.config.redirect = "";
return this.openIdConnectNavigationStrategies.login(instruction);
// Warning: A promise was rejected with a non-error.
instruction.config.redirect = "";
return this.openIdConnectNavigationStrategies.login(instruction);
shaunluttin commented 7 years ago

These are the errors we receive with different attempts at a logout NavigationStrategy.

// TypeError: Cannot read property 'then' of undefined at OpenIdConnectNavigationStrategies.runHandlers
instruction.config.redirect = "";
return this.openIdConnectNavigationStrategies.logout(instruction);

Resolution:

We needed to return the promise here:

public signoutRedirectCallback(instruction: NavigationInstruction): Promise<any> {
    let callbackHandler: Function = () => {
        let args: any = {};
        return this.userManager.signoutRedirectCallback(args); // this is where we needed to return
    };

    let postCallbackRedirect: Function = () => {
         instruction.config.moduleId = this.openIdConnectConfiguration.logoutRedirectModuleId;
    };

    return this.runHandlers(callbackHandler, postCallbackRedirect);
}
shaunluttin commented 7 years ago

At this point, we are receiving the Warning: A promise was rejected with a non-error message. It seems that the Aurelia recommendation is to ignore these warnings.

https://github.com/aurelia/router/issues/329