D ile günlük

Elektronik posta ile kullanıcı doğrulamak

Bu makalede sayfa desenleri ile elektronik posta gönderimini ve nasıl kullanıcı doğrulama yapabileceğimizi öğreneceğiz.

Sayfa desenleri ile elektronik posta göndermek

Önceki bölümlerde elektronik posta göndermeyi, yeni kullanıcı kaydı yapmaya öğrenmiştik.

Ancak göz önünde bulundurmamız gereken bir durum var.

Diyelim ki bir kullanıcı kayıt olurken elma@elma.com gibi rastgele bir elektronik posta adresi seçti. Ya da otomatik bir yazılım ("bot") kullanarak birileri sağnak ileti oluşturmak istedi.

Gerçek kullanıcılarla, sağnak ileti oluşturan yazılımları nasıl ayırt edeceğiz.

Sağnak iletileri sınıflandırmak için Bayes algoritması kullanılabilir.

Ancak biz daha basit bir yöntem kullanacağız.

Öncelikle bir elektronik ileti gövdesini sayfa deseni ile nasıl oluşturabileceğimize bakalım.

Kiraz dizininin içinde "views" dizininde yardimcilar isimli bir dizin oluşturuyoruz.

Bu dizinde de eposta.dt isimli bir kütük oluşturuyoruz.

p(style="white-space: pre-line").
  Merhaba, #{isim}
  Öncelikle günlüğümüze üye olduğunuz için teşekkür ederiz.
  Kayıt işleminin neredeyse sonuna geldiniz.
  <a href="https://programlama.tk">Buraya</a> tıklayarak kaydınızı tamamlayabilirsiniz.

Oluşturduğumuz desene baktığımızda, daha önce öğrendiğimiz desenlerden farklı olarak p. şeklinde bir kullanım görüyoruz.

En son kullanılan nokta, diğer bölümlerin düz metin olarak yorumlanacağı anlamına geliyor. Bu nedenle <a ..> </a> şeklinde html etiketlerini kullanıyoruz.

Vibe.d sayfa tasarım desenleri bu kütüphane temel alınarak oluşturulmuş. Farklı sayfa deseni kullanımları için bu sayfaya bakmak isteyebilirsiniz.

import vibe.d;

void anaSayfayıGöster(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    string isim = "Avni";
    render!("yardimcilar/eposta.dt", isim)(yanıt);
}

void main()
{
    auto yolAtayıcı = new URLRouter;
    yolAtayıcı.get("/", &anaSayfayıGöster);

    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8080;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, yolAtayıcı);

    logInfo("Lütfen tarayıcınızda http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Uygulamanın kaynak koduna bakarsak, daha önce öğrendiğimiz bilgilerden çok fazla değişiklik yok.

Sadece bir değişkenin nasıl bir sayfa desenine gönderildiğini görebilirsiniz. Burada isim adındaki değişkeni sayfa desenine gönderiyoruz.

Sunucu uygulamasını çalıştırdığımızda, oluşturduğumuz e posta deseninin nasıl görüntülendiğini görebilirsiniz.

Vibe.d ile elektronik posta deseni oluşturmak

Doğrulama kodu oluşturma

Doğrulama kodunu oluşturmak için daha önce yazdığımız teklianahtar.d kütüğünden yararlanabiliriz.

Tekli anahtarı oluşturmak için de zaten her kullanıcı için oluşturduğumuz çeşni değerini ve kullanıcının elektronik posta adresini kullanabiliriz.

import vibe.d;
import anahtar.teklianahtar;

void doğrulamaKoduOluştur(string eposta, string çeşni)
{
    auto doğrulamaKodu = tekliAnahtarÜret(eposta, çeşni);
    import std.digest : toHexString;
    logInfo("Doğrulama kodu %s", doğrulamaKodu.toHexString);
}

void anaSayfayıGöster(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    string no = "1";
    string isim = "Avni";
    string ePosta = "avni@avni.com";
    auto çeşni = çeşniÜret();
    doğrulamaKoduOluştur(ePosta, çeşni);
    render!("yardimcilar/eposta.dt", isim)(yanıt);
}

void main()
{
    auto yolAtayıcı = new URLRouter;
    yolAtayıcı.get("/", &anaSayfayıGöster);

    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8000;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, yolAtayıcı);

    logInfo("Lütfen tarayıcınızda http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Burada çeşni üretmek için teklianahtar içinde tanımlı çeşniÜret() isimli işlevden yararlandık.

Bu durumda uygulamayı derleyip çalıştırırsanız, komut satırında oluşturulan doğrulama kodunu görebilirsiniz.

Doğrulama kodunu sayfa desenine gönderme

Uygulamamızın kaynak kodunu değiştirelim.

import vibe.d;
import anahtar.teklianahtar;

void anaSayfayıGöster(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    import std.digest : toHexString;
    string no = "1";
    string isim = "Avni";
    string ePosta = "avni@avni.com";
    auto çeşni = çeşniÜret();
    string kod = tekliAnahtarÜret(ePosta, çeşni).toHexString();
    render!("yardimcilar/eposta.dt", isim, no, ePosta, kod)(yanıt);
}

void main()
{
    auto yolAtayıcı = new URLRouter;
    yolAtayıcı.get("/", &anaSayfayıGöster);

    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8000;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, yolAtayıcı);

    logInfo("Lütfen tarayıcınızda http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Burada izah edilecek çok fazla bir şey yok. Sadece bir doğrulama kodu oluşturduk. Bu değişkenleri de sayfa desenine göndereceğiz.

Elektronik posta oluşturan eposta.dt isimli sayfa desenine bakalım.

p(style="white-space: pre-line").
  Merhaba, #{isim}
  Öncelikle günlüğümüze üye olduğunuz için teşekkür ederiz.
  Kayıt işleminin neredeyse sonuna geldiniz.
  <a href="http://kotla.tk/kullanıcı/doğrula?eposta=#{ePosta}&isim=#{isim}&no=#{no}&kod=#{kod}">Buraya</a> tıklayarak kaydınızı tamamlayabilirsiniz.

Burada dikkat ederseniz bir değişkeni kullanmak için #{değişkenİsmi} şeklinde kullanabiliyoruz. Birden fazla değişkeni ayırmak için & işaretinden faydalanıyoruz.

Doğrulama sayfası oluşturma

Kullanıcıya kayıt sırasında gönderilen elektronik postanın gövdesini oluşturan sayfa desenini tasarladık. Doğrulama kodunu oluşturduk.

Kullanıcı doğrulama için kullandığımız elektronik postadaki bağlantıya tıkladığında, bir doğrulama sayfası oluşturup bu bilgileri almalıyız.

Doğrulama sayfası oluşturmak için yeni bir sayfa deseni oluşturabileceğimiz gibi, bir önceki derste öğrendiğimiz .writeBody işlevini de kullanabiliriz.

import vibe.d;
import anahtar.teklianahtar;

string hizala (string metin)
{
    string içerik = stripLeft(metin.dup,"\n\t");
    return içerik.outdent;
}

void anaSayfayıGöster(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    import std.digest : toHexString;
    string no = "1";
    string isim = "Avni";
    string ePosta = "avni@avni.com";
    auto çeşni = çeşniÜret();
    string kod = tekliAnahtarÜret(ePosta, çeşni).toHexString();
    render!("yardimcilar/eposta.dt", isim, no, ePosta, kod)(yanıt);
}

void kullanıcıDoğrula(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    auto ePosta = istek.query.get("eposta");
    auto no = istek.query.get("no");
    auto doğrulamaKodu = istek.query.get("kod");
    auto isim = istek.query.get("isim");

    auto sayfa = q{
     <html>
     <head>
       <title>Kullanıcı doğrulama sayfası</title>
     </head>
     <body>
       <p>İsim = %s</p>
       <p>Elektronik posta = %s</p>
       <p>Doğrulama kodu = %s</p>
     </body>
     </html>};

    yanıt.writeBody(sayfa.hizala.format(isim, ePosta, doğrulamaKodu), "text/html; charset=UTF-8");
}

void main()
{
    auto yolAtayıcı = new URLRouter;
    yolAtayıcı.get("/", &anaSayfayıGöster);
    yolAtayıcı.get("/kullanıcı/doğrula", &kullanıcıDoğrula);
    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8080;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, yolAtayıcı);

    logInfo("Lütfen tarayıcınızda http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Burada GET yordamıyla gönderilen bilgileri almak için istek.query.get("alınacakBilgi") şeklinde kullanıma dikkatinizi çekmek istiyorum.

Uygulamayı derleyip çalıştırdığımızda ekran çıktısını görebilirsiniz.

vibe.d ve D programlama dili ile elektronik posta doğrulama

Burada doğrulama kodu çok uzun olduğu için bir kısmını kıptım.

Yorumlar

yorum yaz

Yorum yaz

Henüz yorum yok.