postman 无效的JWT令牌

nmpmafwu  于 8个月前  发布在  Postman
关注(0)|答案(2)|浏览(150)

我目前正在使用/学习Json Web令牌,并学习如何在未来的应用程序中实现受保护的路由,因为我正在关注“Learn Mern Stack”youtube视频。我正在使用Postman,当我为我的应用程序创建一个新的时,它也会创建一个令牌,当我以该用户的身份登录时,我的代码仍然有效,我会得到相同的令牌,但是当我试图将该令牌作为Bearer令牌输入时,它会出现错误。我发现的是:

  • 由于某些原因,我的令牌没有得到验证,导致401“未授权”错误。
  • 当我在www.example.com中输入我的令牌时JWT.io,我不断收到错误“无效签名”,并出现警告错误“警告:看起来你的JWT签名没有使用base64 url正确编码”-在做了一些重新配置后,我试图输入base64.RawURLEncoding和其他类似的尝试到我的代码中,但我的令牌仍然是未经授权的。
  • 令牌书写正确,分隔正确,没有“=”符号,并且没有过期。这里有一些图片和我的代码片段,有人能给予我一个提示,为什么会发生这种情况?
const express = require("express");
const router = express.Router();
const {
  registerUser,
  loginUser,
  getMe,
} = require("../controllers/userController.js");
const { protect } = require("../middleware/authMiddleware.js");

router.post("/", registerUser);
router.post("/login", loginUser);
router.get("/me", protect, getMe);

module.exports = router;
const jwt = require("jsonwebtoken");
const asyncHandler = require("express-async-handler");
const User = require("../models/userModel");

const protect = asyncHandler(async (req, res, next) => {
  let token;

  if (
    base64.RawURLEncoding.req.headers.authorization &&
    base64.RawURLEncoding.req.headers.authorization.startsWith("Bearer")
  ) {
    try {
      // Get token from header
      token = req.headers.authorization.split(" ")[1];

      // Verify token
      const decoded = jwt.verify(token, process.env.JWT_SECRET);

      // Get user from the token
      req.user = await User.findById(decoded.id).select("-password");

      next();
    } catch (error) {
      console.log(error);
      res.status(401);
      throw new Error("Not authorized");
    }
  }

  if (!token) {
    res.status(401);
    throw new Error("Not authorized, no token");
  }
});

module.exports = { protect };
const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
const asyncHandler = require("express-async-handler");
const User = require("../models/userModel");

// @desc    Register new user
// @route   POST /api/users
// @access  Public
const registerUser = asyncHandler(async (req, res) => {
  const { name, email, password } = req.body;

  if (!name || !email || !password) {
    res.status(400);
    throw new Error("Please add all fields");
  }

  // Check if user exists
  const userExists = await User.findOne({ email });

  if (userExists) {
    res.status(400);
    throw new Error("User already exists");
  }

  // Hash password
  const salt = await bcrypt.genSalt(10);
  const hashedPassword = await bcrypt.hash(password, salt);

  // Create user
  const user = await User.create({
    name,
    email,
    password: hashedPassword,
  });

  if (user) {
    res.status(201).json({
      _id: user.id,
      name: user.name,
      email: user.email,
      token: generateToken(user._id),
    });
  } else {
    res.status(400);
    throw new Error("Invalid user data");
  }
});

// @desc    Authenticate a user
// @route   POST /api/users/login
// @access  Public
const loginUser = asyncHandler(async (req, res) => {
  const { email, password } = req.body;

  // Check for user email
  const user = await User.findOne({ email });

  if (user && (await bcrypt.compare(password, user.password))) {
    res.json({
      _id: user.id,
      name: user.name,
      email: user.email,
      token: generateToken(user._id),
    });
  } else {
    res.status(400);
    throw new Error("Invalid credentials");
  }
});

// @desc    Get user data
// @route   GET /api/users/me
// @access  Private
const getMe = asyncHandler(async (req, res) => {
  res.status(200).json(req.user);
});

// Generate JWT
const generateToken = (id) => {
  return jwt.sign({ id }, process.env.JWT_SECRET, {
    expiresIn: "30d",
  });
};

module.exports = {
  registerUser,
  loginUser,
  getMe,
};

创建用户

nwwlzxa7

nwwlzxa71#

这就是你的代码如何获得toke:

token = req.headers.authorization.split(" ")[1]; // from 'req.headers.authorization'

但是从图片上看,你似乎是在请求的主体中传递令牌作为字段,因此在req.headers.authorization中找不到它。
你必须把它放在那里

s3fp2yjn

s3fp2yjn2#

兄弟,据我从你的截图和问题的理解,我认为你正在尝试做以下事情
1.使用API/users创建用户后终结点
1.使用**/API/users/loginPost端点登录。- 这也会在响应中获得JWT Token。
1.尝试通过
API/users/me获取端点获取用户详细信息-这会导致“No Authorization”错误。
我猜你没有在那个请求(API/users/me)中发送Authorization头,因为我在那个请求上没有看到任何绿色检查(请参阅那个请求的屏幕截图)。因此,您必须将该令牌设置为Basic auth header。按照上面答案中Ahmed Sbai提供的屏幕截图。如果希望自动设置,请转到
/API/users/login请求测试选项卡**,并将令牌保存在集合变量或环境变量中。

var login_response=pm.response.json();
    pm.collectionVariables.set("jwt-token",login_response.token);

现在,在任何需要令牌的请求中使用此变量jwt-token作为授权令牌。下面是SS。

相关问题