Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Databases
Code

Sequelize ve MySQL ile Passport Kullanımı

by
Difficulty:IntermediateLength:LongLanguages:

Turkish (Türkçe) translation by Nevres Emre Alsancak (you can also view the original English article)

Sequelize söz-tabanlı Node.js ORM(nesne-ilişkisel eşleme)'idir. PostgreSQL, MySQL, MariaDB, SQLite ve MSSQL ile kullanılabilir. Bu yazıda bir web uygulaması kullanıcıları için kimlik doğrulama sistemi yapacağız. Kullanıcı kaydı ve oturum açma sistemi için Sequelize ve MySQL ile birlikte Node için popüler kimlik doğrulama aracı olan Passport'u kullanacağız.

Başlangıç

Aşağıdakilerin makinenizde kurulu olduğundan emin olun:

  • Node
  • MySQL

Bu derste Node.js'le Express'i beraber kullanacağız, bu yüzden devam edip ihtiyacımız olanları yükleyelim.

1. Adım: Bir package.json dosyası oluşturun

Uygulamanız için bir klasör oluşturun. Bu klasörün içindeyken terminal veya komut isteminizden aşağıdaki komutu çalıştırın:

Bu npm Destek Dosyalar Yöneticisini(Dependency Manager) başlatır. Bizden, hızla geçeceğimiz bir dizi bilgi isteyecektir.

  • 'name' için uygulamanızın adını boşluk bırakmadan yazın ve  Enter tuşuna basın.
  • 'version' için Enter'a basın.
  • 'description' için açıklama olarak "Passport'u Sequelize ve MySQL ile Kullanma" yazıp Enter'a basın. Bunu boşta bırakabilirsiniz.
  • 'entry point (index.js)' için server.js yazın ve Enter'a basın.
  • 'test command' için Enter'a basın.
  • 'git repository' için uygulamanızın bulunduğu bir git deposu varsa onu girebilirsiniz veya Enter'a basarak boş bırakabilirsiniz.
  • 'Keywords' için Enter'a basın.
  • 'author' için isterseniz adınızı yazın ve Enter'a basın.
  • 'licence' için Enter'a basın.
  • '(Is this okay)' package.json dosyasının nasıl göründüğünü gösterecektir. "Yes" yazın ve Enter'a basın.

2. Adım : Destek Dosyalarını Kurma

Bu ders için eklememiz gereken başlıca destek dosyaları şunlardır:

  • Express
  • Sequelize
  • MySQL
  • Passport
  • Passport Local Strategy
  • Body Parser
  • Express Session
  • Bcrypt Nodejs
  • Görünüşler için Express Handlebars 

Bunları yüklemek için aşağıdakileri bir bir terminal veya komut istemcinizden girin.

Bu proje için eğer Git kullanıyorsanız:

Proje klasörünüzde .gitignore dosyası yaratın.

Aşağıdaki satırı .gitignore dosyasına ekleyin.

node_modules

3. Adım: Uygulamanın Düzenlenmesi

Şimdi bir server(sunucu) dosyası oluşturacağız. Aşağıdakini yazdığınızda bu ana calıştırılacak dosya olacaktır:

Bu uygulama çalıştırır. Ayrıca, node server.js yazarak da uygulamayı çalıştırabilirsiniz.

O zaman proje klasörümüzde yeni bir dosya yaratıp bu dosyaya server.js adını verelim.

Aşağıdakileri server.js dosyasına yapıştıralım:

İlk satır, express modülünü  express adlı değişkene atar. Ardından express'i başlatıp app değişkeni olarak adlandırırız.

Ardından uygulamayı 5000 numaralı port üzerinde dinlemeye alırız. Bilgisayarınızda kullanımda olmayan herhangi bir portu kullanabilirsiniz.

Sonra, "/" için bir GET isteği yapıldığında, "Welcome to Passport with Sequelize" ile cevap verebilmek için app.get() ekspres yönlendirme fonksiyonunu(express routing function) çağırırız.

Bilgisayarınızda test etmek için bunu proje klasörünüzün içinden çalıştırın:

http://localhost:5000'ı ziyaret ettiğinizde "Welcome to Passport with Sequelize" metnini görüyorsanız, tebrikler! Aksi takdirde, herşeyi yukarıda yazdığımız gibi yaptığınızdan emin olun.

Şimdi, passport, express-session ve body-parser gibi ihtiyacımız onlan modülleri programımıza ekleyeceğiz.

var app = express()'in ardından aşağıdaki satırları ekleyeceğiz:

İlk iki satırla kimlik doğrulamayı yapmak için ihtiyaç duyacağımız passport ve express-session modüllerini ekliyoruz.

Sonra, body-parser modülünü ekliyoruz. Bu modül,  gelen bir isteğin tüm içeriğini ayrıştırarak çalışılması daha kolay bir biçime getirir. Bu durumda JSON formatını kullanacağız.

Uygulamamızın body-parser'ı kullanmasını sağlamak için bu satırları, import satırlarının altına ekleriz:

Sonra passport ve express oturumu(session) ile passport oturumunu başlatır ve ikisini de aracı olarak ekleriz. Bunu, bodyParser modülünü eklediğimiz satırların ardından biraz boşluk bırakarak  aşağıdaki satırları ekleyerek yaparız.

Şimdi asıl kimlik doğrulama(authentication) üzerinde çalışmaya başlayacağız.

Bunu dört adımda yapacağız:

  • Sequelize'ın MySQL'le ayarlanması.
  • Kullanıcı modelinin(user model) oluşturulması.
  • Görünümlerin(views) ayarlanması.
  • Bir passport stratejisinin yazılması.

1. Sequelize'ın MySQL'le ayarlanması.

Öncelikle, MySQL'de bir Veritabanı oluşturuyoruz. Tercih ettiğiniz bir isim verin. Bu ders için, MySQL'de sequelize_passport adlı bir veritabanı oluşturalım.

Ardından, DB ayrıntıları için konfigürasyonu ayarlarız.

İlk olarak, ortam değişkenlerini idare etmek için dot-env modülünü ekleyelim.

Bunu proje klasörünüzün kökünde çalıştırın:

Ardından, ana sunucu dosyası olan server.js dosyasının içine diğer eklemelerin hemen altına ekleriz.

Sonra, proje klasörümüzde bir dosya oluşturup buna .env ismini veririz.

Git kullanmıyorsanız bir sonraki adımı yapmanıza gerek yoktur.

.env dosyasını .gitignore dosyanıza ekleyeceğiz.

.gitignore dosyanız aşağıdaki gibi olmalıdır:

Bundan sonra şu satırı ekleyerek ortamımızı .env dosyasına ekliyoruz:

NODE_ENV='development'

Ardından, Sequelize tarafından farklı ortamları yönetmek için kullanılacak bir config.json dosyası oluştururuz.

İlk iş, proje klasörümüzde config adında bir klasör oluşturmaktır. Bu klasörün içinde bir config.json dosyası oluşturuyoruz. Bir depoya yüklüyorsanız, bu dosya yok sayılmalıdır. Bunu yapmak için  .gitignore dosyasına aşağıdaki kodu ekleyin:

config/config.json

Sonra aşağıdaki kodu config.json dosyasına yapıştırıyoruz.

Yukarıdaki development bölümündeki değerleri, kendi veritabanı ayarlarınızla değiştirmeyi unutmayın.

Daha sonra, npm ile sequelize kuruyoruz. Bunu yapmak için, proje klasörünün kökünde aşağıdaki komutu çalıştırın:

Şimdi models(modeller) klasörünü oluşturmanın zamanı geldi.

Öncelikle proje klasörünüzde app isminde bir klasör oluşturuyoruz.

app klasörü içinde models adlı yeni bir klasör oluşturur ve ardından models klasörünün içinde index.js adlı yeni bir dosya oluştururuz.

index.js dosyasına aşağıdaki kodu yapıştırıyoruz.

Bu dosya, models klasörüne yerleştirdiğimiz tüm modelleri içe ve dışa aktarmak için kullanılır.

Her şeyin çalıştığından emin olmak için, bunu server.js dosyasına ekleriz.

Burada, modelleri içe aktarıyoruz ve Sequelize sync(senkronizasyon) fonksiyonu çağırıyoruz.

Her şeyin çalışıp çalışmadığını görmek için bunu çalıştırın:

"Site is live Nice! Database looks fine" mesajını alırsanız, Sequelize'ı başarıyla kurdunuz demektir.

Yoksa, lütfen yukarıdaki adımları dikkatli bir şekilde uyguladığınızdan emin olun ve sorunu yardım ile ayıklamaya çalışın.

2. Kullanıcı Modelinin Oluşturulması

Sonraki yapacağımız şey temelde kullanıcı tablosu olan kullanıcı modelini oluşturmaktır. Bu, temel kullanıcı bilgilerini içerecektir.

models klasörümüzde bir dosya oluşturur ve user.js ismini veririz. Bu dosyanın tam yolu app/models/user.js olmalıdır.

user.js dosyasını açın ve şu kodu ekleyin:

Şimdi çalıştırın:

Tanıdık "Site is live. Nice! Database looks fine". mesajı ile karşılaşmanız gerekiyor. Bu, Sequelize modellerimizin başarıyla senkronize edildiği anlamına gelir ve veritabanınızı kontrol ederseniz, belirtilen sütunların bulunduğu bir users tablosu göreceksiniz.

3: Görünümlerin Ayarlanması

Önce, kayıt için bir görünüm oluşturup gerekli bağlantıları yapalım.

İlk yapmamız gereken bu derste görünümler için kullanacağımız express handlebars modülünü eklemektir.

Bu satırı ana başlangıç dosyası olan server.js dosyasına ekleyin.

var exphbs = require('express-handlebars')

Bu noktada içe aktarma bloğunuz şöyle görünmelidir.

Sonra server.js dosyasına aşağıdaki satırları ekleriz.

Şimdi app klasörümüzde views(görünümler), controllers(denetleyiciler) ve routes(yollar) adlı üç klasör oluştururuz.

views klasöründe, signup.hbs adlı bir dosya oluşturur ve içine aşağıdaki kodu yapıştırırız.

Ardından controllers klasörümüzde yeni bir dosya oluşturur ve authcontroller.js adını veririz.

Bu dosyada, birazdan oluşturacağımız kayıt yolu için aşağıdaki denetleyiciyi yapıştırıyoruz.

Şimdi, kayıt için bir yol oluşturacağız. Routes klasöründe auth.js adında yeni bir dosya oluşturuyoruz ve daha sonra bu dosyada auth denetleyicisini içe aktarıp(import) kayıt yolunu tanımlıyoruz.

Şimdi, bu yolu server.js dosyamıza aktaracağız ve uygulamayı bir argüman olarak geçireceğiz.

Server'da, modellerin içe aktarılmasından sonra şu satırları ekleyin:

Bunu çalıştırın:

Şimdi, http://localhost:5000/signup adresine gidin, kayıt formunu göreceksiniz.

Şimdi oturum açma formu için olan adımları tekrar edelim. Daha önce olduğu gibi, views klasörümüzde signin.hbs adlı bir dosya oluşturur ve aşağıdaki HTML kodunu yapıştırırız:

Sonra, app/controllers/authcontroller.js dosyasında oturum açmak için bir denetleyici ekleyin.

Sonra app/routes/auth.js dosyasında aşağıdaki şekilde oturum açmak için bir yol ekleriz:

app.get('/signin', authController.signin);

Şimdi bunu çalıştırdığınızda:

ve http://localhost:5000/signin/ adresine gittiğinizde, oturum açma formunu görmelisiniz.

Son ve önemli adımımız, passport stratejilerini(passport strategies) yazmamızdır.

4. Passport Stratejisi Yazma

app/config içinde passport adlı yeni bir klasör oluştururuz.

Daha sonra yeni app/config/passport klasörümüzde yeni bir dosya oluşturup ve adını passport.js olarak veririz. Bu dosya passport stratejilerimizi içerecek.

passport.js'de kullanıcı modelini ve passport'u kullanacağız.

Öncelikle, şifreleri korumak için ihtiyaç duyduğumuz bcrypt'i içe aktarıyoruz.

var bCrypt = require('bcrypt-nodejs');

Sonra aşağıdaki gibi bir module.exports bloğu ekleriz:

Bu bloğun içinde, yerel passport stratejisini ve argüman olarak geçilecek kullanıcı modelini kullanıma hazır hale getiririz. Bunu şöyle yapacağız:

Sonra, özel stratejimizi LocalStrategy örneğiyle(instance) şu şekilde tanımlıyoruz:

Şimdi usernameField ve passwordField(passport variables) talep (req) değişkenleri olarak ayarlardır. 

Son PassReqToCallback değişkeni, tüm talebi(entire request) geri aramaya(pass to the callback) geçirmemizi sağlar; bu da kayıt için özellikle yararlıdır.

Son virgülden sonra, bu geri arama(callback) fonksiyonunu eklerir.

Bu fonksiyonda, bir kullanıcının ayrıntılarını kaydetmeyi ele alacağız.

Öncelikle, geri arama fonksiyonunda hashlanmış şifre üretme fonksiyonumuzu ekliyoruz.

Sonra, daha önce kullanıma hazır hale getirdiğimiz User adlı Sequelize kullanıcı modelini kullanarak, kullanıcının mevcut olup olmadığını kontrol ederiz, yoksa ekleriz.

User.create() veritabanına yeni girdiler eklemek için kullandığımız bir Sequelize yöntemidir. Veri nesnesindeki değerlerin, kayıt formumuzdaki girdiyi içeren req.body nesnesinden alındığına dikkat edin.

Passport.js şöyle gözükmelidir:

Şimdi stratejiyi server.js dosyasına aktaracağız.

Bunu yapmak için, bu satırları server.js dosyasındaki yolların(routes) altına ekleyin.

Şu anda server.js şunun gibi gözükmelidir:

Şimdi bu stratejiyi /signup yolumuza uygulayacağız.

Bunu şu şekilde yaparız:

İlk olarak, app/routes/auth.js'a giderek, kaydolmaya göndermek(posting to signup) için bir rota ekleriz.

Passport'a ihtiyaç duyduğumuz için, onu bu metoda geçirmeliyiz. Bu dosyada passport'u içe aktarabilir(import) veya server.js dosyasından geçirebiliriz(pass). İkinci yolu uygulayalım.

app/routes/auth.js'de dışarı aktarılan fonksiyonu passport'u parametre olarak alacak şekilde değiştirin. Değişiklikten sonra app/routes/auth.js'deki kod aşağıdaki gibi olmalıdır.

Daha sonra server.js dosyasında, içe aktarılan yolları(routes import) passport'u bir argüman alacak şekilde değiştiririz.

var authRoute = require('./app/routes/auth.js')(app,passport);

Şimdi, kayıt URL'si olan http://localhost:5000/signup/ adresine gidin ve kaydolmayı deneyin.

Kaydolmayı denediğinizde, "Failed to serialize user into session(Kullanıcıyı oturum için ayıklama başarısız oldu)" hata mesajı ile karşılaşacaksınız. Bunun nedeni, passport'un oturuma(session) bir kullanıcı kimliği kaydetmek istemesi ve kullanıcı detaylarına erişmek istediğinde bunu kullanması.

Bu problemi çözmek için app/config/passport/passport.js dosyamızda pasaportun serialize ve deserialize fonksiyonlarını oluşturacağız.

Önce serialize fonksiyonunu ekliyoruz. Bu fonksiyon, user id(kullanıcı numarası)'yi oturuma kaydetmemizi sağlıyacak.

Bunu yapmak için yerel stratejinin kullanıma hazır hale getirildiği(initialize) satırların altına aşağıdaki satırları ekleriz.

Ardından deserialize fonksiyonunu oluşturuyoruz. Hemen serialize fonksiyonun altına ekleyin.

Yukarıdaki deserialize(ayıklama) fonksiyonunda, kullanıcıyı elde etmek için Sequelize'in findById sözünü kullanırız ve eğer başarılı olursa, bir  Sequelize modeli örneğine(instance) sahip olunur. Bu örnekteki User nesnesini(User object) elde etmek için, Sequelize getter(alıcı) fonksiyonunu şu şekilde kullanıyoruz: user.get().

Şimdi tekrar çalıştırın:

Ve kaydolmaya çalışın. Eğer "Cannot GET/dashboard " ile karşılaşıyorsanız süper! Bu, kimlik doğrulamanızın başarılı olduğu anlamına geliyor. routes/auth.js dosyasındaki passport.authenticate yönteminde /dashboard'a yeniden yönlendirildiğimizi hatırlayın.

Şimdi devam edip o yolu ekleyelim. Ardından, bir kullanıcın sadece oturumu açıksa sayfaya erişilebildiğinden emin olmak için bir ara katman ekleyelim.

app/views klasörümüzde, dashboard.hbs adında yeni bir dosya oluşturur ve aşağıdaki HTML kodunu buna ekleriz.

Bu satırı routes/auth.js dosyasında module.exports bloğuna ekliyoruz:

app.get('/dashboard',authController.dashboard);

Sonra, app/controllers/authController.js dosyasına gidip panel denetleyicisini(controller) ekleriz.

AuthController.js dosyası aşağıdaki şekilde olmalıdır:

Şimdi, uygulamayı tekrar çalıştırın ve daha önce kullandığınızdan farklı bir e-posta adresi ile kaydolmayı deneyin. Uygun bir şekilde /dashboard yoluna yönlendirileceksiniz.

Fakat /dashboard korunan bir yol değildir, yani bir kullanıcı oturum açmamış olsa bile ulaşılabilmekte. Bunu istemiyoruz, bu nedenle, kullanıcı oturumunu kapatmak için bir /logout yolu ekleyeceğiz ve sonra bu yolu koruyup test edeceğiz.

Hadi bunu yapalım:

routes/auth.js'de şu satırı ekleriz:

app.get('/logout',authController.logout);

Sonra app/controllers/authController.js dosyasına denetleyiciyi(controller) ekleriz.

Şimdi uygulamayı tekrar çalıştırın ve farklı bir e-posta adresi ile kaydolun.

Bundan sonra, kullanıcı otorumunu kapatmak için http:// localhost:5000/logout adresine gidin. Sonra http://localhost: 5000/dashboard adresine gidin.

Hala erişilebilir olduğunu fark edeceksiniz. Bu yolu korumak için özel bir ara katman ekleyelim.

Bunu yapmak için app/routes/auth.js dosyasını açıp bu işlevi diğer tüm kod satırlarının altında module.exports bloğuna ekleriz.

Sonra, panel(dashboard) yol denetleyicisini aşağıdaki gibi değiştirelim:

app.get('/dashboard',isLoggedIn, authController.dashboard);

Şimdi, uygulamayı tekrar çalıştırıp panel sayfasını ziyaret etmeyi denediğinizde ve giriş yapmadıysanız, oturum açma sayfasına yönlendirileceksiniz.

Vay! Son bölümü yapmamızın zamanı geldi: oturum açma.

Önce, app/config/passport/passport.js dosyasında oturum açmak(sign-in) için yeni bir yerel strateji ekleyeceğiz.

Bu stratejide, isValidPassword fonsiyonu, parolamızı bcrypt ile saklamış olduğumuzdan, bCrypt karşılaştırma yöntemiyle karşılaştırır.

Bilgiler doğruysa, kullanıcımız oturum açabilecektir.

Şimdi, routes/auth.js dosyasına gidin ve /signin'e post edebilmek için yolu ekleyin.

İşiniz bittiğinde routes/auth.js aşağıdaki gibi görünmelidir.

Şimdi uygulamayı çalıştırın ve oturum açmaya çalışın. Kayıt sırasında kullandığınız tüm ayrıntılarla oturum açabilmelisiniz ve sonra http://localhost:5000/dashboard/ adresine yönlendirileceksiniz.

Bu dersin sonuna kadar gelebildiyseniz tebrikler! Sequelize ve Passport'u MySQL veritabanı ile başarılı bir şekilde kullandık.

Bu dersle alakalı bütün kodu GitHub'da bulabilirsiniz.

Sonuç

Bu, Sequelize ve MySQL kullananların kimlik doğrulamasında Passport kullanımıyla ilgili dersimizi tamamlıyor. Sequelize, Node kullanırken MySQL ile çalışmak için gerçekten kullanışlı bir ORM'dir. Şahsen ben bunu çok faydalı buldum ve bir sonraki Node-MySQL uygulamanızda kullanmayı kesinlikle düşünmelisiniz.

Referanslar

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.