Authentication, yani kimlik dogrulama, daha anlasilir ifade ile bir sayfayi kullanicilara sinirlamak veya tek bir kullanici olan yoneticiye sinirlamak icin genelde birkac yontem izlenir, hangi web altyapisini yaziyor olursaniz olun bununla her calistiginiz projede karsilasabilirsiniz. Kullanicilar icin hazirlanmasi gereken authentication icin yapacak birsey yok, kayit, giris, cikis vs gibi seyleri yazmak zorundasiniz. Fakat yonetici gibi tek kullanici icin sinirlandirilmak istenen sayfalar icin en pratik cozum ve genelde tercih edilen cozum htaccess ile basic auth yapilmasidir, yani statik bir sifre ve belirli bir kullanici adi ile yapilan http authentication. Sunucu konfigurasyonunuza gore (belki cpanel gibi paneller yardimi ile) bir dizini veya bir sayfayi sinirlandirir ve bunun icin hic kod yazmadan halledebilirsiniz.

Ancak her zaman bu imkan elinizde olmayabilir (mesela sadece ftp erisimine sahip oldugunuz ve htaccess desteklemeyen bir hosting konfigurasyonu). Ya da authentication'u bir sekilde kodunuzda saklamak istiyor olabilirsiniz.

PHP'de sayfa header'lari ile tarayicidan authentication bilgisi isteyebiliyoruz. Bunu kullanarak http authentication yaptirabiliriz, bunun avantaji kullanici girisi icin herhangi bir arayuz yazmak zorunda kalmamamizdir. Tabi bir diger avantaji ise bu bilgi giris ekranlarini tarayicilar yonettigi icin sifre hatirlama, belki 1password gibi uygulamalar ile kimlikleri saklama gibi secenekler sunuyor ve kullaniciniz bu seceneklerden faydalanmak istiyor olabilir. Her zaman sayfa icindeki elementlerle bunu saglayamayabilirsiniz.

Son birkac projemde daha duzenli kullandigim bir kodu paylasacagim. Bu kodu tek bir dosyaya (mesela auth.php) yazip bu dosyayi tum uygulamamda include ediyorum en basta. Boylece eger birisi authenticate edilmeden ulasmaya calisirsa http auth ile karsilaniyor.
$password_hash = '--MD5--SIFRE--';

function forceLogin(){
	global $password_hash;

	$loggedIn = FALSE;

	if (isset($_SERVER['PHP_AUTH_USER']) AND $_SERVER['PHP_AUTH_PW']
		AND $_SERVER['PHP_AUTH_USER'] == 'admin'
		AND md5($_SERVER['PHP_AUTH_PW']) == $password_hash) {
		
		$_SESSION['mfyz_social_auth'] = 'giris_yapildigina_dair_bir_hash';
		$loggedIn = TRUE;
	}

	if (!$loggedIn) {
		header('WWW-Authenticate: Basic realm="My Realm"');
		header('HTTP/1.0 401 Unauthorized');
		echo '<h2>Unauthorized Access!</h2>';
		echo 'To enter username and password, refresh the page.';
		exit;
	}
}

if (!(isset($_SESSION['mfyz_social_auth'])
	AND $_SESSION['mfyz_social_auth'] == 'giris_yapildigina_dair_bir_hash')) {
	forceLogin();
}
Her yerde ajax kullanımından geçilmez oldu. Ajax, hem kolaylıklarından hem de RIA'in (Rich Internet Applications) temeli olduğundan popülerliği gitgide artıyor. Karşımıza her yerde çıkıyor ve artık jquery gibi frameworkler sayesinde ajax çağrıları yapmak için tek satırda 5-10 karakterlik bir javascript kodu bile yeterli oluyor.

Bir php kodunda genelde çıktı verirken normal html etiketleri kullanıp tüm sayfayı tasarlıyoruz fakat genelde bu sayfalar bir verit yapısının görüntüleri (view) oluyor ve aynı çıktıyı javascript ile alıp basmak, hatta bazen ajax ile dışarıya bile vermek gerekebiliyor.

Artık az sonra bahsedeceğim method ile, dosyaları tasarlarken 2 türlü kullanımı için tasarlayacaksınız. Yani hem normal erişim ile hem de o sayfayı ajax ile kullanabilecek şekilde düşüneceksiniz. Burada ajax çağrısı olduğunu yakalamak için genel bir teknik olarak get methodu ile bir değişken gönderip onu izleyebilirsiniz. Mesela kayit.php?ajax=1

Bu, işin ilkel noktası. Ajax çağrısı olup olmadığını yakalamak için artık sunucu ortam değişkenleri arasında $_SERVER[HTTP_X_REQUESTED_WITH] değişkeni ile çağrı türünde değer xmlhttprequest ise yapan client'in kullandığı protokolu alabiliyorsunuz. Genellikle içindeki değer "xmlhttprequest" oluyor zaten. Yani bir çağrının ajax olup olmadığını bu şekilde kolayca kontrol edebilirsiniz.

Ufak şekilde örneklemek gerekirse :
$kisiler = array('Fatih', 'Ahmet', 'Mehmet', 'Zeynep');

// ekrana basalim
print "<ul>";
foreach( $kisiler as $kisi ){
    print "<li>$kisi</li>";
}
print "</ul>";
Bu kodda isimleri liste çıktısı alırsınız. Eğer javascript ile bu veriye erişmek istersek ajax çağrısı ile bu sayfayı çağırabiliriz ama işlenmiş html kodundan o isimleri almak zor olur. Ya da sadece belirli bir kısmını almak isteyebiliriz. Bunun için basitçe :
$kisiler = array('Fatih', 'Ahmet', 'Mehmet', 'Zeynep');

// ajax cagrisi ise json donelim
if( $_SERVER[HTTP_X_REQUESTED_WITH] ){
    die( json_encode($kisiler) );
}

// ekrana basalim
print "<ul>";
foreach( $kisiler as $kisi ){
    print "<li>$kisi</li>";
}
print "</ul>";
Bu kod eğer normal istek yapılırsa
<ul><li>Fatih</li><li>Ahmet</li><li>Mehmet</li><li>Zeynep</li></ul>
çıktısı; ajax ile istek yapıldığı zaman :
["Fatih","Ahmet","Mehmet","Zeynep"]
çıktısı verecektir.

Bu şekilde gelen çağrılardan ajax olanlarına sadece kisiler dizisini jsona çevirip sayfayı durduruyoruz. Javascript ile gelen json'u kolayca işleyebilirsiniz.

Burada json'a çevirip javascriptde işlemek zorunda değilsiniz. Ajax ile aldıktan sonra içeriği basmak istediğiniz yere uygun html kodu da üretebilirsiniz bu noktada.


Hazırlayan : Mehmet Fatih YILDIZ
6 Şubat Çarşamba ´08   —   11 Yorum

Ajax Nedir?


Ajax aslında modern tarayıcıların desteklediği XMLHttpRequest özelliğini kullanarak sayfa yenilemeden istek yapıp cevap almamızı sağlayan birşeydir.

XMLHttpRequest hakkında bilgi için buraya tıklayın.

Çoğu sitede görmeye alışık olduğumuz birşey haline gelmeye başladı aslında ajax. Çünkü web 2.0 uygulamalarının neredeyse ana çatısını oluşturuyor. Web 2.0 yazılımları 2.0 yapan şey aslında kullanıcı etkileşimi ve bu etkileşimden kastımız aslında bir web uygulamasının sanki masaüstü uygulaması gibi çalışması. Bu da aslında Sunucu-Kullanıcı istek-cevap ilişkisini sayfa yenilemeden yani kullanıcı için hazırladığınız ARAYÜZü yenilemeden birçok işi yapmaktan geçiyor. Tabiki bunu da XMLHttpRequest'i kolay hale getirip kullanmamızı sağlayan ajax kütüphaneleri yapıyor.

İnternette çok sayıda ajax kütüphanesine rastlayabilirsiniz, genellikle 3-5 satır kod ile istek ve cevabı işleyebiliyor. Fakat bu sitede mootools odaklı gittiğim için bu dökümanda mootools ile ajax eklentisini kullanmayı göreceğiz. Diğer kütüphaneleri de kullanarak farkı görebilirsiniz.


Mootools ve ajax


http://mootools.net/ adresinden mootools'u ajax seçeneği ile derleyerek indirmelisiniz. Sayfa başında mootools.js dosyasını include edin. Basitçe ajax isteği için kod bloğu şöyle :
new Ajax('icerik_alinacak_dosya.php', {
  method: 'get',
  update: $('icerik_basilacak_element_id')
}).request();
Çoğu mootools eklentisi, nesnesindeki gibi zorunlu kısımlar nesneye ilk parametrelerde veriliyor. Sonra da bir ayar dizesi (nesne olarak)
şeklinde 2. parametre belirleniyor.

Burada ilk parametre string olarak istek yapılacak url, yani istek yapılacak dosya adı. Bir php dosyası veya html dosyası veya dışarıda bir web sayfası urlsi olabilir. Ayar dizesindeki parametrelerden önemli olanların açıklamaları da şöyle :
data            Gönderilecek url parametreleri. Aşağıda açıklamasını yapacağım.

method          İstek methodu, get veya post olabilir.

update          Cevap geldiği zaman içeriğin yerleştirileceği html nesnesi adresi

onComplete      Cevap geldiği zaman işletilecek javascript kodu, fonksiyon olarak
                belirtilmesi gerekiyor ve fonksiyonun ilk parametresi cevap dönen
                içeriği string olarak fonksiyona sokar.

evalScripts     XMLHttpRequest ve çoğu diğer ajax kütüphanelerindeki ana sorun,
                cevap gelen içerik içerisinde eğer bir javascript kod bloğu veya
                dosya include varsa Normalde bu kısımlar çalıştırılmaz.
                Bu popüler bir sorundur, bu parametreye true değeri vererek
                bu sorunu aşabilirsiniz (Mootools'u seviyorum).
Şimdi bu parametreleri örneklerle açıklama çalışacağım. Önce bir bağlantıyı (link) ajax ile çağırıp dönen içeriği ekranda bir bölüme yazdıralım.
...
<a href="#" onClick="ajax_istek('hakkinda.html');">Hakkında</a>
<a href="#" onClick="ajax_istek('iletisim.html');">iletişim</a>
...
<div id="icerik"></div>
...
Bu sayfamız olsun. Linke tıklantığında ajax_istek fonksiyonunu url parametresiyle çağırıyor görüldüğü gibi. Ayrıca icerik kimlikli bir div var. İçeriği buraya basacağız.
function ajax_istek(hedef){
  new Ajax(hedef, {
    update: $('icerik')
  }).request();
}
Basit bir ajax isteği gördüğünüz gibi. Şimdi bunu biraz geliştirelim ve linke tıklandığında sayfa içeriği "Yükleniyor" olsun, içerik geldiğinde de zaten yükleniyor kalkacak.
function ajax_istek(hedef){
  $('icerik').setHTML('Yükleniyor');
  new Ajax(hedef, {
    update: $('icerik')
  }).request();
}
Biraz daha geliştirip yüklenme işlemi bittiğinde birşeyler yaptıralım.
function ajax_istek(hedef){
  $('icerik').setHTML('Yükleniyor');
  new Ajax(hedef, {
    update: $('icerik'),
    onComplete: function(){
      alert("Sayfa Yüklendi");
    }
  }).request();
}
Örneğin burada alert yerine sayfanın bir köşesinde bu uyarıyı gösterip gizletebilirsiniz, Ya da içeriği basmayıp bir işlem yaptırabilirsiniz. Bunu örneklemek için işe biraz form katacağım. mfyz.com'da üye kayıt sayfasında kullanıcı adı kontrol mekanizmasını anlatacağım. Kayıt formuna girdiğinizde kullanıcı adı seçip yazdıktan sonra bilgi giriş kutusundan çıktığınızda (yani başka bir nesenye odaklandığınızda) otomatik olarak kullanıcı adının veritabanında olup olmadığını sorgulayıp cevabı geliyor ve ona göre kutu yeşil veya kırmızı oluyor farkında iseniz.
<input type="text" id="kadi" onBlur="kullanici_adi_kontrol_et(this.value);">
şeklinde bir inputum var ve onBlur olayına yani kutudan odak gittiğinde bir fonksiyon çağırıyorum.
function kullanici_adi_kontrol_et(kadi){

  // kullanici adini veritabanindan kontrol
  // edecek php dosyasina sorgulatiyorum
  new Ajax('kullanici_adi_kontrol.php', {
    method : 'get',
    data: 'kadi = ' + kadi,
    onComplete: function(cevap){
      if(cevap == 'OK'){
        // kullanici adi giris kutusunun kenrlığını yeşil yapalım
        $('kadi').setStyles({
          'border' : '1px solid green'
        });
      }else{
        // kullanici adi giris kutusunun kenrlığını kırmızı yapalım
        $('kadi').setStyles({
          'border' : '1px solid red'
        });
        // ve gelen hatayi basalim
        alert(cevap);
      }
    }
  }).request();

}
Bakın burada 2 parametreyi örnekledim. Birisi data parametresi diğeri de update kullanmak zorunda olmadığımız. Ayrıca onComplete'de tanımladığımız fonksiyonun ilk parametresi yani cevap değişkeni ajax ile dönen içeriği alıyor.

Yukarıda yaptırdığım işlem özetle şöyle: kullanici_adi_kontrol.php dosyası get methodu ile gelen kadi değişkenindeki string'i veritabanında aratıyor. Eğer yoksa ekrana sadece "OK" basıyor. Eğer başka bir hata varsa hatayı basıyor. Mesela kullanıcı adında geçersiz karakterler var veya veritabanında o kullanıcı mevcut. Yani hata varsa "OK" dışında birşeyler oluyor. PHP hatası da olabilir.

onComplete'da cevap değişkenini kontrol ettiriyorum. Eğer "OK" string'i ise kullanıcı adı yok yani ekrana başarı sinyali vermem gerek. Ben de etkileşimli olması için bilgi giriş kutusunun çerçevesini yeşil yapıyorum. Mootools ile css özniteliklerini değiştiriyorum. Eğer OK değilse bir hata vardır. Çerçeveyi kırmızı yapıp cevap değişkenini yani dönen hatayı ekrana yazdırıyorum alert ile.

Bu istekleri ve cevap işleme tekniklerini uygulamanıza göre geliştireceksiniz, Zaten burada o istek-cevap ilişkisinin boyutu önemli değil. Yani çok büyük istekler de yapabilirsiniz çok küçük de.


Formları otomatik ajax ile post etmek


Mootools'da çok güzel bir özellik daha var. Formunuzu çok pratik bir şekilde ajax ile göndermek.
<form id="bilgi_formu" action="kayit.php" method="post">
  Ad : <input type="text" name="ad"><br>
  Soyad : <input type="text" name="soyad"><br>
  <input type="submit" value="Gönder">
</form>
böyle bir formunuz olduğunu varsayalım. Oldukça basit yani. Gönder butonuna basıldığında normal şekilde kayit.php dosyasina post methodu ile 2 değişken gidiyor biliyorsunuz. kayit.php'de de bu değişkenleri işliyorsunuz.
$('bilgi_formu').send();
kodu sayesinde formu ajax ile gönderebilirsiniz. Gideceği url, methodu ve datası otomatik olarak bulunup gönderiliyor. Örnek kullanımını da şu kodlar özetleyebilirim :
<form id="bilgi_formu" action="kayit.php" method="post">
  Ad : <input type="text" name="ad"><br>
  Soyad : <input type="text" name="soyad"><br>
  <input type="button" onClick="gonder()" value="Gönder">
</form>

<script>
function gonder(){
  $('bilgi_formu').send({
    onComplete: function(){
      alert("Başarıyla gönderildi");
    }
  });
}
</script>
Gördüğünüz gibi submit yerine buton kullanarak bir fonksiyon çağırıyorum. ajax için kullandığımız send fonksiyonunun ilk parametresi ajax için kullandığımız ayar dizesi oluyor. Yani update ile gelen içeriği biryere yazdırabilir veya ajax için uyguladığımız taklaları burada da attırabilirsiniz.


Mootools ajax dökümantasyonu :http://docs.mootools.net/Remote/Ajax.js
Ajax Demoları :http://demos.mootools.net/Ajax
http://demos.mootools.net/Ajax.Form
Not : Nesnelere olay ekleyip bu işleri yaptırmak daha kolaydır. Mesela form ajax ile post etmek için submiti butona çevirmek ilkel bir mantıktır. Forma doğrudan onSubmit olayı ile kural belirleyerek yaparız aslında bu işlemleri. Fakat dökümanda daha fazla kafa karışıklığı yaratmaması için doğrudan fonksiyon çağırtıp işlem yaptırdım.
Hazırlayan : Mehmet Fatih YILDIZ
20 Ağustos Pazar ´06   —   4 Yorum

XMLHttpRequest Nedir?

XMLHttpRequest Microsoft'un bize kazandırdığı ender nimetlerden birisidir. Eskiden bi zamanlar ypaılmış tarih zırvalıklarına gerek olduğunu düşünmüyorum.

İlk önce Internet Explorer'ın bir ActiveX denetimi mi obje si midir nedir öyle çalışıyormuş ve XML ile tarayıcı yenilemeden url bazlı iletişim saplıyormuş. Tam yapılış amacını da bilmiyorum. Fakat daha sonra geliştirilmiş ve bazı web uygulamalarında kullanılmaya başlanmış. Ardından da Mozilla ve KHTML (Konqueror, Safari) gibi browser'lar da xmlhttprequest desteği sağlamaya başlamışlar. Tabi biz XMLHttpRequest olarak tanımadık bunu, birkaç (ne kadar bilmiyorum ama hatırladığım kadarıyla 5-6) sene kadar kullanıldıktan sonra AJAX denilen bir kod adıyla xmlhttprequest objesini kullanan bir kütüphane geliştirildi. Evet biz bu nesneyi ajax, sajax gibi adlarla tanıdık. Geliştiriciler için kolay (bence daha zor) javascript kütüphaneleri geliştirildikten sonra çok kısa sürede popüler kullanılan şeyler oldular.

Benim XMLHttpRequest ile maceram ise çook yeni, herhalde 5-6 ay olmuştur bununla tanışalı. Ajax kütüphanesi ilk çıktığında aşırı antipatik karşılamıştım. Duyduğum şeyler de zaten bu şeyin yeni olmadığı konusuydu, sonraki araştırmamda zaten bunu öğrendim. Sayfa yenilenmeden işlem yapmayı ben iframe'ler ile hallediyordum daha önceleri fakat xmlhttprequest sayesinde daha kompleks kodlar yazabiliyorum.

Tam olarak ne işe yapar?

Bu nesne söylediğim gibi ilk başta XML kodları şeklinde haberleştiriyormuş tarayıcı ile sunucuyu. Ama daha sonra plain text aktarımı da katılmış ve günümüzde biz genellikle sade metin transferi kullanıyoruz. Tabiki sade metin ile yapamadığımız bazı şeyleri XML transferi ile daha rahat çözebiliyoruz.

Tam olarak, sayfa yenilenmeden içerik alımı veya veri gönderimi yapmamızı sağlar. Şu an en yaygın bilinen proje olarak gmail'in arabirimini örnek verebilirim. Gmail'de mesaj kutularınız arasında veya mesaj formlarında sayfanız yenilenmez bildiğiniz gibi. Sadece gerekli içerik alınıp gerekli forma sokulup ekrana yerleştirilir. Aynı şekilde bir mesaj gönderdiğinizde de sonuç, sayfa yenilenmeden ekrana gelir “Mesaj gönderildi” veya hata mesajları.

Neden kullanmalıyız?

En önemli artısı, sayfa yenilenmediği için değişken olmayan diğer kısımların hem sunucuda yeniden işlenip sunucuyu yorması engellenir; hem de kullanıcıda tekrar yüklenmediğinden bant genişliği boşa harcanmaz, aynı zamanda kullanıcı tarafında sayfalarda daha hızlı işlem yapılır.
Sayfayı yenilenmeden içeriğimizi alıyor olmamız, web uygulamamıza bir masaüstü uygulama görünümü katar. Kurumsal projelerde bu tarz artılar her zaman iyidir. Çünkü web uygulamalarının tek sıkıntısı, hızlı ve pratik çalışamıyor olmanızdır. Yani kurumsal amaçla çalışan bir yazılım masaüstündeki yazılımlar gibi pratik kullanılan şeyler olmalıdır.

Sorunlar neler? (Eksiler/Dezavantajlar)

Böyle bir nesneyle yazılmış kütüphane kullanmak çyle çok daha rahat bişey değil. Tabiki bazı sorunlar var.
Türkçe karakter sorunu, eğer içerik aldığınız sayfa içinde hangi karakter seti ayarlıysa ona göre gelir. Bunun çözümü için içeriği aldığınız sayfa'ya ya HTML etiketi ile karakter seti ayarlaması belirtmeniz gerek. Ya da herhangi bir web programlama dili kullanıyorsanız onun sayfa başlık bilgisi fonksiyonlarını/methodlarını kullanarak karakter seti ayarlamanız gerekecektir. Mesela php için;
<?php
header("Content-Type:text-html;charset:utf-8");
?>
ile sayfa başlık bilgisini (header) ayarlayabilirsiniz. Böylece Türkçe karakter problemini çözmüş olursunuz. (Eğer iso kullanıyorsanız ona göre ayarlayın)

İkinci sorun ise iç sayfalara koyduğunuz javascript kod bloklarıdır.
-- İÇERİK --

<script>
  document.write('Selam');
  alert('Merhaba');
  // ...
</script>

-- İÇERİK --
şeklinde tanımladığınız tüm kodlar ignore edilmiş olacaktır.
Bu sorunların hepsini kolayca çözmek ve daha pratik ajax kullanmak istiyorsanız mootools kullanmanızı öneririm.
Hazırlayan : Mehmet Fatih YILDIZ

Popüler Etiketler

apple iphone ipad spam php coding javascript ipucu html meta blog editor css ruffles doritos iOS webkit web app app music google macosx workspace applications free cms cache session cookie jquery link plugin rss lifestream parse xml ie css3 support browser wanda facebook oyun ide phpstorm jetbrains deployment version control svn git less htaccess apache route router mod_rewrite opengraph graph api share social code development ui ux icons mobile startups www subdomain redirect crossdomain pear mdb2 prepare execute injection linux konsol sql optimizasyon form radio style mfyz table media twitter bootstrap sosyal regex subversion proje firefox logo mysql pgsql mssql html5 input terminal search ajax optimization screen js gimp mootools date diff zaman xhtml job digital örnek kod wordpress dokuman kitap textarea select xmlhttprequest url service tool imza signature mail tarih developer object compile compiler windows on-the-fly sitemap generator open source kampanya tytz login fql kurulum nasıl while newsletter connect box internet statistics browsers language kontrol yapıları if switch design download internet explorer laptop notebook integration network button icon ikon grafik banner calendar seo lisans license nedir ios app store store in-app purchase purchase verification storekit itunes connect itunes server player db database auth query wireless tebrik analyse procedure istatistik medya ubuntu howto widget pharma hack subscription export insanlar portfolio http chart assets framework osx ntfs fstab