JWT toke如何过期工作?当令牌在Node JS和Angle 7中过期时自动注销

时间:2020-05-31 15:25:54

标签: node.js angular

我非常喜欢新的nodejsangular 7,我正在使用jwt token进行身份验证,一旦令牌过期,我想自动重定向到登录页面。我知道已经问过类似的问题,但我也很累,因为我没有为我解决问题。

admin.controller.js

const controller = require("./admin.service");
const jwt = require("jsonwebtoken")

module.exports = {
    verifyAdmin: (req, res) => {
        const sign = jwt.sign({admin_user: req.body}, "mysecretkey", {
            expiresIn: "1h"
        })
        req.body.admin_token = sign
        const body = req.body;
        controller.adminLogin(body, (err, result) => {
            if(err) {
                console.log(err)
                 res.status(500).json({
                    success: 0,
                    message: "Database connection error"
                })
            } else{
                if(result[0].length > 0) {

                    console.log(result[0][0].admin_user)
                    res.json({
                        success: 1,
                        message: result[0],
                        token: sign
                    })
                } else {

                    res.json({
                        success:0,
                        message: "We cannot find it"
                    })
                }
            }
        })
    }

因此有人建议使用HttpInterceptor是个好主意,对此我也使用了,但不要惊慌。

auth.service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpParams, HttpHeaders, HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http';
import { Teacher } from '../shared/teacher.model';
import { Subject, Observable } from 'rxjs';

@Injectable()
export class AuthService implements HttpInterceptor {

  // private adminValidateUrl = "http://localhost:3000/getData";
  private adminValidateUrl = "http://localhost:3000/adminApi/verifyAdmin"
  private verifyAdminToken = "http://localhost:3000/adminApi/getAdminUserName"
  private getTeacherRecordsUrl = "http://localhost:3000/api/getTeacherRecords"
  private removeTeacherUrl = "http://localhost:3000/adminApi/removeTeacherRecord"


   subject = new Subject<Teacher[]>();
   teachers: Teacher[] = []
  constructor(private http: HttpClient) { }
  headers = new Headers({
    'Content-Type': 'application/json',
    'Token': localStorage.getItem("admin_token")
});

  adminValidation(adminData: any) {
    console.log(adminData)
    return this.http.post<any>(this.adminValidateUrl, adminData)
  }

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {


  const authReq = req.clone({ headers: req.headers.set("Token", localStorage.getItem("Token")) });

  console.log("Sending request with new header now ...");

  //send the newly created request
  return next.handle(authReq)
  .pipe(err => {
      // onError
      console.log(err);
      if (err instanceof HttpErrorResponse) {
          console.log(err.status);
          console.log(err.statusText);
          if (err.status === 401) {
              window.location.href = "/login";
          }
      }
      return Observable.throw(err);
  }) as any;

}
  getAdminUserName() {
    const token = localStorage.getItem('admin_token');
    return this.http.get<any>(this.verifyAdminToken, {
      observe: "body",
      headers: new HttpHeaders().set("Authorization", "Bearer " + token)
    });
  }

  getTeacherRecordsFromDB() {
    return this.http.get<any>(this.getTeacherRecordsUrl, {
     observe: "body" 
    })
  }

  removeTeacher(teacher: Teacher) {
    const token = localStorage.getItem('admin_token');
      return this.http.post<any>(this.removeTeacherUrl, teacher, {
        observe: "body",
        headers: new HttpHeaders().set("Authorization", "Bearer " + token)
      })
  }
}

或者可能是我使用不正确。

所以我想要一种方法,当令牌过期并带有令牌过期消息时,我的角度页面会自动重定向到登录页面。

谢谢。

0 个答案:

没有答案