首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >angular2-jwt内标识not无效

angular2-jwt内标识not无效
EN

Stack Overflow用户
提问于 2016-10-26 18:14:52
回答 4查看 2.4K关注 0票数 1

所以我有一个简单的angular 2/laravel应用程序,支持jwt身份验证。我有一个服务,每次调用路由时都会使用angular2-jwt tokenNotExpired()函数验证jwt令牌是否有效,但是这个函数总是返回false是有原因的,所以用户总是被重定向到登录页面。

因此,就像用户登录一样,后端将生成一个令牌并保存在本地存储中,然后服务将在使用CanActivate生命周期钩子启动任何路由之前检查该令牌是否有效。

以下是我到目前为止所做的:

登录组件:

代码语言:javascript
复制
   ...
            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:

代码语言:javascript
复制
...
 { 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令牌服务

代码语言:javascript
复制
import { tokenNotExpired } from 'angular2-jwt';
import { Injectable } from '@angular/core';

@Injectable()
export class AuthService  {

    loggedIn() {
    return tokenNotExpired();
    }

}

auth.guard.service:

代码语言:javascript
复制
// 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:

代码语言:javascript
复制
const routes: Routes = [
  { path: 'home', component: HomeComponent},
  { path: 'about', component: AboutComponent, canActivate: [AuthGuardService]},
  { path: 'profile/:id', component: ProfileComponent, canActivate: [AuthGuardService]},
  { path: '', component: LoginComponent}
];

编辑:在后端,一切正常,因为令牌是在用户登录后生成并存储在本地存储中的。

EN

回答 4

Stack Overflow用户

发布于 2017-04-20 17:04:58

由于属性名称,它假定它是"token“。因此,当您提供属性名称作为第一个参数时,它将正常工作。

例如:

代码语言:javascript
复制
tokenNotExpired('auth_token')

有关该问题的更多信息可在此处找到:https://github.com/auth0/angular2-jwt/issues/334

票数 2
EN

Stack Overflow用户

发布于 2016-10-28 17:40:47

解决方案:这就是我为每个可能有相同问题的人修复它的方法,我使用JWTHelper函数isTokenExpired()而不是tokenNotExpired,并且我颠倒了服务中的逻辑,虽然我不确定为什么它能工作

auth.service现在看起来是这样的:

代码语言:javascript
复制
@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():

代码语言:javascript
复制
  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;
    }
  }
票数 1
EN

Stack Overflow用户

发布于 2017-08-20 16:07:58

代码语言:javascript
复制
`localStorage.setI`tem('id-token',token);

用于将令牌保存到本地存储/会话存储相同令牌名称可以作为参数传递给

代码语言:javascript
复制
return tokenNotExpired('id-token');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40259519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档