1

我正在学习 Web 应用程序,刚开始使用 jwt 身份验证。

我了解一般流程。后端如何创建 jwt 令牌以及前端如何检索在每个后续请求中传递的令牌。

但是在每个在线教程或 youtube 教程视频中都提到我们需要一个签名来创建一个令牌,该令牌包含一个只有客户端知道的密钥。但是在所有前端教程中,他们都在发送不记名令牌,其中未显示密钥的使用。

有人可以告诉我如何将密钥与令牌一起传递给服务器吗?

4

1 回答 1

0

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

于 2018-06-25T05:39:15.117 回答