인증 경로에 대한 게시 요청을 수행 할 때마다 매 토큰을 이전 토큰에 추가합니다. 나는이 문제jwt.sign() 매번 이전 토큰에 토큰을 추가했습니다.
const express = require("express");
const router = express.Router();
const User = require("../models/user");
const bcrypt = require("bcryptjs");
const config = require("../config/data");
const jwt = require("jsonwebtoken");
const mongoose = require("mongoose");
//Registration route
router.post("/register",(req,res)=>{
let date=new Date();
let newUser = new User({
name:req.body.name,
email:req.body.email,
password:req.body.password,
role:"User",
isActive:true,
created:date,
updatedToken:"JWT"
});
User.addUser(newUser,(err,user)=>{
if(err){
res.json({success: false, msg:'Failed to register user'});
} else {
res.json({success: true, msg:'User registered'});
}
});
});
//Authentication route
router.post('/authenticate', (req, res) => {
const email = req.body.email;
const password = req.body.password;
User.getUser(email, (err, user) => {
if(err) throw err;
if(!user){
return res.json({success: false, msg: 'User not found'});
}
User.comparePassword(password, user.password, (err, isMatch) => {
if(err) throw err;
if(isMatch){
let payload={
name:user.name,
email:user.email,
role:user.role,
deleted:user.deleted,
isActive:user.isActive,
created:user.created,
updatedToken:user.updatedToken,
};
let token=jwt.sign(payload,config.secret)
User.saveToken(email,token,(err,success)=>{
if(err) return err;
console.log("Success");
res.json({
success: true,
token: token
});
});
} else {
return res.json({success: false, msg: 'Wrong password'});
}
});
});
});
// router.use(function(req, res, next) {
// // check header or url parameters or post parameters for token
// var token = req.body.token || req.query.token || req.headers['x-access-token'];
// // decode token
// if (token) {
// // verifies secret and checks exp
// jwt.verify(token, app.get('superSecret'), function(err, decoded) {
// if (err) {
// return res.json({ success: false, message: 'Failed to authenticate token.' });
// } else {
// // if everything is good, save to request for use in other routes
// req.decoded = decoded;
// next();
// }
// });
// } else {
// // if there is no token
// // return an error
// return res.status(403).send({
// success: false,
// message: 'No token provided.'
// });
// }
// });
// // Dashboard
// router.get('/dashboard', (req, res) => {
// res.json({user: req.user});
// });
module.exports = router;
의 이유를 찾을 수 없습니다 그리고 이것은 스키마 및 기능
const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");
const config = require("../config/data");
const jwt = require("jsonwebtoken");
let userSchema = mongoose.Schema({
name:{
type:String,
required:true
},
email:{
type:String,
required:true
},
password:{
type:String,
required:true
},
role:{
type:String,
required:true
},
deleted:{
type:Date,
default:null,
},
isActive:{
type:Boolean,
required:true
},
created:{
type:Date,
required:true
},
updatedToken:{
type:String,
required:true
}
});
let User = module.exports = mongoose.model('User',userSchema,'Users');
module.exports.getUser = function(username, callback){
let query = {email: username}
User.findOne(query, callback);
}
module.exports.addUser = function(newUser, callback){
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(newUser.password, salt, (err, hash) => {
if(err) throw err;
newUser.password = hash;
newUser.save(callback);
});
});
}
module.exports.comparePassword = function(candidatePassword, hash, callback){
bcrypt.compare(candidatePassword, hash, (err, isMatch) => {
if(err) throw err;
callback(null, isMatch);
});
}
module.exports.saveToken = function(username,token,callback){
let query = {email:username};
let updateToken={updatedToken:token};
User.findOneAndUpdate(query,updateToken,callback);
}
module.exports.generateToken=function(payload,secret){
let token = jwt.sign(payload,secret,{
expiresIn: 604800
})
return token;
}
이 서버
const express = require ("express");
const app = express();
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const config = require("./config/data");
const cors = require("cors");
const morgan = require("morgan");
const route = require("./routes/users");
mongoose.Promise = global.Promise;
let options = {
useMongoClient: true,
reconnectTries: Number.MAX_VALUE,
reconnectInterval: 500,
poolSize: 10,
bufferMaxEntries: 0
};
mongoose.connect(config.database,options);
let db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log(`DB connected ${new Date()}...`);
});
app.use(bodyParser.json());
app.use(cors());
app.use(morgan('dev'));
app.get('/',(req,res)=>{
res.send("Works aziz");
});
app.use("/users",route);
app.listen(config.port,()=>{
console.log(`Server running ${config.port}...`);
});
이다 나는 것이 필요하다 사용자가 pos를 수행하는 경우 t 라우트를 인증하라는 요청을 보내면 토큰을 생성하여 사용자가 포스트 요청을 할 때마다 연결하지 않고 변수 토큰에 제공해야합니다. 대단히 감사합니다 !!!!!!
시도 : findOneAndUpdate (query, {$ set : updateToken}, callback) –
나는 시도했지만 jwt.sign() 메서드에서 문제가 발생하면 사용자가 게시물 요청을 할 때마다 토큰을 만들어야하며 jwt.sign() 메서드의 값이지만 이전의 모든 요청 값을 가져 와서 모두 연결합니다. 답변 주셔서 감사합니다)))))) –
공유 할 수있는 공개 프로젝트입니까? 나는 복제 할 수없는 것처럼 보였기 때문에 그것을 복제하고 시도하고 싶다. –