如何使用 JWT 从前端(角度 4)将密钥传递到后端(节点 js)

Posted

技术标签:

【中文标题】如何使用 JWT 从前端(角度 4)将密钥传递到后端(节点 js)【英文标题】:How to pass secret key to backend(node js) from frontend(angular 4) using JWT 【发布时间】:2018-12-03 14:22:21 【问题描述】:

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

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

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

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

【问题讨论】:

您可以在这篇文章中找到相关信息medium.com/@ryanchenkie_40935/… 您不需要传递密钥,它将主要存储在您的应用程序中的配置文件中。使用密钥创建 jwt 令牌并附加到注册请求,之后您点击您必须传递令牌和密钥的任何请求都用于解码您的令牌,它不能在客户端。 所以,我怀疑客户端是否只需要发送令牌,那么任何人都可以获取令牌并将其发送到服务器端的服务器,令牌将使用密钥进行验证,那么在哪里安全吗? 【参考方案1】:

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 中将拦截器作为提供者注入

【讨论】:

所以,我怀疑客户端是否只需要发送令牌,那么任何人都可以获取令牌并将其发送到服务器端的服务器,令牌将使用密钥进行验证,那么在哪里安全吗? 客户端发送到由服务器自己编码的令牌,并使用只有服务器知道的密钥,因此当他从任何客户端收到 http 调用时,他首先检查令牌并使用相同的密钥来查看令牌是否有效服务器不接受任何令牌这种通信理论上它称为非对称加密您可以查看这篇文章以查看安全性在哪里medium.com/@vrypan/… 请原谅我,但我很难理解这一点,因为我是新手。假设服务器向您发送由服务器本身使用密钥编码的令牌,但最终它将是编码字符串,现在我可以破解该令牌并将该字符串发送到服务器,服务器将向我发送信息,因为该字符串将包含密钥由服务器编码。

以上是关于如何使用 JWT 从前端(角度 4)将密钥传递到后端(节点 js)的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像从前端(reactjs)传递到后端(nodejs)并将其上传到firebase存储?

签署从前端到后端的 api 调用

使用 angularjs 将图像传递到后端

如何正确地将 blob 从前端传递到后端?

当令牌在角度4中过期时如何重定向到注销

如何将 JWT 从客户端传递到我的 API 以进行正确身份验证?