我是Node Js的新手。之前,我曾使用Laravel API。在Laravel中,我使用保存在数据库中的令牌处理端点以使用某些端点。例如:<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.may.Application</mainClass>
</configuration>
</plugin>
</plugins>
</build>
。如果没有传递令牌,则API将显示localhost:3000/api/users/getall?token=1234
。如果令牌无效,则系统将显示Unauthorized access and no token provided
。以这种方式,如何使用Mongo数据库中保存的令牌来验证端点?
用户模型
Invalid token
以下用户getAll端点只能由管理员访问
getAll端点
var bcrypt = require('bcryptjs');
var mongoose = require('mongoose');
var userSchema = new mongoose.Schema(
{
fname : {type: String, required: true, max: 25, trim: false},
uname : {type: String, required: true, max: 25, trim: false},
password : {type: String, required: true},
token : {type: String, required: true},
role: {type: String, required: true}, //0 - admin, 1 - counter
},
{
timestamps:true
});
mongoose.model('User', userSchema);
module.exports = mongoose.model('User');
上面的getAll路由现在也可以由admin和counter访问。而且它不是从数据库中检查令牌(即:可以不带令牌访问)。
如何使用令牌检查和验证?
答案 0 :(得分:0)
在执行任何操作之前,请从查询参数中获取令牌并对其进行验证。如果无效,只需发送“ 401未经授权”状态或您喜欢的任何答复。
router.get("/", function (req, res, next) {
const token = req.query.token
if (!isValid(token)) return res.status(401).end()
User.find()
.select('fname uname')
.exec()
.then(docs => {
return res.send(setting.status("User details retrieval successfully", true, docs))
})
.catch(err => {
return res.send(setting.status("Error in retrieving user details",false, err))
});
})
确保您明确返回,否则执行将继续。或仅使用if-else
语句。
答案 1 :(得分:0)
您可以使用中间件来验证请求。在server.js上
//validate requests
app.use ('/', function (req, res, next) {
if (
// except the public requests (for login ...)
req.originalUrl.indexOf ('/public') > -1
) {
next ();
} else {
if (
// Compare with your token
req.query &&
req.query.hasOwnProperty ('access_token') &&
req.query.access_token === 'YOUR_TOKEN'
) {
next ();
} else {
// STOP
return res.json ({
success: false,
message: 'Failed to authenticate.',
});
}
}
});
希望有帮助。