2017-07-18 60 views
0

我想实现的角度门卫检查,如果用户是在近期签署,使他们能够更改密码,更新电子邮件等如何确定用户在火力

使用记录在“最近”任角火2或角我有一个句柄给用户(firebase.User)。但是,如何检查他们是否有资格获得“最近登录”以执行敏感操作?

import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router'; 
import { Observable } from 'rxjs/Rx'; 
import { Injectable, OnInit } from '@angular/core'; 
import { AuthService } from './auth.service'; 

import * as firebase from 'firebase/app'; 

@Injectable() 
export class AuthGuard implements CanActivate { 


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

    } 

    canActivate(route: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot): Observable<boolean> { 
    return this.authService.user$.map((user) => { 
     if (user) { 
     // how to validate that this user is a recent login? 
     return true; 
     } else { 
     console.log('not authenticated'); 
     this.router.navigateByUrl('/login'); 
     return false; 
     } 
    }).first(); 
    } 

    canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 
    return this.canActivate(route, state); 
    } 
} 

回答

2

为什么不总是在任何敏感信息之前重新进行身份验证。这是常见做法,Firebase提供了用于重新验证的API。您可以检查Firebase ID令牌中的auth_time,以确认最后一次登录的时间,但Firebase身份验证没有记录最近登录的要求的条件,并且可能不会因为他们保留因安全原因而更改它的权利。您最好只需要重新认证,或者您可以尝试updatePassword/updateEmail,但如果您遇到特定错误,请重新认证并重试。

+0

哪里是'auth_time'?我尝试过'getIdToken',但它只是解析了令牌字符串。 –

+0

我也很困惑你如何实现重新认证的流程?我找不到一个工作的例子。如果您需要在表单中传递密码以更改密码/名称等,我会得到它,但它如何与Gmail等联合登录一起使用?如何获得该方法所需的凭证对象? –

+0

您必须解析该令牌字符串。您可以使用一些JWT解析库来执行此操作。通过联合登录,您可以使用'currentUser.reauthenticateWithPopup(provider)'或'currentUser.reauthenticateWithRedirect(provider)'。如果您已拥有Google访问令牌或ID令牌,则可以使用'currentUser.reauthenticateWithCredential(firebase.auth.GoogleAuthProvider.credential(googleIdToken,googleAccessToken))' – bojeil