2017-05-16 9 views
0

私はnodejsとpostgreSQLを使ってアンドロイドのアプリケーションを開発していますが、現時点ではログインとレジスタだけがあります。リクエストごとにJwtトークンを確認していますか?

私はログインをして、サーバーが私にトークンを送るとトークンがデバイスSharedPreferenceに保存されますが、私の混乱はすべての要求でこのトークンをデコードする必要がありますか?それはちょうど1回ですか?

最後にthis tutorial、彼はすべてのルートでトークンをデコードしますが、私は例えば登録要求をするときにそれを行う必要はありません。

これを実装する最良の方法は何ですか?ここ

は私のサーバーのコードです:

//****************************************************Begin of login request **********************************/ 
router.post('/login', function (req, res, next) { 
    if (JSON.stringify(req.body) == "{}") { 
     return res.status(400).json({ Error: "Login request body is empty" }); 
    } 
    if (!req.body.username || !req.body.password) { 
     return res.status(400).json({ Error: "Missing fields for login" }); 
    } 

    // search a user to login 
    User.findOne({ where: { username: req.body.username } }) // searching a user with the same username and password sended in req.body 
     .then(function (user) { 
      if (user && user.validPassword(req.body.password)) { 
       //return res.status(200).json({ message: "loged in!" }); // username and password match 


       var payload = { user: user }; 

       // create a token 
       var token = jwt.sign(payload, 'superSecret', { 
        expiresIn: 60 * 60 * 24 
       }); 


       // return the information including token as JSON 
       res.json({ 
        success: true, 
        message: 'Enjoy your token!', 
        token: token 
       }); 

      } 
      else { 
       return res.status(401).json({ message: "Unauthorized" }); // if there is no user with specific fields send 
      } 
     }).catch(function (err) { 
      console.error(err.stack) 
      return res.status(500).json({ message: "server issues when trying to login!" }); // server problems 
     }); 
}); 
//****************************************************End of Login request **********************************/ 



//****************************************************Begin of register request******************************/ 
router.post('/register', function (req, res, next) { 

    if (JSON.stringify(req.body) == "{}") { 
     return res.status(400).json({ Error: "Register request body is empty" }); 
    } 
    if (!req.body.email || !req.body.username || !req.body.password) { 
     return res.status(400).json({ Error: "Missing fields for registration" }); 
    } 

    var password = User.generateHash(req.body.password); 


    User.create({ 
     username: req.body.username, 
     email: req.body.email, 
     password: password 
    }).then(function() { 
     return res.status(200).json({ message: "user created" }); 
    }).catch(function (err) { 
     return res.status(400).send({ message: err.message }); // 
    }).catch(function (err) { 
     return res.status(400).json({ message: "issues trying to connect to database" }); 
    }) 

}); 
//****************************************************End of register request **********************************/ 



module.exports = router; 

答えて

0

あなたはすべてのルートのためにJWTトークンチェックを使用しない場合、あなたはそれらのルートをスキップすることができます。

const url = require('url'); 

apiRoutes.use((req, res, next) => { 
    const path = url.parse(req.url).pathname; 
    console.log(path); 

    //No JWT token check 
    if (/^\/register/.test(path)) { 
    return next(); 
    } 

    return jwtTokenValidate(); 
}); 

function jwtTokenValidate() { 
    // 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.' 
    }); 

    } 
} 
関連する問題