我目前正在使用/学习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,
};
创建用户
2条答案
按热度按时间nwwlzxa71#
这就是你的代码如何获得toke:
但是从图片上看,你似乎是在请求的主体中传递令牌作为字段,因此在
req.headers.authorization
中找不到它。你必须把它放在那里
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请求测试选项卡**,并将令牌保存在集合变量或环境变量中。
现在,在任何需要令牌的请求中使用此变量jwt-token作为授权令牌。下面是SS。