Angular2 - Redirect to calling url after successful login

后端 未结 3 979
说谎
说谎 2020-11-28 09:30

I have my application up and running with Angular 2.1.0. The routes are protected via router Guards, canActivate.

When pointing the browser to a protected area like

相关标签:
3条回答
  • 2020-11-28 09:44

    This code will handle your request:

    export class AuthGuard implements CanActivate {
      constructor(private authService: AuthService,
                  private router: Router) {
      }
    
      canActivate(next: ActivatedRouteSnapshot,
                  state: RouterStateSnapshot): Observable<boolean> {
        return this.authService.isVerified
          .take(1)
          .map((isVerified: boolean) => {
            if (!isVerified) {
              this.router.navigate(['/login'], {queryParams: {returnUrl: state.url}});
              return false;
              // return true;
            }
            return true;
          });
      }
    }

    but be aware that the URL params will not pass with the URL!!

    You can find a nice tutorial here : http://jasonwatmore.com/post/2016/12/08/angular-2-redirect-to-previous-url-after-login-with-auth-guard

    0 讨论(0)
  • 2020-11-28 09:47

    The answers I saw were correct. But the best way to answer your question is returnUrl. like this:

    export class AuthGuardService implements CanActivate {
    
      constructor(private auth: AuthenticationService, private router: Router) { }
    
      canActivate(next: ActivatedRouteSnapshot,
        _state: import('@angular/router').RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
        let isLoggedIn = false;
        const idToken = next && next.queryParamMap.get('id_token');
        try {
          const expiresAt = idToken && JSON.parse(window.atob(idToken.split('.')[1])).exp * 1000;
          if (idToken && expiresAt) {
            isLoggedIn = true;
            localStorage.setItem('id_token', idToken);
            localStorage.setItem('expires_at', String(expiresAt));
          } else {
            isLoggedIn = this.auth.isLoggedIn();
          }
        } catch (e) {
          console.error(e);
          isLoggedIn = this.auth.isLoggedIn();
        }
        if (!isLoggedIn) {
          //this section is important for you:
          this.router.navigate(['/login'], { queryParams: { returnUrl: _state.url }});
        }
        return isLoggedIn;
      }
    }
    

    This navigate create a url with returnUrl like a param, now you can read returnUrl from param.

    GoodLuck.

    0 讨论(0)
  • 2020-11-28 09:52

    There's a great example in the Angular Docs, Teach Authguard To Authenticate. Basically the idea is using your AuthGuard to check for your login status and store the url on your AuthService. Some of the code is on the url above.

    AuthGuard

    import { Injectable }       from '@angular/core';
    import {
      CanActivate, Router,
      ActivatedRouteSnapshot,
      RouterStateSnapshot
    }                           from '@angular/router';
    import { AuthService }      from './auth.service';
    
    @Injectable()
    export class AuthGuard implements CanActivate {
      constructor(private authService: AuthService, private router: Router) {}
    
      canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        let url: string = state.url;
    
        return this.checkLogin(url);
      }
    
      checkLogin(url: string): boolean {
        if (this.authService.isLoggedIn) { return true; }
    
        // Store the attempted URL for redirecting
        this.authService.redirectUrl = url;
    
        // Navigate to the login page with extras
        this.router.navigate(['/login']);
        return false;
      }
    }
    

    AuthService or your LoginService

    import { Injectable } from '@angular/core';
    import { Http, Response } from '@angular/http';
    import { Router } from '@angular/router';
    
    @Injectable()
    export class AuthService {
      isLoggedIn: boolean = false;    
      // store the URL so we can redirect after logging in
      public redirectUrl: string;
    
      constructor (
       private http: Http,
       private router: Router
      ) {}
    
      login(username, password): Observable<boolean> {
        const body = {
          username,
          password
        };
        return this.http.post('api/login', JSON.stringify(body)).map((res: Response) => {
          // do whatever with your response
          this.isLoggedIn = true;
          if (this.redirectUrl) {
            this.router.navigate([this.redirectUrl]);
            this.redirectUrl = null;
          }
        }
      }
    
      logout(): void {
        this.isLoggedIn = false;
      }
    }
    

    I think this will give an idea how things work, of course you probably need to adapt to your code

    0 讨论(0)
提交回复
热议问题