4 글 보임 - 1 에서 4 까지 (총 4 중에서)
-
글쓴이글
-
2023년 2월 23일 13:11 #69716
정중식참가자// auth 미들웨어
const JWTStrategy = require('passport-jwt').Strategy; const ExtractJWT = require('passport-jwt').ExtractJwt;
passport.use( 'jwt', new JWTStrategy( { secretOrKey: process.env.JWT_SECRET_KEY, jwtFromRequest: ExtractJWT.fromUrlQueryParameter('secret_token'), }, async (token, done) => { try { // 콘솔에안찍힘 console.log('토크으으은'); return done(null, token.user); } catch (error) { done(error); } } ) ); // /api/auth/ // user by token router.get( '/', passport.authenticate('jwt', { session: false }), (req, res, next) => { console.log(req); //언디파인 출력 console.log(req.user); // 언디파인 res.json({ message: 'You made it to the secure route', user: req.user, token: req.query.secret_token, }); } );
이렇게해줬습니다. 근데 console.log()를 다찍어봐도 콘솔에안찍히고, 언디파인이뜨네요..
로그인하고 회원가입은 이런식으로 구현해줬습니다..
// 회원가입 router.post( '/register', passport.authenticate('signup', { session: false }), async (req, res, next) => { res.json({ message: '회원가입 완료', user: req.user, }); } );
// 로그인 router.post('/login', async (req, res, next) => { passport.authenticate('login', async (err, user, info) => { try { if (err) { const error = new Error('An error occurred.');
return next(error); }
if (!user) { return res.status(401).json({ errors: [{ msg: '유저를 찾을 수 없습니다.' }], }); }
req.login(user, { session: false }, async (error) => { if (error) return next(error);
const body = { _id: user._id, userId: user.userId }; const token = jwt.sign({ user: body }, process.env.JWT_SECRET_KEY);
return res.json({ token }); }); } catch (error) { return next(error); } })(req, res, next); });
로그인후에, 토큰을 프론트에서 서버로 또 전달해줘야하나요?
server.js 코드는 이렇게작성해놨습니다..
require('dotenv').config(); const express = require('express'); const connectDB = require('./config/db'); const { passport } = require('./middleware/auth'); const path = require('path');
const app = express();
connectDB();
app.use(express.json({ extended: false }));
// Define Routes app.use('/api/auth', require('./routes/api/auth')); app.use('/api/users', require('./routes/api/users')); app.use('/api/posts', require('./routes/api/posts'));
// app.use('/uploads', express.static('uploads')); // app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server started on PORT ${PORT}`));
2023년 2월 23일 13:57 #69721
정중식참가자티쳐, 해결은했습니다. 포스트맨으로 params에 key값에 secret_token 넣고 값에 토큰값넣으니까 잘되네요 아, 코드또한 변경해줬어야했습니다.
// user by token router.get( '/', passport.authenticate('jwt', { session: false }, async (err, user, info) => { res.json({ message: 'You made it to the secure route', user: req.user, token: req.query.secret_token, }); }) );
이렇게요 티쳐, 그런데 passport 로컬은 세션 코드떄문에 req.user에 자동으로 들어갔었는데 jwt는 그런식으로는 못하나요? 생각해보니까 질문 1. jwt는 유저가 토큰값을 보관하고있다가 서버에보내서 서명해서 통과받는방식이라 이렇게하면 jwt를 안사용하는거라고 봐도되는걸까요?
질문 2. 그러면 토큰값을 제가 작성한코드처럼 유저한테 보내고, 유저는 로컬스토리지에 토큰을 저장후 로컬스토리지에서 토큰을꺼내서 서버한테 전달하는식으로하면되나요?
2023년 2월 23일 16:38 #69751
codingapple키 마스터문자를 get post요청때마다 자동으로 보내고 싶으면 쿠키에 저장해둡시다 서버는 유저정보 필요할 때 쿠키 출력해서 jwt -> 문자로 바꿔보면 됩니다
-
글쓴이글
4 글 보임 - 1 에서 4 까지 (총 4 중에서)
- 답변은 로그인 후 가능합니다.