Как перенаправить пользователя на его предполагаемый URL-адрес после входа в систему с блокировкой auth0

Цель: если пользователь переходит по защищенной ссылке, ему должно быть предоставлено всплывающее окно блокировки auth0 для входа в систему и перенаправление в указанное место назначения.

У меня есть защищенный маршрут /reports, который защищен сервисом authguard.

auth.guard.ts

@Injectable()
export class AuthGuard implements CanActivate {

    constructor(
        private authService: AuthService,
        private router: Router,
        private snackBar: MatSnackBar,
    ) {

    }

    canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

        if (!this.authService.isAuthenticated()) {

            this.authService.login(state.url);

            return false;
        }
        return true;
    }
}

Охранник пытается войти в систему, передавая state.url (куда пользователь намеревался перейти, прежде чем ему будет предложено войти в систему).

auth.service.ts

@Injectable()
export class AuthService {


    lock = new Auth0Lock(
        environment.auth.clientID,
        environment.auth.domain,
        environment.auth.auth0Options,
    );

    jwtHelper: any;
    // Store authentication data
    // userProfile: any;
    // accessToken: string;
    // authenticated: boolean;

    redirectUrl: any;

    constructor(private router: Router, private jwtService: JwtService) {

        this.jwtHelper = new JwtHelperService();

        this.lock.on('authenticated', (authResult: any) => {

            if (authResult && authResult.accessToken && authResult.idToken) {
                this.setSession(authResult);
                console.log('NAVIGATING TO ANOTHER PAGE');
                this.router.navigate([this.redirectUrl]);


            }

        });

        this.lock.on('authorization_error', error => {
            console.log('Auth Failed', error);
        });
    }

    private setSession(authResult): void {

        console.log('setting session');
        console.log('here', this.redirectUrl);

        this.lock.getUserInfo(authResult.accessToken, (error, profile) => {
            if (error) {
                throw new Error(error);
            }
            this.setProfileToken(authResult.idToken);
            localStorage.setItem('token', authResult.idToken);
            localStorage.setItem('profile', JSON.stringify(profile));
        });
    }

    getLoggedInUser() {
        const user = localStorage.getItem('profile');
        return JSON.parse(user);
    }

    setProfileToken(idToken): void {

        this.jwtService.generate(idToken).subscribe((res) => {
            if (res) {
                localStorage.setItem('profile_token', res.token);
            }
        }, (err) => {
            console.log(err);
        });

    }

    login(redirectUrl: string = '/') {
        this.redirectUrl = redirectUrl;
        console.log('login', this.redirectUrl);
        this.lock.show();
    }

    logout() {
        localStorage.removeItem('profile');
        localStorage.removeItem('token');
        localStorage.removeItem('profile_token');
        this.router.navigate(['/']);
    }

    isAuthenticated() {
        const token = localStorage.getItem('token');
        return !this.jwtHelper.isTokenExpired(token);
    }

}

Служба аутентификации берет state.url и добавляет его к переменной, а затем показывает блокировку. В рамках этой службы я прослушиваю аутентифицированное событие, устанавливаю сеанс и затем перенаправляюсь на этот URL-адрес перенаправления, который был установлен.

Однако auth0 уже имеет свой собственный redirectUrl, который в настоящее время указывает на базовый URL-адрес /. Как только он попадает туда, состояние this.redirectUrl становится неопределенным.

Как я могу решить эту проблему.


person Kay    schedule 25.06.2019    source источник


Ответы (2)


Вместо изменения вашего redirect_uri вы можете использовать URL-адрес без обратного вызова, чтобы он соответствовал вашему варианту использования. Это часто сохраняется следующими способами:

  • Для обычных веб-приложений используйте файл cookie или сеанс.
  • Для одностраничного приложения используйте локальное хранилище в браузере.
  • Для нативного приложения используйте память или локальное хранилище.

С этого момента вы можете определить, как ваше приложение реагирует на перенаправление для желаемого маршрута. Это поддерживается в Lock. Я надеюсь, что это поможет вам в ваших поисках!

https://auth0.com/docs/users/guides/redirect-users-after-login

person Coding Morrison    schedule 25.06.2019

Недавно я реализовал пользовательское перенаправление с библиотекой auth0-js в приложении Angular, используя класс WebAuth. Я следовал рекомендациям в документах Auth0: - https://auth0.com/docs/protocols/oauth2/redirect-users

Вот поток, который я использую:

(перед отправкой пользователя на страницу блокировки auth0)

  1. Создать одноразовый номер (случайная строка)
  2. сохранить путь перенаправления в объекте state и преобразовать его в строку
  3. Установить одноразовый номер в локальном хранилище
  4. вызвать метод авторизации с одноразовым номером и строковым состоянием: WebAuth.authorize({ nonce, state }) (это то, что отправляет пользователю страницу блокировки auth0)
  5. при обработке входа пользователя сравнивайте одноразовый номер из результата входа с одноразовым номером в локальном хранилище
  6. если одноразовые номера совпадают, анализировать строковое состояние из результата входа в систему, извлекать путь перенаправления и перенаправлять пользователя
  7. очистить одноразовый номер из локального хранилища
person christian    schedule 04.11.2019