我正在尝试理解带有.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');
}
}现在,我不知道如何检查令牌是否存在,以及如何返回布尔值(如果可以观察到的话)。并且在登录完成后,还有什么也是重要的,以检查以后的调查?
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}});
}
}发布于 2017-12-18 14:41:55
只是我的意见和想法。
就我个人而言,我会在我的登录方法中这样做。这实际上是一个可以观察到的结果。注意:您需要在登录组件中订阅。
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;
}
}
}现在是关于你的警卫。你检查一下确实是非常的一周。您可以请求检查它是否有效,但这会使您的应用程序变得非常慢。在我看来,最好只是检查令牌在前端是否有效。这假设您的后端服务检查每个请求的令牌。因为前端上的所有东西都可以修改,所以在前端没有保存的方法来处理这个问题。同样,确保后端检查overy请求上的令牌。
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}});
}https://stackoverflow.com/questions/47869285
复制相似问题