无法从标头检索令牌,JWT 令牌未存储在 cookie 存储中,因为我无法从本地存储检索用户信息。 我正在从 jwt 令牌检索用户信息,当我遇到一个独特的错误时,当我编写代码时,它给出的输出为未定义,并且存储在标头下的 cookie 似乎不正确。我这样做是因为我想从令牌中检索用户电子邮件。除此之外,数据没有存储在 cookie 存储中,如果您问我为什么使用 cookie 存储,那是因为我没有得到如何从本地存储获取令牌的解决方案。最有趣的是,当我在雷霆客户端中运行它时,生成了正确的结果,但是当从浏览器调用令牌时,输出是未定义的。代码和令牌如下所述
将 cookie 存储在 cookie 存储中的代码,但它没有存储在 cookie 存储中
router.post('/signin',async(req,res)=>{
// some more validation need to be done
// like if the user exist and if so is the password correct
// creating signup logic
console.log("reached signin page successfully");
const email = req.body.email;
const password = req.body.password;
const users = await User.findOne({
email
})
if(users)
{
console.log("successfully logged in")
const passcompare = password === users.password;
if(passcompare)
{
const token = jwt.sign
(
email
,JWT)
// res.json
// ({
// success:true,
// msg:token
// })
res.status(200);
res.cookie("cookie",token,
{httpOnly:true
// secure:process.env.NOD_ENV==="production",
// maxAge:1000,
// signed:true,
}
)
res.json({
success:true,
token
});
}
else
{
res.json
({
success:false,
msg: "password incorrect"
})
}
}
else
{
res.json({
success:false,
msg:"No user found With the above credentials"
})
}
})
// Now using middlewere here
router.get('/signinn',fetchuser,async (req,res)=>
{
// const autheader = req.headers.token;
// console.log("Token value is ", autheader);
console.log("reached signnn");
let userdata = await User.findOne({
email:req.email
})
if(userdata)
{
res.json({
userdata
})
}
})
// middleware
const fetchuser = async (req,res,next)=>
{
console.log("reached middleware")
const token2 = req.headers.token;
// const token2 = req.cookies.cookie;
// console.log(token2)
if(!token2)
{
res.status(401)
.send
({
msg:"No token found"
})
}
else
{
try
{
const data = jwt.verify(token2,JWT);
req.email = data;
next();
}
catch(error)
{
res.status(401)
.send
({
msg:"No token found"
})
}
}
}
// 获取数据的前端代码
const [username,setusername] = useState()
useEffect(()=>{
fetch('http://localhost:4000/user/signinn')
.then((response)=>response.json())
.then((data)=>setusername(data))
},[])
console.log("hello",username);
这是标题部分的输出 不知道这是什么
cookie=eyJh%---some more text ------% dRNc3d4Y7o; Path=/; HttpOnly`
是的,我终于找到答案了。 答案是,我们可以使用以下代码获取令牌,然后将令牌存储到文件中。中间件将从文件中读取令牌,使用“密钥”验证令牌,并将输出作为电子邮件提供给我们。 以下是我用来从浏览器获取令牌的代码。
将此代码包含在 require 部分。
var LocalStorage = require('node-localstorage').LocalStorage;
localStorage = new LocalStorage('./scratch');
它将创建名为scratch的文件夹
localStorage.setItem("token1",token);
这将在scratch文件夹中创建一个名为token1的文件,其值为token。 该部分必须放在生成令牌的部分下,以便它可以捕获令牌值并传递到文件 token1 进行存储。
const token2 = localStorage.getItem('token1')
这将获取 token1(之前存储在 token1 文件中)值并存储在 token2 中
现在您有了令牌,验证它并获取用户的详细信息。
如果还有其他解决方案请提供给我。
希望这会有所帮助!