中间件无法授权[关闭]

Posted

技术标签:

【中文标题】中间件无法授权[关闭]【英文标题】:Middleware unable to authorize [closed] 【发布时间】:2021-05-14 19:35:01 【问题描述】:

我正在学习有关 MERN 堆栈的 Udemy 课程,但在使用 Web 令牌和授权时遇到了问题。

我创建了一个如下所示的 auth.js 文件:

const jwt = require("jsonwebtoken");

function auth(req, res, next) 
  try 
    const token = req.cookie.token;

    if(!token)
        res.status(401).json(errorMessage: "Unauthorized 1");
    

    const validatedUser = jwt.verify(token, process.env.JWT_SECRET);
    req.user = validatedUser.id;

    next();
  
  catch(err) 
    res.status(401).json(errorMessage: "Unauthorized 2");
  


module.exports = auth;

在我的 sn-pRouter.js 文件中,我引入了 auth 并尝试在我的 get 路由器中使用它。如下:

const router = require("express").Router();
const  get  = require("mongoose");
const Snippet = require("../models/snippetModel");
const auth = require("../middleware/auth");

router.get("/", auth, async(req, res) => 
  try
    console.log(req.user); // <-- stuck here

    const snippets = await Snippet.find();
    res.json(snippets);
  
  catch(err)
    res.status(500).send();
  
);

使用 Insomnia,我正在调用 .get 路由器。我应该能够在终端控制台中看到用户 ID,但 Insomnia 给了我“未经授权的 2”错误。

这告诉我在 auth.js 上的 auth 函数的 try 块中发生了一些事情,但我不知道如何弄清楚。我完全按照说明进行操作。

我做错了什么,我该如何解决?

【问题讨论】:

【参考方案1】:

这行代码:

const token = req.cookie.token;

应该是:

const token = req.cookies.token;

因为req.cookie 不存在,您对req.cookie.token 的引用被抛出,因此您进入了catch 块。

对未来的两点建议。首先,当您在服务器上遇到错误时,请始终记录该错误是什么。

如果你有这个:

catch(err)
  console.log(err);
  res.status(500).send();

错误的原因可能很明显,因为 err 会告诉您问题所在。

其次,当您遇到类似这样的问题时,请添加额外的日志记录以查看所有中间值是什么(或设置断点并在调试器中单步执行)。您可能很快就会发现您从未通过const token = req.cookie.token;,然后您可以登录req.cookie 了解原因。这也会告诉你问题出在哪里。


我想不用说,前面的一些步骤需要将令牌设置到适当的 Insomnia cookie jar 中,以便令牌出现在 cookie 中。

【讨论】:

谢谢。我不敢相信我错过了。我一定会利用您对错误的建议。再次感谢。

以上是关于中间件无法授权[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Endpoint 包含授权元数据,但未找到支持授权的中间件

金笛中间件在哪里授权注册

授权中间件 JWT 混淆

C# .NET 5.0 MVC JWT 中间件授权标头

深度解读.NET 5授权中间件的执行策略

在 Ocelot API 网关中间件中返回未授权