Json Web Token – JWT

Json Web Token OAuth protokolü üzerinden veri alışverişi sırasında kullanılan JSON formatında veri alışverişi sağlayan yapılardır. Web service üzerinden herhangi bir veriye erişmek isteyen kullanıcının yetkilendirilip yetkilendirilmediğini belirleyen kimlik kartı olarak düşünülebilir. Örneğin sinemaya gitmek istiyoruz. Herhangi bir film ve seans seçtik. Ardından filmi izlemek üzere salona gidiyoruz. Sinema yetkilisi bileti kontrol ederek salona erişip erişemeyeceğimize karar veriyor. Jwt’i elimizdeki bilete benzetebiliriz. Genel hatlarıyla böyle. Fazla ayrıntıya girip boğmak istemiyoum.  Merak edenler jwt.io üzerinden inceleyebilirler.

Örnek jwt;

jwt.png

Yukarıda örnek bir jwt görmekteyiz. Peki nedir bu jwt bileşenleri. Nelerden oluşur. Neden aralarda noktalar var.  İlk noktadan önceki kısım (kırmızı kısım) header kısmını oluşturmakta. Token’in hangi algoritma ile hash’lendiği ve tür bilgilerini tutar. İkinci noktadan sonraki kısım (mor kısım) token’imizin içerdiği bilgileri (payload) tutar. Token üzerinden taşınmasını istediğimiz ne varsa bu kısımda taşınır. Son kısım olan mavi kısım ise Verify Signature bilgilerini tutar. Burası ise tüm bilgileri şifreli olarak tutar. Ve token’in network üzerinde yolculuk ederken değiştirilip değiştirilmediğini kontrol etmek amacıyla kullanılır.

Yukarıda verilen token’in decode edilmiş halini aşağıda görebilirsiniz.
2.png

Gelelim kurulum ve kullanımına. Kurulumu
npm install jsonwebtoken komutu ile gerçekleştiriyoruz.

Ardından modülümüzü require ediyoruz.

const jwt = require('jsonwebtoken');

Kullanıma örnek olsun diye authenticate olan user’a response olarak token oluşturup gönderiyorum. Kullanıcı login olduktan sonra “/api” nin altındaki bir yere istek atacağı zaman kullanabilmesi için.

router.post('/login',(req,res)=>{
  const email = req.body.email;
  const password = req.body.password;
    User.findOne({'email' : email},(err,user) =>{
      if(err){
         return res.status(500).send();
      }
      if(!user){
         return res.status(404).send();
      }
      user.comparePassword(password,(err,isMatch) =>{
          if(isMatch && isMatch == true){
             const user_id = user._id;
             const email = user.email;
             const tokenData = {
                email
             };
             const token = jwt.sign(tokenData,superSecret, {algorithm: 'HS512' } , {
                expiresIn : 60*60*24
            });
            return res.status(200).send();
          }else{
             return res.status(401).send();
          }
      });
    });
});

jwt.sign metodunu token oluşturma için kullanıyoruz ve bu metod parametre olarak;

  1. parametre : token’in içereceği data’yı (payload),
  2. belirlediğimiz secret’i
  3.  hangi algoritma ile hash’leneceğini almaktadır.
  4. expiresIn değeri de token’in geçerlilik süresini belirlemektedir.

Bunlar yardımıyla yukarıdaki gibi kullanıcının kayıtlı olup olmadığının kontrolü yapıldıktan sonra payload içerisine user_id, user_role ve email aktarılıyor. Ardından response olarak token’imizi gönderiyoruz.

Arkadaşlar ben örnek olarak “/api”nin altındaki tüm endpointlerin token kontrolü için middleware yazdım. Böylelikle aşağıdaki kod yardımı ile “/api” nin altındaki tüm adreslere gelen istekler için “authorization” key’i ile gönderilen token’in validate olup olmadığını kontrol ediyorum.

router.use('/api',(req,res,next) =>{
   const token = req.body.token || req.query.token || req.headers['authorization'];
   if(token){
      jwt.verify(token,superSecret,{algorithm: 'HS512' } ,(err,decoded)=>{
         if(err){
            return res.send({success : false, message : 'Failed to authenticate token'});
         }else{
            req.decoded = decoded;
            next();
         }
      });
   }else{
      return res.status(403).send({success : false,message : 'No token provided'});
   }
});

Herkese iyi çalışmalar…

Yorum bırakın