2017-12-15 7 views
0

node.jsでjwtとパスポートを使用して正常に認証しようとしています。 私はJwtStrategyでpassport.useを使用しています。node.jsパスポートとExtraxtJwtを取得しようとしています

私は http://localhost:3000/users/profileに郵便配達を持つPOSTリクエストを送信すると、私はこれまでのところ良い Unauthorizedを得る

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

、それはトークンなしで私を無許可にすることをテストするために私のルートの1つで認証をオンに設定している

...

正しいユーザー名とパスワードでlocalhost:3000/users/authenticateにpostmanを使用してログインすると、トークンが返されます。次のようになります。

{ 
"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ではなく、デフォルトではすべてのルートのトークンが必要です。ログインと経路登録を可能にするためには、単に1行の設定を使用するだけでした。

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

このソリューションは、セットアップと使用が非常に簡単であるという意味でルートを保護するために推奨できます。私はパスポートと比較してどれほど安全かについては知識がありません。

関連する問題