所以我有一个简单的angular 2/laravel应用程序,支持jwt身份验证。我有一个服务,每次调用路由时都会使用angular2-jwt tokenNotExpired()函数验证jwt令牌是否有效,但是这个函数总是返回false是有原因的,所以用户总是被重定向到登录页面。
因此,就像用户登录一样,后端将生成一个令牌并保存在本地存储中,然后服务将在使用CanActivate生命周期钩子启动任何路由之前检查该令牌是否有效。
以下是我到目前为止所做的:
登录组件:
...
this.http.post(SERVER_URL + 'auth', body, {
headers: headers
}
).subscribe(
data => {
localStorage.setItem('auth_token', data.json().token);
this.authHttp.get(SERVER_URL + 'auth/user', headers)
.subscribe(
data => {
this.store.dispatch({ type: SET_CURRENT_USER_PROFILE, payload: data.json().user });
localStorage.setItem('user', data.json().user);
this.router.navigate(['/home']);
},
err => console.log('Fehlermeldung: ' + err)
);
},
...app.module:
...
{ provide: AuthConfig, useValue: new AuthConfig({
headerName: 'Authorization',
headerPrefix: 'Bearer ',
tokenName: 'auth_token',
tokenGetter: (() => localStorage.getItem('auth_token')),
globalHeaders: [{ 'Content-Type': 'application/json' }],
noJwtError: true,
noTokenScheme: true
})},
AuthHttp
...auth.service : //检查JWT令牌服务
import { tokenNotExpired } from 'angular2-jwt';
import { Injectable } from '@angular/core';
@Injectable()
export class AuthService {
loggedIn() {
return tokenNotExpired();
}
}auth.guard.service:
// Check if the Token of the user is still valid
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
import { AppState } from '../shared/interfaces';
import { SET_CURRENT_USER_PROFILE } from '../shared/state.actions';
import { Store } from '@ngrx/store'
@Injectable()
export class AuthGuardService implements CanActivate {
constructor(private auth: AuthService, private router: Router, private store: Store<AppState>) {}
canActivate() {
if(this.auth.loggedIn()) {
return true;
} else {
console.log ('Token expired or not valid')
localStorage.setItem('auth_token', '');
localStorage.setItem('user', '');
this.store.dispatch({ type: SET_CURRENT_USER_PROFILE, payload: null });
this.router.navigate(['/']);
return false;
}
}
}app.routing:
const routes: Routes = [
{ path: 'home', component: HomeComponent},
{ path: 'about', component: AboutComponent, canActivate: [AuthGuardService]},
{ path: 'profile/:id', component: ProfileComponent, canActivate: [AuthGuardService]},
{ path: '', component: LoginComponent}
];编辑:在后端,一切正常,因为令牌是在用户登录后生成并存储在本地存储中的。
发布于 2017-04-20 17:04:58
由于属性名称,它假定它是"token“。因此,当您提供属性名称作为第一个参数时,它将正常工作。
例如:
tokenNotExpired('auth_token')
有关该问题的更多信息可在此处找到:https://github.com/auth0/angular2-jwt/issues/334
发布于 2016-10-28 17:40:47
解决方案:这就是我为每个可能有相同问题的人修复它的方法,我使用JWTHelper函数isTokenExpired()而不是tokenNotExpired,并且我颠倒了服务中的逻辑,虽然我不确定为什么它能工作
auth.service现在看起来是这样的:
@Injectable()
export class AuthService {
private jwtHelper: JwtHelper = new JwtHelper();
private token = localStorage.getItem('auth_token');
isExpired() {
return this.jwtHelper.isTokenExpired(this.token);
}
}和auth.guard.service canActivate():
canActivate() {
if (this.auth.isExpired()) {
console.log (this.auth.isExpired());
localStorage.setItem('auth_token', '');
localStorage.setItem('user', '');
this.store.dispatch({ type: SET_CURRENT_USER_PROFILE, payload: null });
this.router.navigate(['/']);
return false;
} else {
return true;
}
}发布于 2017-08-20 16:07:58
`localStorage.setI`tem('id-token',token);用于将令牌保存到本地存储/会话存储相同令牌名称可以作为参数传递给
return tokenNotExpired('id-token');https://stackoverflow.com/questions/40259519
复制相似问题