如何从节点 api 中的获取请求中解码 JWT 令牌

Posted

技术标签:

【中文标题】如何从节点 api 中的获取请求中解码 JWT 令牌【英文标题】:How to get JWT token decoded from get request in node api 【发布时间】:2020-04-22 02:59:01 【问题描述】:

我正在跨授权请求发送 JWT 令牌,但是我似乎每次都无法获取令牌解码。它适用于一种方法,但不适用于另一种方法。第一个 sn-p 从服务器端给出一个“解码”的令牌结果,但第二个没有。

public async getAllUsers(req: Request, res: Response) 
    try 
      const payload = req["decoded"]; // gives the token decoded
      if (payload) 
        let users: ILoginResult = await UserData.getAllUsers(payload);
        res.status(users.status).send(users.result);
      
     catch (e) 
      res.status(500).send( error: e.toString() );
    
  
  public async getAccountDetails(req: Request, res: Response) 
    try 
      const user = req["decoded"]; // always undefined
      let details: IDetails = await AccountData.getAccountDetails(name);
      res.status(200).send(details);
     catch (e) 
      let err = e.toString();
      res.status(500).send( error: err );
    
  

邮递员的请求包含一个bearer token,它在登录时提供并在应用程序的其他部分使用。不知道为什么它适用于一个而不是另一个。如果有人能更好地解释这里发生的事情和/或提供提示、建议和建议,我将不胜感激。

编辑 - 添加请求详细信息

获取请求至:http://localhost:5000/api/v1/account 带有令牌:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE1Nzc5OTUwMjUsImV4cCI6MTU3ODE2NzgyNSwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdCJ9.--msLba1VPs4Nv_B9YL6fk2DFHkQCgiVvDJFPt_UnDk

decoded 属性用于我正在遵循的教程中,该教程似乎是从服务器端添加的,但解释得不好,我还没有找到好的替代/解释。我认为它也没有任何中间件。对 alt 方法非常开放。

【问题讨论】:

您在请求处理程序中的 getAccountDetails 之前是否使用了中间件?我正在考虑如何在请求对象中设置“解码”属性?... @ranieribt 我错了,完全有一个中间件在路由上工作,这似乎是问题,因为它创建了解码的属性。谢谢! 你在学习哪个教程? @SuleymanSah 我相信来自 Scotch.IO 的 Vue 和 Node one 的身份验证,尽管我从多个中挑选,因为我无法在一个中找到我想要的一切。 那么您的问题解决了吗? 【参考方案1】:

感谢 cmets 的建议,我能够在创建此处使用的 decoded 属性的路径中找到缺失的部分。通过将中间件添加到路由器,请求按预期工作:

import express from "express";
import UserController from "../controllers/UserController";
import valid from "../utils/ValidateToken";

export default (router: express.Router) => 
  router
    .route("/users")
    .post(UserController.addUser)
    .get(valid.validateToken, UserController.getAllUsers);

  router.route("/login").post(UserController.loginUser);
  router.route("/account").get(valid.validateToken, UserController.getAccountDetails);
;

valid.validateToken 丢失,这是从正在传递的 JWT 生成解码对象的位。故事的道德,总是仔细检查一切。感谢所有评论/回答的人!

【讨论】:

以上是关于如何从节点 api 中的获取请求中解码 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

从Xamarin Forms请求Web API中的JWT时获取错误请求

如何在 api 网关架构中获取 JWT 令牌

JWT 令牌作为 API 中用户详细信息的来源?

如何从.Net Core API 中的身份验证 JWT 令牌中获取身份用户?

如何测试使用 JWT 身份验证的节点 API(使用用户登录获取令牌)

如何从 NextJS / ReactJS 中的 JWT cookie 获取用户信息