오늘은 응용 프로그램에서 올바르게 설정하는 방법을 알아 내려고 passport-jwt를 사용해 보았습니다. 사용자 등록 및 jwt 토큰 저장에 문제가 없었지만 여권을 사용하고 있다고 생각하지 않습니다. 이제 사용자 로그인을 시도하고 있는데 항상 오류 Error: Failed to serialize user into session
가 표시됩니다. 나는 아래 기사의 숫자에서 볼 수있다 :Passport, Unified Serialization, 401 Error
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
그러나 나는 어떤 예 또는이 어디에 사용 설명 여권 문서의도 구성 부분을 찾을 수 없습니다. 내 문제의 근원 일 수는 있지만 확실하지 않습니다. 혼란 스러울 수있는 여권의 특징 중 하나는 JWT 추출기입니다. 나는 여권을 jwt 토큰으로 바꾸고 mongo 데이터베이스에 저장하기 만하면되는데, 왜 내가 필요로하는 것일까? jsonwebtoken
을 사용하고 필요에 따라 문자열을 해시/해해하지 않고 cookie-parser
을 사용하여 Passport와 같은 것을 사용하는 대신 내 세션을 만드는 것이 더 쉽지 않습니까? 나는 또한 나머지 호출에서 passport.authenicate()를 사용하려고 시도했지만 401이 반환됩니다. 실패한 시도가 로그인 호출 아래에 주석 처리 된 것을 볼 수 있습니다.
제발 도와주세요, 나는 훨씬 덜 강력한 것보다 복잡한 여권을 찾고있는 유일한 사람인 것처럼 느낍니다. 그러나 나는 그것을 밖으로 분류하는 데 정말로 전념하고 있습니다!
import express from 'express';
import path from 'path';
import bodyParser from 'body-parser';
import connection from './database';
import jwt from 'jsonwebtoken';
import cors from 'cors';
import crypto from 'crypto';
import passport from "passport";
import passportJWT from "passport-jwt";
const JwtStrategy = passportJWT.Strategy;
const ExtractJwt = passportJWT.ExtractJwt;
import { User } from './schema';
import { read } from 'fs';
const app = express();
const corsOptions = {
origin: '*',
optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204
}
app.use(cors(corsOptions));
app.use(passport.initialize());
app.use(passport.session());
const jwtOptions = {
jwtFromRequest: ExtractJwt.fromBodyField('Password'),
secretOrKey: 'secretKey',
jsonWebTokenOptions: { expiresIn: 172800 }
}
passport.use(new JwtStrategy(jwtOptions, (jwt_payload, done) => {
User.findOne({ password: jwt_payload.sub }, (err, user) => {
user ? done(null, user) : done(null, false);
});
}));
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'build')));
app.get('/*', (req, res) => {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
app.post('/test', (req, res) => {
console.log('Success');
console.log(req.body);
res.json(req.body);
});
app.post('/register', async (req, res) => {
if (req.body.FirstName
&& req.body.LastName
&& req.body.Email
&& req.body.Password
) {
const token = await jwt.sign(
{ Password: req.body.Password },
jwtOptions.secretOrKey,
{ expiresIn: '48h' }
);
const CreatedAt = await Date.now();
const newUser = await new User({
FirstName: req.body.FirstName,
LastName: req.body.LastName,
Email: req.body.Email,
Password: token,
});
await newUser.save(err => {
err ? console.log(err) : res.json(newUser);
});
}
throw new('error');
});
// app.post('/login', passport.authenticate('jwt', { session: false }),
// (req, res) => {
// console.log(req.user)
// if (req.body.Email && req.body.Password) {
// User.findOne({ Email: req.body.Email }, (err, user) => {
// if (err) return console.log(err);
// console.log(user);
// return user;
// }).then((res) => {
// jwt.verify(res.Password, jwtOptions.secretOrKey, (err, decoded) => {
// err ? console.log(err) :
// req.login(decoded, (err) => {
// // if (err) { return next(err); };
// if (err) {
// console.log(err)
// } else {
// console.log(decoded)
// }
// });
// });
// }).catch(err => console.log('Failed ', err));
// } else {
// console.log(req.body);
// }
// });
app.post('/login', (req, res) => {
if (req.body.Email && req.body.Password) {
User.findOne({ Email: req.body.Email }, (err, user) => {
if (err) return console.log(err);
console.log(user);
return user;
}).then((res) => {
// res.password returns the jwt string successfully
jwt.verify(res.Password, jwtOptions.secretOrKey, (err, decoded) => {
err ? console.log(err) :
req.login(decoded, (err) => {
// if (err) { return next(err); };
if (err) {
console.log(err) // always returns the error posted above
} else {
console.log(decoded)
}
});
});
}).catch(err => console.log('Failed ', err));
} else {
console.log(req.body);
}
});
app.listen(9000,() => {
console.log(`Listening on port 9000`);
});
사용자 정의 추출기는 시도는 @OrthoHomeDefense에 의해 포스트를 바탕으로
const customExtractor = req => {
User.findOne({ Email: req.body.Email }, '_id', (err, user) => {
const token = jwt.sign(
{ id: user },
'secretKey',
{ expiresIn: '48h' }
);
return token;
});
내가 만든 다음 성공적으로 클라이언트에 JWT 토큰을 보내
app.post("/login", (req, res) => {
if (req.body.Email && req.body.Password) {
User.findOne({ Email: req.body.Email }, (err, user) => {
if(user.Password === req.body.Password) {
console.log()
var token = jwt.sign(JSON.stringify(user), jwtOptions.secretOrKey);
res.json({token: token});
} else {
console.log(err);
res.status(401).json({message:"Passwords did not match."});
}
});
} else {
res.status(401).json({message:"Please provide an email and a password."});
}
});
본 적이 있습니까? https://jonathanmh.com/express-passport-json-web-token-jwt-authentication-beginners/ –
@OrthoHomeDefense \t 나는 그것을 읽었으며, 내가 Passport JWT 전략 섹션에 갇혀있는 것 같습니다. 401을받는 중입니다. 이해가 안되는 부분은 추출자 자체입니다. 규정 된 추출기 위치에서 jwt를받는 이유는 무엇입니까?암호가 한 번 해시 된 문자열이 아닌가? 이 경우 추출기 위치가 아닌 데이터베이스에서 jwt를 수신하지 못합니까? 내가 틀린 것이 틀림 없다고 말하는 것을 안다. 그러나 나는 어떻게 알아낼 수없는 것일까? – Brandon
클라이언트 측에서 요청을 호출하면 어떻게 보이는지 보여 줄 수 있습니까? –