Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Node.js – JWT Token Kullanımı

Merhaba,

Bir önceki Node.js – JWT İle Token Oluşturma başlıklı makalemde Node.js’de token nasıl oluşturulur incelemiştik. Bu içeriğimizde ise oluşturulan bu token ile API’a erişim işlemlerinin nasıl yapılacağını inceleyeceğiz.

Herşeyden önce oluşturulan bir tokenı API’da kullanabilmek için bir Middleware oluşturulması gerektiğini ifade ederek başlayalım. Bu middleware üzerinden herhangi bir get ya da post isteğine karşılık üretilen bir tokenın olup olmadığı denetlenecek ve bu denetleme neticesine göre ilgili rotalar tetiklenecektir.

Token Oluşturma ve Altyapı Kurulumu

İlk olarak aşağıdaki gibi token üreten modülümüzü inşa edelim;

--- tokenRouter.js ---
const router = require("express").Router();
const jwt = require("jsonwebtoken");

router.post("/getToken", (request, response, next) => {
    const { userName, password } = request.body;
    const payLoad = {
        userName,
        password,
        email: "gyildizmail@gmail.com"
    };
    const token = jwt.sign(payLoad, request.app.get("api_secret_key"), { expiresIn: 120 });
    response.json({
        status: true,
        token
    });
});

module.exports = router;

Ardından ana modülümüzü aşağıdaki gibi oluşturalım;

const app = require("express")();
const bodyParser = require("body-parser");

app.set("api_secret_key", require("./config").api_secret_key);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.use("/token", require("./routers/tokenRouter"));

app.listen(5000, () => console.log("Yayın başladı..."));

Burada global olarak tanımlanan “api_secret_key” değişkeninde kullanılan “config” modülünüde aşağıdaki gibi oluşturalım;

module.exports = {
    api_secret_key: "ölüme gidelim dedinde, mazotmu yok dedik."
};

Evet… Bu noktada “http://localhost:5000/token/getToken” adresine aşağıdaki ekran görüntüsünde olduğu gibi post talebi gönderdiğimiz vakit sıkıntısız token değerimiz oluşturulmaktadır.
Node.js - JWT Token Kullanımı

Şimdi oluşturulan bu token değerini API’ye özel erişim işlemleri için kullanmaya sıra geldi.

Üretilmiş Token’ın Kullanımı

API’ye yapılacak taleplerde tokenın üretilip üretilmediğini kontrol edeceğimiz middleware’ı oluşturalım.

--- verify-token.js ---
const jwt = require("jsonwebtoken");

module.exports = (request, response, next) => {
    const token = request.headers["x-access-token"] || request.body.token || request.query.token;
    if (!token)
        response.send("Token bulunmamaktadır.");
    else {
        jwt.verify(token, request.app.get("api_secret_key"), (error, decoded) => {
            if (error)
                response.send("Beklenmeyen bir hatayla karşılaşıldı.");
            else {
                request.decode = decoded;
                next();
            }
        });
    }
};

Yukarıdaki middleware içerisindeki kodları incelerseniz eğer 5. satırda “token” değişkenine birden fazla alandan değer set edilmektedir. Bunun sebebi bizlerin üretilen tokena requestten üç farklı yolla erişebilmemizden kaynaklanmasıdır. Bu yollar;

  1. Header
    request.headers[“x-access-token”]
  2. Post Body
    request.body.token
  3. Get Query
    request.query.token

Dolayısıyla önceden üretilmiş token, request tarafından bu üç farklı yolla erişilebilir olacağından dolayı ilgili ifadede tüm alanlar denetlenmekte ve hangisinde veri varsa ilgili değişken tarafından elde edilmektedir.

Ayrıca kodun devamında “jsonwebtoken” modülünün “verify” fonksiyonu aracılığıyla elde edilen token, secret key ile birlikte denetlenmekte ve 3. parametrede yazılan callback fonksiyonunun “decoded” parametresi aracılığıyla çözümlenen token requestin “decode” özelliğine atanmaktadır ve next fonksiyonu ile talepte bulunulan routea yönlendirme sağlanmaktadır. Bu çözüm neticesinde “decoded” parametresinden aslında token oluşum sürecinde belli başlı verilerimizi temsil eden “Payload” nesnesi elde edilecektir.

Şimdi oluşturduğumuz bu middleware’ı ana modülümüzde “use” metodu ile uygulamaya katmalıyız.

const app = require("express")();
const bodyParser = require("body-parser");


app.set("api_secret_key", require("./config").api_secret_key);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.use("/employee", require("./middleWares/verify-token"));
app.use("/employee", require("./routers/employeeRouter"));
app.use("/token", require("./routers/tokenRouter"));

app.listen(5000, () => console.log("Yayın başladı..."));

Yukarıdaki kod bloğuna dikkat ederseniz eğer yazmış olduğumuz “verify-token” isimli middleware “/employee” değeri altındaki routelar için token kontrol mekanizması sağlayacaktır. Dolayısıyla “employeeRouter” modülümüzüde aşağıdaki gibi inşa edelim;

--- employeeRouter.js ---
const router = require("express").Router();

router.get("/get", (request, response, next) => {
    response.send("...");
});

router.post("/post", (request, response, next) => {
    response.send("...");
});
module.exports = router;

Test Edelim

Evet… Artık tüm çalışmalarımız bitmiş bulunmaktadır. Şimdi Postman uygulamasıyla testlerimizi gerçekleşitirelim;
Node.js - JWT Token Kullanımı
Gördüğünüz gibi direkt olarak “/employee/get” adresine talepte bulunduğumuz zaman token ile ilgili uyarıyla karşılaşmaktayız. Şimdi üç farklı yöntemle tokenımızı gönderelim.(Tabi ilk olarak “http://localhost:5000/token/getToken” adresinden token üretmeyi unutmuyoruz)

  • Header
    Node.js - JWT Token Kullanımı
  • Post Body
    Node.js - JWT Token Kullanımı
  • Get Query
    Node.js - JWT Token Kullanımı

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir