Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularfire2 AngularFireAuthGuard在登录后重定向URL_Angularfire2_Auth Guard - Fatal编程技术网

Angularfire2 AngularFireAuthGuard在登录后重定向URL

Angularfire2 AngularFireAuthGuard在登录后重定向URL,angularfire2,auth-guard,Angularfire2,Auth Guard,我使用firebase和AngularFireAuthGuard来保护特定的路由,这样只有经过身份验证的用户才能访问它们。 特别是,我的MainComponent和MgmtComponent应该只能由经过身份验证的用户访问 const redirectUnauthorizedToLogin = () => redirectUnauthorizedTo(['/login']); const routes: Routes = [ { path: 'teams/:teamId/sessio

我使用firebase和AngularFireAuthGuard来保护特定的路由,这样只有经过身份验证的用户才能访问它们。 特别是,我的MainComponent和MgmtComponent应该只能由经过身份验证的用户访问

const redirectUnauthorizedToLogin = () => redirectUnauthorizedTo(['/login']);

const routes: Routes = [
  { path: 'teams/:teamId/sessions/:sessionId',
    component: MainComponent,
    canActivate: [AngularFireAuthGuard], data: { authGuardPipe: redirectUnauthorizedToLogin }
  },
  { path: 'mgmt',
    component: MgmtComponent,
    canActivate: [AngularFireAuthGuard], data: { authGuardPipe: redirectUnauthorizedToLogin }
  },
  {
    path: 'login',
    component: LoginComponent
  }
];
我的问题是,成功登录后,用户没有重定向回最初请求的URL。 因此,我想要/期望的是:

  • 用户转到
    /mgmt
  • 由于用户未通过身份验证,他将自动重定向到
    /login
  • 用户身份验证(例如通过google或Facebook OAuth)
  • 用户将自动重定向回最初请求的页面(
    /mgmt

  • 步骤1-3可以正常工作,但缺少步骤4。

    这是一个开放的功能请求,angularfire团队正在处理它:

    与此同时,我找到了一个解决办法: 在app-routing-module.ts中,而不是

    const redirectUnauthorizedToLogin = () => redirectUnauthorizedTo(['/login']);
    
    我使用以下内容将url存储在sessionStorage中:

    const redirectUnauthorizedToLogin = (route: ActivatedRouteSnapshot) => {
      const path = route.pathFromRoot.map(v => v.url.map(segment => segment.toString()).join('/')).join('/');
    
      return pipe(
        loggedIn,
        tap((isLoggedIn) => {
          if (!isLoggedIn) {
            console.log('Saving afterLogin path', path);
            sessionStorage.setItem('afterLogin', path);
          }
        }),
        map(loggedIn => loggedIn || ['/login'])
      );
    };
    
    在LoginComponent中,我从会话存储中读取要重定向的值:

    sessionStorage.getItem('afterLogin');
    this.router.navigateByUrl(redirectUrl);
    

    现在特性请求已经存在,您可以使用auth-guard来执行此操作。然而,这些文件并不清楚,所以我是这样做的

    /**将重定向URL添加到登录*/
    const redirectUnauthorizedToLogin=(下一步:ActivatedRouteSnapshot,状态:RouterStateSnashot)=>{
    返回redirectUnauthorizedTo(`/login?redirectTo=${state.url}`);
    };
    /**如果可以重定向登录用户,则使用redirectTo查询参数,或默认为“/”*/
    const redirectLoggedInToPreviousPage=(下一步:ActivatedRouteSnapshot,状态:RouterStateSnashot)=>{
    让重定向URL='/';
    试一试{
    const redirectToUrl=新URL(state.URL、location.origin);
    const params=新的URLSearchParams(重定向tourl.search);
    redirectUrl=params.get('redirectTo')| |'/';
    }捕捉(错误){
    //无效的URL
    }
    返回redirectLoggedInTo(重定向URL);
    };