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.
Ş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;
- Header
request.headers[“x-access-token”] - Post Body
request.body.token - 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;
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)
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
1 Cevap
[…] Node.js – JWT Token Kullanımı […]