gpt4 book ai didi

javascript - JWT 登录 - 在中间件中未找到授权 token

转载 作者:搜寻专家 更新时间:2023-11-01 00:48:27 24 4
gpt4 key购买 nike

我按照教程使用 JWT token 向我的 Node.js 应用程序添加登录和注册,但我很难登录并重定向到我的“已登录”管理页面。用户注册效果很好,但我无法弄清楚登录部分。

这是我遵循的教程: https://medium.freecodecamp.org/learn-how-to-handle-authentication-with-node-using-passport-js-4a56ed18e81e

我的登录代码如下所示:

router.post('/login', auth.optional, (req, res, next) => {
console.log(req.body);

var user = {
email: req.body.email,
password: req.body.password
}

if (!user.email) {
return res.status(422).json({
errors: {
email: 'is required',
},
});
}

if (!user.password) {
return res.status(422).json({
errors: {
password: 'is required',
},
});
}

return passport.authenticate('local', { session: false }, (err, passportUser, info) => {

if (err) {
return next(err);
}

if (passportUser) {
const user = passportUser;
user.token = passportUser.generateJWT();
console.log("TOKEN: " + user.token);

res.setHeader('Authorization', 'Token ' + user.token);

return res.json({ user: user.toAuthJSON() });
}

return res.status(400).json({
errors: {
message: info,
},
});

})(req, res, next);
});

我的“/admin”“已登录”路由如下所示:

router.get("/admin", auth.required, function(req, res) {
res.render('admin', {
user : req.user // get the user out of session and pass to template
});
});

我不确定如何在传递 token 的同时重定向到我的“/admin”路由,因为目前我在登录后看到以下错误。这是有道理的,因为我没有将 token 传递给“/admin” '路线......但我该怎么做? :)

UnauthorizedError: No authorization token was found at middleware

在此先感谢您的帮助!

编辑:

仍然无法弄清楚这个问题,也不真正理解这个流程应该如何工作......标题需要在哪里设置为 token 以及如何在登录后重定向到我的管理页面成功。

如果有帮助,这是我的中间件代码:

const getTokenFromHeaders = (req) => {

console.log("REQ: " + JSON.stringify(req.headers));

const { headers: { authorization } } = req;

if(authorization && authorization.split(' ')[0] === 'Token') {
return authorization.split(' ')[1];
}

return null;
};

const auth = {
required: jwt({
secret: 'secret',
userProperty: 'payload',
getToken: getTokenFromHeaders,
}),

optional: jwt({
secret: 'secret',
userProperty: 'payload',
getToken: getTokenFromHeaders,
credentialsRequired: false,
}),
};

最佳答案

你的代码没有问题。您似乎对从服务器到客户端(前端/Web)的登录流程感到困惑。

让我们首先看一下RESTFUL 的实现方式。该文章还引用了相同的流程。

RESTFUL API 流程如下所示:

用户登录请求:POST:/api/v1/auth/login 在请求正文中包含用户名和密码。如果成功,用户将返回基本信息和 token 。否则,将向用户返回一个 401(未经授权)状态代码。登录流程到此结束

先前提供给用户的 token 用于对后端进行后续调用,用户可以使用该 token 对系统执行不同的操作。本质上,是客户端使用登录请求中提供的 token 向服务器请求后续操作。

因此对于您的情况,用户在收到 token 后应该请求从后端检索管理信息。

但是,我假设您正在从服务器端呈现 View ,并且您希望在用户成功登录后呈现管理 View ,这非常简单。

代替你的 res.json() 成功登录后。您需要使用 res.render()

res.render('admin', {
user: user.toAuthJSON() // assuming your user contains the token already
})

编辑:

因为 res.render() 不会更改浏览器中的 url。为此,您需要使用 res.redirect()。但问题是,您不能在 res.redirect() 中发送上下文。

为此,您需要将用户 token 作为查询参数传入。参见 here .

长话短说

// assuming you are using Node v7+
const querystring = require('querystring');
const query = querystring.stringify({
token: user.token,
});
const adminRoute = '/admin?' + query;
res.redirect(adminRoute)

在你的管理路由中,你需要稍微修改一下代码。

  1. 验证 token 属于真实用户并从 token 中获取用户信息。
  2. 使用从第 1 步中检索到的用户信息呈现 admin 模板。
router.get("/admin", function(req, res) {
// verify the token
const token = req.query.token;
const user = null;
jwt.verify(token, 'secret', function (err, decoded) {
if (err) {
res.status(401).send('Unauthorized user')
}
// decoded contains user
user = decoded.user
});

res.render('admin', {
user : user
});
});

关于javascript - JWT 登录 - 在中间件中未找到授权 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55528010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com