javascript - Angular Firebase 身份验证始终重定向到主页

标签 javascript angular firebase

在我正在通过教程练习的这个 Angular 项目中,当我尝试访问需要身份验证的页面时,我被重定向到登录页面,甚至 URL 更改为 http://localhost:4200/login? returnURL=%2F checkout

但是登录后,无论链接如何,它总是重定向到主页。

app.component.ts:

import { Component } from '@angular/core';
import { AuthService } from './auth.service';
import { Router } from '../../node_modules/@angular/router';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  constructor(private auth:AuthService, router:Router){
    auth.user$.subscribe(user=>{
      if(user){
        let returnUrl=localStorage.getItem('returnUrl');
        router.navigateByUrl(returnUrl);
      }
    });
  }
}

auth.service.ts:

import { Injectable } from '@angular/core';
import { AngularFireAuth } from '../../node_modules/angularfire2/auth';
import { Observable } from '../../node_modules/rxjs';
import * as firebase from 'firebase';
import { ActivatedRoute } from '../../node_modules/@angular/router';
@Injectable({
  providedIn: 'root'
})
export class AuthService {
  user$: Observable<firebase.User>;
  constructor(private afAuth:AngularFireAuth,private route:ActivatedRoute) {
    this.user$=afAuth.authState;
   }

  login(){
    let returnUrl=this.route.snapshot.queryParamMap.get('returnUrl') ||'/';
    localStorage.setItem('returnUrl',returnUrl);

    this.afAuth.auth.signInWithRedirect(new firebase.auth.GoogleAuthProvider());

}

  logout(){
    this.afAuth.auth.signOut();
  }
}

app.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import {AngularFireModule} from 'angularfire2';
import {AngularFireDatabaseModule} from 'angularfire2/database';
import {AngularFireAuthModule, AngularFireAuth} from 'angularfire2/auth';
import { Observable} from 'rxjs'; 
import {RouterModule, RouterOutlet, Routes} from '@angular/router';
import { AppComponent } from './app.component';
import { environment } from '../environments/environment';
import { BsNavbarComponent } from './bs-navbar/bs-navbar.component';
import { HomeComponent } from './home/home.component';
import { ProductsComponent } from './products/products.component';
import { ShoppingCartComponent } from './shopping-cart/shopping-cart.component';
import { CheckOutComponent } from './check-out/check-out.component';
import { OrderSucessfulComponent } from './order-sucessful/order-sucessful.component';
import { MyOrdersComponent } from './my-orders/my-orders.component';
import { AdminProductsComponent } from './admin/admin-products/admin-products.component';
import { AdminOrdersComponent } from './admin/admin-orders/admin-orders.component';
import { LoginComponent } from './login/login.component';
import {NgbModule} from '@ng-bootstrap/ng-bootstrap';
import { AuthService } from './auth.service';
import { AuthGuard } from './auth-guard.service';
export const appRoutes: Routes = [

  {path:'',component:HomeComponent},
  {path:'products',component:ProductsComponent},
  {path:'shopping-cart',component:ShoppingCartComponent},
  {path:'login',component:LoginComponent},

  {path:'check-out',component:CheckOutComponent,canActivate:[AuthGuard]},
  {path:'order-sucessful',component:OrderSucessfulComponent,canActivate:[AuthGuard]},
  {path:'my/orders',component:MyOrdersComponent,canActivate:[AuthGuard]},

  {path:'admin/products',component:AdminProductsComponent,canActivate:[AuthGuard]},
  {path:'admin/orders',component:AdminOrdersComponent,canActivate:[AuthGuard]}

  ]



@NgModule({
  declarations: [
    AppComponent,
    BsNavbarComponent,
    HomeComponent,
    ProductsComponent,
    ShoppingCartComponent,
    CheckOutComponent,
    OrderSucessfulComponent,
    MyOrdersComponent,
    AdminProductsComponent,
    AdminOrdersComponent,
   LoginComponent
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(appRoutes),
    AngularFireModule.initializeApp(environment.firebase),
    AngularFireDatabaseModule,
    AngularFireDatabaseModule,
    NgbModule.forRoot()

  ],

  providers: [AngularFireAuth,AuthService,AuthGuard],
  bootstrap: [AppComponent]
})
export class AppModule { }

最佳答案

似乎在您的 localStorage.getItem('returnUrl'); 中始终设置为应用程序的根目录,最好先检查是否有值,然后删除该值并重定向用户,例如如下:

let returnUrl = localStorage.getItem('returnUrl');

if (returnUrl) {
  localStorage.removeItem('returnUrl');
  router.navigateByUrl(returnUrl);
}

希望这对您有帮助!

关于javascript - Angular Firebase 身份验证始终重定向到主页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51447001/

相关文章:

swift - Firebasedata 不填充 tableView

swift - 按下“点赞”按钮后,Firebase 中如何记录“点赞”?

javascript - 在使用 iOS Phonegap 包装的 jQuery Mobile 中找不到具有相对 src 的图像

angular - Materialise-CSS 和 @Angular/Material 主题冲突

javascript - Angular 5 httpClient - 使用 PUT jsonplaceholder 404

angular - 调整 mat-form-field Angular Material 的高度

javascript - Jquery wrap()- 正斜杠前的字符 `/`

javascript - 如何从纯 JavaScript 函数中恢复源代码?

Javascript拼接最后一个元素

firebase - 从 Firefox 和 Safari 扩展中使用 Firebase