Javascript 通过express处理jwt令牌返回错误“;const token=req.cookies.auth;[0]^[0][0]引用错误:未定义请求";
我正在尝试完成jwt登录我正在尝试在登录中创建jwt令牌。然后我正在尝试在我的用户问题路由中使用它 我使用的是react前端 这样做正确吗 我目前收到一个错误Javascript 通过express处理jwt令牌返回错误“;const token=req.cookies.auth;[0]^[0][0]引用错误:未定义请求";,javascript,node.js,express,jwt,Javascript,Node.js,Express,Jwt,我正在尝试完成jwt登录我正在尝试在登录中创建jwt令牌。然后我正在尝试在我的用户问题路由中使用它 我使用的是react前端 这样做正确吗 我目前收到一个错误 const token = req.cookies.auth; [0] ^ [0] [0] ReferenceError: req is not defined 下面是my routes登录代码,它在my sql server返回电子邮件和密码的值存在时分配令牌。用户问题尝试使用此jwt。我还介绍了如何在函
const token = req.cookies.auth;
[0] ^
[0]
[0] ReferenceError: req is not defined
下面是my routes登录代码,它在my sql server返回电子邮件和密码的值存在时分配令牌。用户问题尝试使用此jwt。我还介绍了如何在函数中验证令牌
Verfiy用户
app.get("/user-questions", verifyToken, function(req, res) {
app.use(function(req, res, next) {
// decode token
if (token) {
jwt.verify(token, "secret", function(err, token_data) {
if (err) {
console.info("token did not work");
return res.status(403).send("Error");
} else {
req.user_data = token_data;
sql.connect(config, function(err) {
if (err) console.log(err);
// create Request object
var request = new sql.Request();
// query to the database and get the records
request.execute("dbo.ViewQuestions", function(err, recordset) {
if (err) console.log(err);
// send records as a response
res.json(recordset);
next();
});
});
}
});
} else {
console.info("no token");
console.log("no token");
return res.status(403).send("No token");
}
});
});
登录路径
app.post("/login", async (req, response) => {
try {
await sql.connect(config);
var request = new sql.Request();
var Email = req.body.email;
var Password = req.body.password;
console.log({ Email, Password });
request.input("Email", sql.VarChar, Email);
request.input("Password", sql.VarChar, Password);
var queryString =
"SELECT * FROM TestLogin WHERE email = @Email AND password = @Password";
//"SELECT * FROM RegisteredUsers WHERE email = @Email AND Password = HASHBYTES('SHA2_512', @Password + 'skrrt')";
const result = await request.query(queryString);
if (result.recordsets[0].length > 0) {
console.info("/login: login successful..");
console.log(req.body);
token = jwt.sign(
{ Email },
"secretkey",
{ expiresIn: "30s" },
(err, token) => {
res.json({
token
});
res.cookie("auth", token);
res.send("ok");
}
);
} else {
console.info("/login: bad creds");
response.status(400).send("Incorrect email and/or Password!");
}
} catch (err) {
console.log("Err: ", err);
response.status(500).send("Check api console.log for the error");
}
});
验证用户
// Verify Token
function verifyToken(req, res, next) {
// Get auth header value
const bearerHeader = req.headers["authorization"];
// Check if bearer is undefined
if (typeof bearerHeader !== "undefined") {
// Split at the space
const bearer = bearerHeader.split(" ");
// Get token from array
const bearerToken = bearer[1];
// Set the token
req.token = bearerToken;
// Next middleware
next();
} else {
// Forbidden
res.sendStatus(403);
}
}
请告知这在理论上是否可行。如果没有,请告知如何解决
编辑:
这个错误已经解决了,但是现在我的jwt令牌不起作用了。当我登录并手动路由到用户问题时,它不会加载组件,并且在控制台中显示403不可用(当jwt令牌不工作时,这在代码中设置)
更新:
我该如何包括
['authorization'] = 'Bearer ' + token;
进入
handleSubmit(e){
e、 预防默认值();
if(this.state.email.length<8 | | this.state.password.length<8){
警告(`请正确输入表格');
}否则{
const data={email:this.state.email,密码:this.state.password};
获取(“/login”{
方法:“POST”、//或“PUT”
标题:{
接受:“application/json,text/plain,*/*”,
“内容类型”:“应用程序/json”,
},
正文:JSON.stringify(数据)
})
//.then(response=>response.json())
。然后(数据=>{
console.log(“成功:”,数据);
})
.catch(错误=>{
控制台错误(“错误:”,错误);
});
}
}
您的代码有几个错误:
- 在您的
路线中:/login
- 您正在尝试在发送响应后设置“auth”cookie
- 您尝试发送两次响应,一次通过
发送,一次通过res.json
res.send
- 您正在分配给一个不再存在的
变量(token
)token=jwt.sign(…)
- 在您的
方法中:verifyToken
- 此方法只是验证请求是否具有令牌集,而不是验证或解码它。我将考虑将您的<代码> jWt.Valuffe()/Cux>调用这个方法。
- 在您的
路线中:/用户问题
- 您正在调用
app。在
的内部使用app.get
,当这两个函数都要在根级别调用时。删除你的
应用程序。使用
呼叫
- 您需要从请求中获取
,例如token
const{token}=req代码>
- 您正在通过
发送响应,但之后仍在调用res.json()
。从: 如果当前中间件函数没有结束请求-响应周期,它必须调用next()将控制权传递给下一个中间件函数next()
- 您正在调用
以下是我将如何进行这些更改:
路线:/login
app.post(“/login”),异步(请求,响应)=>{
试一试{
等待sql.connect(配置);
var request=new sql.request();
var Email=req.body.Email;
var Password=req.body.Password;
log({Email,Password});
请求输入(“电子邮件”,sql.VarChar,电子邮件);
请求.输入(“密码”,sql.VarChar,密码);
变量查询字符串=
“从TestLogin中选择*,其中email=@email和password=@password”;
//“从RegisteredUsers中选择*,其中email=@email和Password=HASHBYTES('SHA2_512',@Password+'skrrt')”;
const result=wait request.query(queryString);
if(result.recordsets[0]。长度>0){
console.info(“/login:login successful..”;
控制台日志(请求主体);
jwt符号(
{Email},
“秘密密钥”,
{expiresIn:“30s”},
(err,token)=>res.cookie('auth',token).json({token})
);
}否则{
console.info(“/login:bad creds”);
回复。状态(400)。发送(“错误的电子邮件和/或密码!”);
}
}捕捉(错误){
日志(“Err:,Err”);
response.status(500.send)(“检查api console.log以了解错误”);
}
});
方法:verifyToken
//验证令牌
功能验证令牌(req、res、next){
//获取身份验证标头值
const bearerHeader=请求头[“授权”];
//检查持票人是否未定义
if(承载器类型!=“未定义”){
//在空间上分裂
const bearer=bearerHeader.split(“”);
//从数组中获取令牌
const bearerToken=bearer[1];
//验证令牌并将其存储
jwt.verify(bearerToken,“secret”,函数(err,decodedToken){
如果(错误){
console.info(“令牌不起作用”);
返回res.status(403).send(“错误”);
}
//设置令牌
req.token=bearerToken;
req.decodedToken=decodedToken;
next();
});
}否则{
//禁止的
res.sendStatus(403);
}
}
路线:/用户问题
app.get(“/user questions”),验证令牌,函数(req,res){
//如果一个请求已经到达这一点,那么我们知道他们有一个有效的令牌
//并且该令牌可通过req.token(编码)或
//或req.decodedToken
sql.connect(配置,函数(错误){
if(err)console.log(err);
//创建请求对象
var request=new sql.request();
//查询数据库并获取记录
request.execute(“dbo.ViewQuestions”),函数(err,recordset){
if(err)console.log(err);
//将记录作为响应发送
res.json(记录集);
});
});
});
您的代码有几个错误:
handleSubmit(e) {
e.preventDefault();
if (this.state.email.length < 8 || this.state.password.length < 8) {
alert(`please enter the form correctly `);
} else {
const data = { email: this.state.email, password: this.state.password };
fetch("/login", {
method: "POST", // or 'PUT'
headers: {
Accept: "application/json, text/plain, */*",
"Content-Type": "application/json",
},
body: JSON.stringify(data)
})
// .then(response => response.json())
.then(data => {
console.log("Success:", data);
})
.catch(error => {
console.error("Error:", error);
});
}
}