【发布时间】:2019-08-19 21:19:30
【问题描述】:
我有 node.js 包,它在 ubuntu 中使用了 rest api。当我登录时,这个服务器(节点包)在 json 正文中给了我一个令牌。所以当我想在服务器中做某事(任何请求)时,我正在使用这个令牌。但是,当我尝试将服务器提供的令牌与登录名和客户端发送到服务器的令牌进行比较时出现错误。
从服务器获取令牌的代码:
router.post('/login',(req,res)=>{
const name = req.body.name;
const password = req.body.password;
console.log("Login request by "+name+" with password: "+password);
if(name == "asdasd" && password == "asdadsad"){
console.log("Auth succesful");
const token = jwt.sign(
{
user: name,
password: password
},
process.env.JWT_KEY,
{
expiresIn: "1h"
}
)
return res.status(200).json({
message:"Auth succesful",
token: token
});
}else {
return res.status(401).json({
message:"Auth failed :("
})
}
})
使用给定令牌发出请求的代码:
router.post('/add',checkAuth,(req,res,next)=>{
console.log('haha');
const {
fname, mname, lname, birthdate, created, updated, sex, place, title_id
} = req.body
pool.query(`INSERT INTO users (
fname, mname, lname, birthdate, created, updated, sex, place, title_id
) VALUES ($1, $2,$3, $4,$5, $6,$7, $8,$9)`, [
fname, mname, lname, birthdate, created, updated, sex, place, title_id
], (error, result) => {
if (error) {throw error}
res.status(201).send(`User added with ID: ${result.insertId}`)
})
})
上面提到的checkAuth代码:
const jwt = require('jsonwebtoken')
module.exports = (req,res,next) =>{
try{
const decoded = jwt.verify(req.headers.authorization, process.env.JWT_KEY);
req.userData = decoded;
next();
}catch (error) {
return res.status(401).json({
message: "Auth failed"
});
}
}
nodemon.json 文件:
{
"env": {
"JWT_KEY": "secret"
}
}
这是我使用 postman 或 android studio 连接到服务器时收到的来自服务器的 json 响应:
{
"message": "Auth failed"
}
这是 consol.log(process.env); 的结果
Object {ALLUSERSPROFILE: "C:\ProgramData", AMD_ENTRYPOINT: "vs/workbench/services/extensions/node/extensionHos…", APPDATA: "C:\Users\aydogan\AppData\Roaming", APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL: "true", CommonProgramFiles: "C:\Program Files\Common Files", …}
check-auth.js:6
[[StableObjectId]]:2
ALLUSERSPROFILE:"C:\ProgramData"
AMD_ENTRYPOINT:"vs/workbench/services/extensions/node/extensionHostProcess"
APPDATA:"C:\Users\aydogan\AppData\Roaming"
APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL:"true"
CommonProgramFiles:"C:\Program Files\Common Files"
CommonProgramFiles(x86):"C:\Program Files (x86)\Common Files"
CommonProgramW6432:"C:\Program Files\Common Files"
COMPUTERNAME:"AYDOGAN"
ComSpec:"C:\WINDOWS\system32\cmd.exe"
DriverData:"C:\Windows\System32\Drivers\DriverData"
FPS_BROWSER_APP_PROFILE_STRING:"Internet Explorer"
FPS_BROWSER_USER_PROFILE_STRING:"Default"
HOMEDRIVE:"C:"
HOMEPATH:"\Users\aydogan"
IntelliJ IDEA:"C:\Program Files\JetBrains\IntelliJ IDEA 2018.3.5\bin;"
LOCALAPPDATA:"C:\Users\aydogan\AppData\Local"
LOGONSERVER:"\\AYDOGAN"
NUMBER_OF_PROCESSORS:"8"
OneDrive:"C:\Users\aydogan\OneDrive"
OneDriveConsumer:"C:\Users\aydogan\OneDrive"
JWT_KEY 似乎未定义,我可以通过调试看到它。
感谢您的帮助
【问题讨论】:
-
你也使用 Express.js 吗?你也可以分享你的主js文件
-
检查 `process.env` 控制台是什么样子的。并且 nodemon 配置文件不应该是
nodemon.json -
我不使用 Express.js。它已经是 nodemon.json,很抱歉给您带来不便,我将 process.env 添加到 @ambianBeing 上方。非常感谢您的帮助。
-
它是通过邮递员工作的吗??
-
只有 chechAuth 有问题。所有其他(我没有分享的)通过 Postman 和 Android Studio 和 React.js 运行良好。 @sultania23 chechAuth 也在工作,但完全错误