okey 让我们先了解一下 jwt 认证的过程 首先在用户第一次登录时在后端生成密钥 后端服务器检查用户是否存在,并在登录请求的响应中服务器使用秘密词和与用户相关的唯一信息(通常是用户 ID 和令牌过期时间验证)对令牌进行编码
const payload = {
sub: user.id,
exp: moment().add(EXPIRATION_DAYS_NUMBER, CONSTANTS.TIME_UNITY).unix()
}
let token = jwt.encode(payload, CONSTANTS.JWT_SECRET)
一旦令牌被编码,服务器在登录请求的响应中发送它,客户端抓住这个令牌并将其存储在本地存储中,客户端现在应该使用令牌与服务器进行任何未来的通信,每个通信都需要身份验证需要身份验证的 http 调用我们在标头中发送令牌,因此服务器将检查中间件中的标头并解码相同 JWT_SECRT 的令牌以了解它是否是有效令牌
middelware(req,res,next)
let token = req.headers.authorization
let payload = jwt.decode(token, CONSTANTS.JWT_SECRET)
user.findOne({ id: payload.sub }).exec((err, user) => {
if (err) return res.forbidden('not authorized')
next()
})
在客户端,我们可以使用 angular Interceptor 在标头中设置令牌,以便与服务器进行所有通信
import { Injectable } from '@angular/core';
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
constructor( {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
setHeaders: {
Authorization: `Bearer localstorage.getItem(token)}`
}
});
return next.handle(request);
}
}
并在 app.module 中将拦截器作为提供者注入