Express 中间件 jsonwebtoken 认证
Express Middleware jsonwebtoken authentication
我的服务器有一个注册 api,在注册后提供一个令牌,以及一个验证用户令牌的中间件。我需要注册一个帐户以获取令牌以对我的服务器执行其他操作。但是,中间件阻止了我的网络请求,因为我还没有令牌。
那么在这种情况下我该如何创建我的帐户和令牌呢?通过一些技巧通过中间件?
中间件:
// Middleware to verify token, it will be called everytime a request is sent to API
api.use((req, res, next)=> {
var token = req.headers.token
if (token) {
jwt.verify(token, secret, (err, decoded)=> {
if (err) {
res.status(403).send({ success: false, message: "Failed to authenticate user." })
} else {
req.decoded = decoded
next()
}
})
} else {
res.status(403).send({ success: false, message: "No Token Provided." })
}
})
登录:
// Sign In with email API
api.post('/signInWithEmail', (req, res)=> {
User.findOne({
email: req.body.email
}).select(userFields).exec((err, user)=> {
if(err) {
throw err
}
if (!user) {
res.send({ message: "User doesn't exist"});
} else if (user) {
var validPassword = user.comparePassword(req.body.password);
if (!validPassword) {
res.send({ message: "Invalid Password"});
} else {
var token = createToken(user);
res.json({
success: true,
message: "Login Successfully!",
token: token
})
}
}
})
})
创建一个函数来检查令牌并公开您的路由,这样每当您需要调用经过身份验证的路由时,您将首先检查令牌,然后再公开路由。
示例代码
假设这是我的检查令牌功能
function checkToken(req, res, next) {
var x = req.token; //This is just an example, please send token via header
if (x === token)
{
next();
}
else
{
res.redirect(/unauthorized); //here do whatever you want to do
}
}
现在让我们使用路由函数。
app.post('/protectedroute', checkToken, routename.functionname);
app.post('/notprotected', routename.functionname);
如果您想为不同的代码设置单独的路由,则由您决定,否则您可以通过在主文件中保持它们的功能等来调用特定的代码块,即 app.js
或 server.js
,无论你选择什么。
我们实际上在这里做的是 - 我们正在制作我们自己的中间件,以通过代码块或函数的通道公开我们的路由。
我的服务器有一个注册 api,在注册后提供一个令牌,以及一个验证用户令牌的中间件。我需要注册一个帐户以获取令牌以对我的服务器执行其他操作。但是,中间件阻止了我的网络请求,因为我还没有令牌。
那么在这种情况下我该如何创建我的帐户和令牌呢?通过一些技巧通过中间件?
中间件:
// Middleware to verify token, it will be called everytime a request is sent to API
api.use((req, res, next)=> {
var token = req.headers.token
if (token) {
jwt.verify(token, secret, (err, decoded)=> {
if (err) {
res.status(403).send({ success: false, message: "Failed to authenticate user." })
} else {
req.decoded = decoded
next()
}
})
} else {
res.status(403).send({ success: false, message: "No Token Provided." })
}
})
登录:
// Sign In with email API
api.post('/signInWithEmail', (req, res)=> {
User.findOne({
email: req.body.email
}).select(userFields).exec((err, user)=> {
if(err) {
throw err
}
if (!user) {
res.send({ message: "User doesn't exist"});
} else if (user) {
var validPassword = user.comparePassword(req.body.password);
if (!validPassword) {
res.send({ message: "Invalid Password"});
} else {
var token = createToken(user);
res.json({
success: true,
message: "Login Successfully!",
token: token
})
}
}
})
})
创建一个函数来检查令牌并公开您的路由,这样每当您需要调用经过身份验证的路由时,您将首先检查令牌,然后再公开路由。
示例代码
假设这是我的检查令牌功能
function checkToken(req, res, next) {
var x = req.token; //This is just an example, please send token via header
if (x === token)
{
next();
}
else
{
res.redirect(/unauthorized); //here do whatever you want to do
}
}
现在让我们使用路由函数。
app.post('/protectedroute', checkToken, routename.functionname);
app.post('/notprotected', routename.functionname);
如果您想为不同的代码设置单独的路由,则由您决定,否则您可以通过在主文件中保持它们的功能等来调用特定的代码块,即 app.js
或 server.js
,无论你选择什么。
我们实际上在这里做的是 - 我们正在制作我们自己的中间件,以通过代码块或函数的通道公开我们的路由。