2

我正在尝试使用 Angular 和 .Net 核心来了解身份验证过程,它向我发送了一个 jwt Bearer 令牌(Works)。所以我的问题是我不知道我应该在警卫和身份验证服务中做什么来正确管理用户(稍后使用角色)。但是我尝试了一些东西,现在我不知道我应该在我的 AuthService 中做什么。

编辑 登录帖子完成后,我将从服务器获得令牌和到期日期。所以我想存储这些,然后再声明,但我知道如何。以及我应该返回什么。

这就是我的 AuthService 的样子:

@Injectable()
export class AuthService {

 isLoggedIn = false;

  constructor(private http: HttpClient) {}

 login( email:string, password:string ) :Observable<boolean>{
    this.http.post('/login', {email, password})
    .subscribe(data =>
    {
      //TODO: check for Token ??? 
        let userAuth = data;
        if(userAuth) {
          localStorage.setItem('currentUser', JSON.stringify(userAuth));
          return true;
        }else{
          return false;
        }
    },
    (err: HttpErrorResponse) => {
      if(err.error instanceof Error){
        console.log("error client side");
      }else{
        console.log("Server side error.");
      }
    });
    //what should i return ????? and how
   }

 logout() {
  localStorage.removeItem('currentUser');
 }
}

现在我不知道如何检查令牌是否存在以及如何返回布尔值(如果它是 Observable)。登录完成后检查未来调查也很重要?

m AuthGuard 看起来像这样:

@Injectable()
export class AuthGuardService implements CanActivate{

constructor(private router:Router) { }

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

if(localStorage.getItem('currentUser')){
  return true;
}

 this.router.navigate(['auth/login'], 
  {queryParams: { returnUrl: state.url}});

 }

}
4

1 回答 1

1

只是我的意见和想法。

我个人会在我的登录方法中执行此操作。这实际上会返回一个 Observable。注意:您需要在您的登录组件中订阅。

login( email:string, password:string ) :Observable<boolean>{
  return this.http.post('/login', {email, password})
    .map(data => {
      let userAuth = data;
      if(userAuth) {
        localStorage.setItem('currentUser', JSON.stringify(userAuth));
        return true;
      }else{
        return false;
      }
    }
}

现在关于你的后卫。你查确实很周。您可以请求检查它是否有效,但这会使您的应用程序非常慢。在我看来,最好简单地检查令牌在前端是否有效。这假设您的后端服务检查每个请求的令牌。由于前端的所有内容都可以修改,因此无法在前端处理此问题。同样,只需确保您的后端在过度请求时检查您的令牌。

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):  boolean | Observable<boolean> {
  if(localStorage.getItem('currentUser') && 
    JSON.parse(localStorage.getItem('currentUser')).expireTime < new Date().getTimeInMillis()){ //You need to have the expire value in your token.
      return true;
  }

  this.router.navigate(['auth/login'], {queryParams: { returnUrl: state.url}});
}
于 2017-12-18T14:41:55.153 回答