2017-12-15 12 views
0

node.js에서 jwt 및 passport를 사용하여 성공적으로 인증하려고합니다. JwtStrategy에 passport.use를 사용하고 있습니다.node.js 여권 및 ExtraxtJwt 작동을 얻으려고

나는 http://localhost:3000/users/profile에 우체부와 POST 요청을 보낼 때

// Profile 
router.get('/profile', passport.authenticate('jwt', { session: false }), (req, res, next) => { 
    res.json({ user: req.user }); 
}); 

내가 지금까지 너무 좋아 Unauthorized을 얻을, 그것은 토큰없이 저를 unauthorize 것을 테스트하기 위해 내 경로 중 하나에서 인증 켜져 설정 ...

올바른 사용자 이름과 암호로 localhost : 3000/users/authenticate에서 우편 발송자를 통해 로그인 할 때 토큰을 다시받습니다. 다음과 같습니다 : 나는 정확히 같은 그 토큰을 잡기 위해 노력했다

{ 
"success":true, 
"token":"JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjVhMzNiMzE1NDFlYWU1MDk2MDRhNTE0ZiIsIm5hbWUiOiJyYXMiLCJlbWFpbCI6InJhc0BwLmQiLCJ1c2VybmFtZSI6InJwdWxzIiwicGFzc3dvcmQiOiIkMmEkMTAkTFR5eS50TmdualB2a0htWXNuUkV0TzRwWEVEL0gycDJCYWRDRlVXMUtWaXI5TnltSUtnVUciLCJfX3YiOjB9LCJpYXQiOjE1MTMzNDI1MjksImV4cCI6MTUxMzk0NzMyOX0.amCkcFWtPwf_HYUxpXOPvcRShksH9fw7O4vVOsBm4yA", 
"user":{ 
"id":"5a33b31541eae509604a514f", 
"name":"n", 
"username":"testUser", 
"email":"[email protected]"} 
} 

:

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjVhMzNiMzE1NDFlYWU1MDk2MDRhNTE0ZiIsIm5hbWUiOiJyYXMiLCJlbWFpbCI6InJhc0BwLmQiLCJ1c2VybmFtZSI6InJwdWxzIiwicGFzc3dvcmQiOiIkMmEkMTAkTFR5eS50TmdualB2a0htWXNuUkV0TzRwWEVEL0gycDJCYWRDRlVXMUtWaXI5TnltSUtnVUciLCJfX3YiOjB9LCJpYXQiOjE1MTMzNDI1MjksImV4cCI6MTUxMzk0NzMyOX0.amCkcFWtPwf_HYUxpXOPvcRShksH9fw7O4vVOsBm4yA 

을하고 Authorization 헤더로 추가,하지만 난 여전히 Unauthorized를 얻을 ..... 정말입니다 절대 오류 메시지가 없기 때문에 진행하기가 어렵습니다. 이 라인은 문제

const JwtStrategy = require('passport-jwt').Strategy; 
const ExtractJwt = require('passport-jwt').ExtractJwt; 
const User = require('../models/user'); 
const config = require('../config/database'); 

module.exports = function (passport) { 
    let opts = {}; 
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); 
    opts.secretOrKey = config.secret; 
    passport.use(new JwtStrategy(opts, (jwt_payload, done) => { 
     User.getUserById(jwt_payload._id, (err, user) => { 
      if (err) { 
       return done(err, false); 
       console.log(err); 
      } 

      if (user) { 
       return done(null, user); 
      } else { 
       return done(null, false); 
      } 
     }); 
    })); 
} 

입니다 : 여기

내 여권 코드? opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); 나는 또한 ExtractJwt.fromAuthHeaderWithScheme ("jwt") 대신 시도했지만 동일한 결과가 있습니다. (내가 올바른 사용자/패스와 로그인에 다시 토큰을 얻을 수 있기 때문에 내가 웍을 추측) 여기

내 인증합니다 코드입니다

// Authenticate 
router.post('/authenticate', (req, res, next) => { 
    const username = req.body.username; 
    const password = req.body.password; 

    User.getUserByUsername(username, (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) { 
       const token = jwt.sign({data: user}, config.secret, { 
        expiresIn: 604800 // 1 week 
       }); 

       res.json({ 
        success: true, 
        token: 'JWT ' + token, 
        user: { 
         id: user._id, 
         name: user.name, 
         username: user.username, 
         email: user.email 
        } 
       }); 
      } else { 
       return res.json({ success: false, msg: 'Wrong password' }); 
      } 
     }); 
    }); 
}); 

또한 내가 포스트 사람에 뭔가를 잘못하고 있어요 일 수 있었다 GET 요청을 할 때? enter image description here

답변

0

은 정말이 일을하고 싶어하지만, 여권과 여권 JWT의 새 버전이 빈약 한 문서가 보인다 및 디버깅에 매우 어렵습니다 ....

나는 두 모듈을 제거하고 설치 express-jwt 대신 기본적으로 모든 경로에 대한 토큰이 필요합니다. 로그인을 허용하고 라우트를 등록하려면 한 줄의 설정 만 사용하면됩니다.

const expressJWT = require('express-jwt') 
. 
. 
. 
app.use(expressJWT({secret: secret}).unless({path : ['/api/authenticate', '/api/register']})) 

나는 그것이 설치 및 사용이 매우 쉽다는 것을 의미에서 경로를 확보하기위한이 솔루션을 추천 할 수 있습니다. 나는 여권과 비교하여 얼마나 안전한지에 대해서는 알지 못합니다.