Node.js – JWT İle Token Oluşturma

Merhaba,

API servisleri, doğal yapıları gereği dışarıdan erişebilen herkese işlevine uygun sonuçlar döndürebilen mekanizmalardır. Tabi çalışma sürecinde API servislerinin kullandığı altyapılar veyahut veritabanları kritik bilgiler arz ediyorsa bu API’lara herkesin erişmesini istemeyiz. Dolayısıyla belli başlı validasyonlar geliştirir ve uzaktan doğrulama ile oturum bilgisi elde edebilen kullanıcıların API’lara erişebilme hakkını veririz. Geliştirilen bu doğrulama yöntemlerinden biri olan JWT, API yapılarında JSON Web Token ile kullanıcı adı ve şifre bilgileriyle yapılan doğrulama neticesinde elde edilen token ile uzaktaki kullanıcının API’a erişebilme yetkisini vermektedir.

Bu içeriğimizde Node.js’de JWT ile Token oluşturmayı inceleyeceğiz ve Node.js’de bu işlemler için geliştirilmiş node-jsonwebtoken modülünü kullanacağız. Makalemizde konuyu daha anlaşılır kılabilmek için örnek bir senaryo üzerinden seyredeceğiz ve kullanıcı tarafından alınan kullanıcı adı ve şifre bilgilerini MongoDB veritabanında bulunan “users” collectionında doğrulama neticesinde token oluşumunu gerçekleştireceğiz.

Node.js - JWT İle Token Oluşturma

Users Collection’ı

Kurulum

JsonWebToken modülünü kurup, projeye entegrasyonunu sağlamak için aşağıdaki komutu çalıştırmanız yeterlidir.

npm install jsonwebtoken --save

Alt Yapının Oluşturulması

Kullanıcıdan alınacak bilgileri elde edebilmek için Body-Parser ve MongoDB veritabanı işlemlerini gerçekleştirebilmek için Mongoose modüllerini install ediyoruz ve referans verilen adreslerde olduğu gibi gerekli temel ayarları yapıyoruz. Dolayısıyla ana modülümüzü aşağıdaki gibi inşa ediyoruz.

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

require("./db/db")();

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

app.use("/user", require("./routers/userRouter"));
app.listen(5000, () => console.log("Yayın başladı..."));

Daha token oluşturma yapısına gelmeden önce bu ana modülümüz olan app.js dosyası içerisinde yapılan bazı işlemlerin üzerinde durmamız gerekmektedir. Bunlardan ilki, “api_secret_key” isminde tanımlanan global değişkenimizdir. Dikkat ederseniz eğer ilgili değişkenin değeri “config.js” isimli bir sınıf içerisindeki “api_secret_key” özelliğinden getirilmektedir. Anlam olarak gizli anahtar olan bu değerin nedenini açıklamamız gerekirse eğer hemen JSON Web Token(JWT) Nedir? başlıklı makaleme sizleri davet ediyorum. İlgili makalede token yapısının fiziksel anatomisini incelemiştik ve Verify Signature kısmında tarafımızdan belirlenmiş gizli anahtarın taşınabileceğini belirtmiştik. İşte bu global değişken, token yapısında kullanacağımız bu gizli anahtarı bize getirecektir. Neden global olarak tanımlandı? sorusuna karşılık olarak birden fazla http fonksiyonunda aynı anahtarı kullanabilme ihtimalimizin olmasından dolayı bu şekilde global olarak tanımlanmasını tercih etmiş bulunmaktayım. Tabi bizler örneğimizde tek bir http fonksiyonu üzerinden örneklendirme yapacağız. Lakin sizlere değişken ve lüzumsuz kod tasarrufu açısından bu mantığı hatırlatmak için bu şekilde bir örneklendirme yapmayı uygun gördüm.

module.exports = {
    api_secret_key: "laylaylom galiba sana göre sevmeler"
};

Evet… Gördüğünüz gibi “config.js” modülünün detayıda yukarıdaki gibidir. Siz istediğiniz gizli anahtar değerini belirtebilirsiniz…

İkinci olarak “userRouter” isimli modül içerisinde route çalışmalarımızı gerçekleştirdiğimize dikkatinizi çekerim.

Hadi buyrun başlayalım.

Token Oluşturma

Burada kullanıcıdan alınan kullanıcı adı ve şifre veritabanında doğrulanacak ve bu doğrulama neticesinde token oluşturulacaktır. O yüzden ilgili route çalışmamız ve algoritması aşağıdaki gibi olacaktır.

const router = require("express").Router();
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");

const userModel = require("../models/user");

router.post("/getToken", (request, response, next) => {
    const { userName, password } = request.body;
    userModel.findOne({ userName })
        .then(data => {
            //Girilen userName değerinde bir kayıt varsa burası çalışacaktır.
            bcrypt.compare(password, data.password)
                .then(data => {
                    //Veritabanındaki şifrelenmiş password ile kullanıcıdan alınan password birbirlerini doğruluyorsa eğer data değeri true gelecektir. Aksi taktirde false değeri gelecektir.
                    if (!data)
                        response.send("Kullanıcı adı veya şifre yanlış...");
                    else {
                        //Eğer data parametresi true değerinde geldiyse token oluşturulacaktır.
                        const payLoad = { userName, password };
                        const token = jwt.sign(payLoad, request.app.get("api_secret_key"), { expiresIn: 120/*dk*/ });
                        response.json({
                            status: true,
                            userName,
                            password,
                            token
                        });
                    }
                });
        })
        .catch(error => console.log("Beklenmeyen bir hatayla karşılaşıldı..."));
});

module.exports = router;

Yukarıdaki kod bloğunu incelerseniz eğer aslında tüm mevzu 18 ile 26. satırlar arasında geçmektedir. “JsonWebToken” modülünün “sign” fonksiyonu ilk parametre olarak “Payload”, ikinci parametreye gizli anahtar ve üçüncü parametreye ise token ile ilgili settings objesi almaktadır. Dolayısıyla verilen bu değerler neticesinde her türlü token değeri oluşturulacaktır. Biz burada kullanıcı adı ve şifre doğrulaması neticesinde bu doğrulamaya istinaden bir token oluşturmuş olduk. Maksadımız biraz daha gerçekçi örneklendirmelerle yapının kullanım alanını ve tarzını daha da netleştirmektedir. Ayrıca “expiresIn”, tokenın geçerlilik süresini dakika cinsinden tutan bir özelliktir.
Node.js - JWT İle Token Oluşturma

Gördüğünüz gibi istenilen değerler eşliğinde oluşturulan Payload ile token değerimizi oluşturmuş bulunmaktayız. Artık bu token ile belirtilen yaşam/geçerlilik süresi boyunca API üzerinden tüm işlemleri icra edebiliriz. Tabi bu işlemler içinde sonraki makalelerimizde Node.js ile üretilmiş bir tokenın nasıl kullanıldığına dair kapsamlı bir içerik ile sizleri ağırlayacağım 😉

O halde sonraki makalelerimizde görüşmek üzere diyelim…

İlgilenenlerin faydalanması dileğiyle…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. salih dedi ki:

    Merhaba öncelikle teşekkür ederim güzel eğitim için
    bunu mssql cevirmek zormu cok degişiklik yapmak gereklimidir teşekkür ederim.

  1. 16 Eylül 2018

    […] ö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 […]

Bir cevap yazın

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

*

Copy Protected by Chetan's WP-Copyprotect.