PHP ile Facebook Connect Entegrasyonu – Uygulamalı Anlatım

facebook-php-sdk-developer


Merhaba arkadaşlar.

Facebook Connect konusunda piyada Türkçe kaynak eksikliği var. Bu eksikliği giderebilmek için bir yazı yazmıştım. Ancak yazı site kapandığı için şu an ulaşılamıyor. Bu nedenle tekrar uygulamalı olarak anlatmak istedim. Uygun görülürse konu sabitlenebilir. Çünkü çok kişinin üzerine soru sorduğu bir konu bu.

Facebook Connect’i internet sitelerinize entegre edebilmek için orta düzeyden biraz daha fazla PHP, MySQL ve Session/Cookie bilginiz olması gerekiyor.

Uygulama oluşturma
Öncelikle https://developers.facebook.com/apps adresine girip, Yeni Uygulama Oluştur butonuna tıklayın.

App Name: Uygulamanızın adı. 3-32 karakter arası.

Devam deyip, sonraki sayfada Captcha doğrulamasını yapın. Uygulamanız oluşturuldu. Karşınıza uygulama Temel sayfası gelecek. Burada uygulamanız için hayati önem taşıyan bilgiler bulunuyor. En önemli bilgiler;

  • App ID
  • App Secret

Bu bilgileri mutlaka bir yere kaydedin ve kimseyle paylaşmayın. Bunlar sizin Facebook e-posta adresi ve parolanız gibi. Yani uygulamanızın Facebook ile iletişime geçmesi için gerekli olan oturum açma bilgileri gibi.

Aynı sayfada aşağıda, Facebook Girişi Olan İnternet Sitesi sekmesini açın ve internet sitenizin, hatta mümkünse Facebook Connect kullanan sitenizin dizininin adresini yazın. Örneğin Facebook Connect’i localhost’ta kullanacaksınız (deneme amaçlı yada geliştirme amaçlı), adrese http://localhost/ yazın. Uygulamayı başka bir adreste kullanacaksanız, http://siteadresiniz.com/ yazın. Facebook yönlendirmeleri, güvenlik açısından sadece burada belirttiğiniz URL’lere yapıyor.

Facebook PHP SDK indirme
Temel sayfasındaki işlerimiz bitti. Şimdi geliştirme aşamasına geçeceğiz. Facebook, işimizi kolaylaştırmak için bize SDK’lar yapmış. Açılımı Software Development Kit. Yani Yazılım geliştirme kiti. PHP için bu kiti indireceğiz.

https://github.com/facebook/facebook-php-sdk adresine girin. src klasörünün içinde bulunan 3 dosyayı indirin. İndireceğiniz dosyaların isimleri;

  • base_facebook.php
  • facebook.php
  • fb_ca_chain_bundle.crt

Dizin yapısı oluşturma
Dosyaları indirdiniz. Şimdi bir klasör yapısı oluşturalım. Çalışmayı localhostta yaptığımızı düşünelim. Ana dizininizde FCDeneme isimli bir klasör oluşturun. Yani bu bölüme http://localhost/FCDeneme yazınca ulaşabilelim.

FCDeneme klasörünün altına facebook isimli bir klasör oluşturun. İndirdiğimiz 3 Facebook SDK dosyasını bu klasöre atın.

Şimdi klasör yapımız şu şekilde olmalı;
-/FCDeneme/
—/facebook/

FCDeneme klasörünün içine 3 dosya daha oluşturacağız. Birinin adı tahmin edeceğiniz üzere index.php, birinin adı ayar.php, birinin adı fbout.php, birinin adı ise fbin.php olsun.

Yeni yapı;
-/FCDeneme/
—/facebook/
—index.php
—fbin.php
—ayar.php
—fbout.php

Veritabanı oluşturma
Şimdi bir de veritabanı yapısı düzenleyelim. Veritabanı oluşturun. Adı fb olsun. İçine uyeler diye bir tablo oluşturun. Sütunları;

  • id(INT),auto_increment,11;
  • fbID(VARCHAR),11
  • adsoyad(VARCHAR),255

Facebook PHP SDK hakkında
Facebook Apilerini kullanmak için birçok farklı yöntem var. Her yöntemde kendimizi ve uygulamamızı bir şekilde Facebook’a tanıtmamız gerekiyor. Facebook hali hazırda Oauth 2 protokollerini destekliyor. Oauth ile kendimizi ve uygulamamızı Facebook’a tanıtmak için bir dizi işlem yapıyoruz. Ama bunu daha basit ve kullanışlı hale getirmek için Facebook bir SDK oluşturmuş.Bu SDK sayesinde hem Oauth protokolünün sağlanması hem de Facebook üzerinde değişikler,işlemler yapmak çok kolaylaşıyor.

Kod yazmaya başlayalım
ayar.php dosyamızı açalım. İçine öncelikle veritabanı bağlantılarımızı yazarak başlayalım.

ayar.php

mysql_connect("DB_HOST","DB_USER","DB_PASSWORD");
mysql_select_db("fb");


Ardından FB tanımlama bilgilerini gireceğiz. Facebook Temel sayfasında App ID ve App Secret bilgilerini almıştık hatırlarsanız.

ayar.php

mysql_connect("DB_HOST","DB_USER","DB_PASSWORD");
mysql_select_db("fb");

$fbayar = array();
$fbayar['appId']="FACEBOOK APP ID";
$fbayar['secret']="FACEBOOK APP SECRET";


ayar.php dosyamızın içeriği bu şekilde. Bu dosyada artık bir değişiklik yapmayacağız. Bu dosya sessionları kullanabilmemiz için gerekli komutu, veritabanı bağlantı bilgilerimizi ve Facebook uygulama bilgilerimizi taşıyan $fbayar dizi değişkenini barındırıyor.

Giriş ve çıkış URL’lerinin gösterilmesi
Üyelik sistemlerinde basit mantık şudur. Eğer giriş işlemi ile ilgili session yada cookie oluşturulmuşsa çıkış bağlantısı, oluşturulmamışsa giriş bağlantısı gösterilir.

Biz bu uygulamada giriş bilgilerini cookie ile değil sessionlar ile tutacağız.

index.php dosyamızı oluşturmaya başlayalım.

index.php

require_once("ayar.php");
require_once("facebook/facebook.php");

$facebook = new Facebook($fbayar);

if(@$_SESSION['fboturum']=="tamam"){
// giriş yapılmışsa burası
}
else{
// giriş yapılmamışsa burası
}

Session koşullarını yaptık. Şimdi giriş ve çıkış URL’lerini alacağız. Buraya kadar olan olayları anlatırsak;

  • ayar.php dosyasını çağırdık
  • facebook.php dosyasını çağırdık
  • $facebook değişkeni oluşturduk. Facebook sınıfına $fbayar dizisini göndererek bağlandık.
  • Giriş yapılmışsa, giriş yapılmamışsa durumlarını sessionları kullanarak belirledik.

Facebook SDK’sı, giriş ve çıkış URL’lerini getLoginUrl ve getLogoutUrl metodlarıyla tutuyor.

// Giriş URL’si

$girisurl = $facebook->getLoginUrl(array(
'scope' => 'publish_stream,email',
'redirect_uri' => 'http://localhost/FCDeneme/fbin.php'
));


//Çıkış URL’si

$cikisurl = $facebook->getLogoutUrl(array(
'next' => 'http://localhost/FCDeneme/fbout.php'
));


Burayı biraz açıklayalım. Facebook SDK’sı, giriş ve çıkış URL’lerini getLoginUrl ve getLogoutUrl metodlarıyla tutuyor demiştik.

Giriş URL’sine dikkat ettiyseniz scope ve redirect_uri değerleri bulunuyor. scope, giriş yapıldığı taktirde, kullanıcının hangi bilgilerinin alınacağıyla ilgili. Normalde scope değeri atamazsanız, facebook https://developers.facebook.com/docs…d-friend-list/ sayfasında belirtilen verileri, kullanıcı giriş yapınca varsayılan olarak geri gönderiyor. Ancak e-posta adresini alma yada kişinin profilinde birşeyler paylaşma arzusundaysanız, ek izinler almanız gerekiyor. Bu izinler kişi sizin giriş urlnize tıklandığında kullanıcıya gösteriliyor ve izin vermesi isteniyor. İzin verilmişse, facebook bu bilgileri sizinle paylaşıyor ve izin veriyor. İzinlerle ilgili daha fazla bilgiyi https://developers.facebook.com/docs…n/#permissions sayfasından alabilirsiniz. Giriş Urlsinde bir de redirect_uri bulunuyor. Bu adres, giriş yapıldığında yada kullanıcı girişi iptal ettiğinde dönülecek olan adresi belirliyor.

Çıkış URL’sinde next verisini göreceksiniz. Bu da çıkış yapıldığında facebook’un kullanıcıyı sizin sitenizde yönlendireceği adresi gösteriyor.

index.php dosyasını düzenlemeye devam edelim.

index.php

PHP- Kodu:
require_once("ayar.php");
require_once("facebook/facebook.php");

$facebook = new Facebook($fbayar);

if(@$_SESSION['fboturum']=="tamam"){
// giriş yapılmışsa burası
$cikisurl = $facebook->getLogoutUrl(array(
'next' => 'http://localhost/FCDeneme/fbout.php'
));
echo "<a href=\"{$cikisurl}\">Çıkış yapmak için tıklayın.</a>";
}
else{
// giriş yapılmamışsa burası
$girisurl = $facebook->getLoginUrl(array(
'scope' => 'publish_stream,email',
'redirect_uri' => 'http://localhost/FCDeneme/fbin.php'
));
echo "<a href=\"{$girisurl}\">Facebook ile giriş için tıklayın.</a>";
}

index.php dosyamız hazır.

Ziyaretçimiz sitemize gelecek. Oluşturulan giriş url’sine tıklayacak ve Facebook’a yönlenecek. Orada uygulamamıza izin verecek veya vermeyecek ve http://localhost/FCDeneme/fbin.php adresimize geri yönlenecek.

Şimdi fbin.php dosyamızı düzenleyeceğiz.

Giriş yapıldıktan veya yapılmadıktan sonraki işlemler

Söylediğimiz gibi fbin.php dosyamız şunun için kullanılacak. Kullanıcı sitemize girecek. Giriş URLsine tıklayacak ve facebook’a yönlenecek. Orada giriş yap veya iptal butonuna tıklayacak ve fbin.php sayfamıza geri dönecek.

Bu durumda şu koşullar oluşabilir.

  1. Ziyaretçi uygulamamıza izin verebilir.
  2. Ziyaretçi uygulamamıza izin vermeden iptal’e tıklayabilir.

İptal’e tıklanırsa sitemize geri döner ve yine giriş urlsini görür.

Ancak izin verilirse yine ortaya birkaç farklı koşul çıkabilir. Malum bir veritabanımız var.

  1. Ziyaretçi uygulamamıza ilk kez izin veriyor olabilir. Veritabanı kontrol edilmeli, kullanıcı yoksa veritabanına kayıt edilmeli ve oturum açılmalıdır.
  2. Ziyaretçi daha önce uygulamamıza izin vermiş olabilir. Bu durumda veritabanı kontrol edilmeli, kullanıcı varsa sadece oturum açılmalıdır. Veritabanına aynı kullanıcıyı tekrar eklemek istemeyiz.

fbin.php

require_once("ayar.php");
require_once("facebook/facebook.php");

$facebook = new Facebook($fbayar);

Önce kullanıcının iptal’e basma durumunu süzelim. Eğer kullanıcı izin sayfasında iptal’e bastıysa facebook, fbin.php dosyamıza $_GET[‘error’] verisi gönderir. Eğer izin verilmişse, geri dönen bilgilerde böyle bir veri olmaz.

fbin.php

require_once("ayar.php");
require_once("facebook/facebook.php");

$facebook = new Facebook($fbayar);

if(isset($_GET['error'])){
// İzin verilmedi, iptale tıklandı.
header("Location: index.php");
// Hiçbirşey yapmadık, kullanıcıyı sadece index.php sayfasına yönlendirdik.
}
else{
// İzin verilme koşulu sağlandıysa
}

İptal durumunu süzdük. Şimdi izin verilme durumunu yapalım. İzin verildiyse öncelikle kullanıcının Facebook IDsini alıp, veritabanımızda kayıtlı olup olmadığını kontrol edeceğiz.

fbin.php

require_once("ayar.php");
require_once("facebook/facebook.php");

$facebook = new Facebook($fbayar);

if(isset($_GET['error'])){
// İzin verilmedi, iptale tıklandı.
header("Location: index.php");
// Hiçbirşey yapmadık, kullanıcıyı sadece index.php sayfasına yönlendirdik.
}
else{
// İzin verilme koşulu sağlandıysa
$fbID = $facebook->getUser();

$uyekontrol = mysql_query("SELECT * FROM uyeler WHERE fbID='$fbID'");

if(mysql_num_rows($uyekontrol)==1){
// Daha önce kayıt olmuş bir üye ise
$_SESSION['fboturum']="tamam";
$uyebilgi = $mysql_fetch_object($uyekontrol);
$_SESSION['fboturumid'] = $uyebilgi->id;
}
else{
// Daha önce kayıt olmuş bir üye değilse
}
}

mysql_num_rows ile veritabanında dönen facebook fbID var mı yok mu kontrol ettik. Varsa fboyurum sessionunu “tamam” olarak belirledik. Aynı sorgudan mysql_fetch_object ile üye bilgilerinden id’yi çektik ve fboturumid sessionuna atadık.

Şimdi de dönen üyenin veritabanında olmaması durumuna bakalım.

fbin.php

require_once("ayar.php");
require_once("facebook/facebook.php");

$facebook = new Facebook($fbayar);

if(isset($_GET['error'])){
// İzin verilmedi, iptale tıklandı.
header("Location: index.php");
// Hiçbirşey yapmadık, kullanıcıyı sadece index.php sayfasına yönlendirdik.
}
else{
// İzin verilme koşulu sağlandıysa
$fbID = $facebook->getUser();

$uyekontrol = mysql_query("SELECT * FROM uyeler WHERE fbID='$fbID'");

if(mysql_num_rows($uyekontrol)==1){
// Daha önce kayıt olmuş bir üye ise
$_SESSION['fboturum']="tamam";
$uyebilgi = $mysql_fetch_object($uyekontrol);
$_SESSION['fboturumid'] = $uyebilgi->id;
header("Location: index.php");
}
else{
// Daha önce kayıt olmuş bir üye değilse

// api metodundan üye bilgilerini çekelim
$yeniuye = $facebook->api("/{$fbID}",'GET');

// üye bilgileri $yeniuye dizisinde tutulacak.

$adsoyad = $yeniuye['name'];
$email = $yeniuye['email'];

mysql_query("INSERT INTO uyeler (adsoyad,fbID) VALUES ('$adsoyad','$email')");

$uyeidcek = mysql_query("SELECT * FROM uyeler WHERE fbID='$fbID'");
$yeniuyeid = mysql_fetch_object($uyeidcek);

$_SESSION['fboturum']="tamam";
$_SESSION['fboturumid'] = $yeniuyeid->id;
header("Location: index.php");
}
}

Üyenin daha önce veritabanımızda olmaması durumunu da böylece bitirdik. Üye bilgileri api metoduyla çekilir. Ayrıca paylaşım yapma gibi bütün işlemler de api metoduyla halledilir.

getUser ile kişinin facebook ID’sini aldık yine. Sonra api metodunda $yeniuye = $facebook->api(“/{$fbID}”,’GET’); şeklinde yerine yazdık. üyenin tüm bilgileri $yeniuye değişkenine atandı. Bu bir dizi olarak atanır. Örneğin ben uygulamanıza izin veren bir kullanıcıysam, benim bilgilerime $facebook->getUser(‘/erginkeles’,’GET’); şeklinde ulaşılacaktır. Ama izin vermediysem hata alırsınız. Veri alma gibi işlemler GET metodu ile, paylaşım yapma gibi işlemlerse POST ile yapılıyor.

Ardından veritabanına yeni bir satır ekledik. id’si otomatik olarak belirlendi. fbID sütünuna getUser ile aldığımız facebook id’sini, adsoyad sütununa ise api metoduyla çektiğimiz ad soyad bilgisini girdik.

Sonra tekrar bir sorgu oluşturduk ve bu yeni üyenin oluşturulan yeni id’sini alıyoruz. Hemen ardından da, fboturum ve fboturumid sessionlarını atayarak, üyenin giriş işlemini de yapmış oldu. Giriş işleminden sonra da üyeyi index.php’ye yönlendirmiş olduk. Artık üye, session girişi yapıldığı için giriş urlsini değil çıkış urlsini görebiliyor olacak.

Çıkış işlemi
Giriş yaptıktan sonra siteniz üzerinde çeşitli işlemleri, sıradan bir üyelik sistemi kullanıyor gibi yapabilirsiniz. Malum, üye girişi yaptık ve sessionlarımız mevcut.

Şimdi de fbout.php dosyamızı hazırlayalım. getLogoutUrl metodu ile bir çıkış urlsi almıştık facebook’tan. Kullanıcı ona tıkladığı zaman yine facebook’a yönlenir ve çıkış gerçekleşir. Ardından next kısmında belirlediğimiz adrese geri yönlenir. Burada da sitemiz için gerekli session öldürmelerini yapacağız.

fbout.php

require_once("ayar.php");
require_once("facebook/facebook.php");

$facebook = new Facebook($fbayar);

unset($_SESSION['fboturum']);
unset($_SESSION['fboturumid']);

$facebook->destroySession();

header("Location: index.php");

fbout.php dosyasında yaptığımız işlemler şu şekilde.

  1. fboturum ve fboturumid sessionlarını boşalttık.
  2. $facebook->destroySession() metodu ile facebook sessionlarını sonlandırdık.

İşin eğlenceli kısmı

Facebook Connect ile giriş yaptık, çıkış yaptık. Eeee?

Facebook Connect’i sadece kullanıcı giriş çıkış işlemleri için kullanabilirsiniz. Bunun yanında daha birçok işlem için Facebook connect ve Facebook apilerini kullanabiliriz.

Apileri kullanırken önemli olan nokta izinlerin alınması. İzinleri, giriş urlsi alırken, scope kısmında talep ettiğimizi belirtmiştik. Hatırlatayım:

$girisurl = $facebook->getLoginUrl(array(
'scope' => 'publish_stream,email',
'redirect_uri' => 'http://localhost/FCDeneme/fbin.php'
));


Şimdi de hangi bilgi ve işlem için hangi iznin alınması gerekiyor onlara bakacağız.

Hiçbir izin alınmadıysa
Scope kısmı boş bırakıldıysa, kullanıcının herkese açık bilgileri ve arkadaş listesi döner. Dönen bilgilerden bazıları şunlar:

$girisurl = $facebook->getLoginUrl(array(
'scope' => '',
'redirect_uri' => 'http://localhost/FCDeneme/fbin.php'
));


  • id : Facebook ID
  • name : Ad Soyad beraber
  • first_name : Sadece ad
  • last_name : Sadece soyad
  • link : Kullanıcı adı ile beraber facebook linki. Örnek; http://facebook.com/erginkeles
  • username : Sadece kullanıcı adı
  • gender : Cinsiyet
  • locale : Bölge, dil. Örnek; tr_TR
  • age_range :
  • timezone : saat dilimi (mesela türkiye için 2 olarak görünür. yani est+2)
  • Diğer herkese açık veriler***

*** Mesela kullanıcı okul bilgilerini, iş bilgilerini herkese açık olarak güncellemişse, burada bu bilgiler de gelir.

Bu bilgileri almak için birkaç örnek verelim.

$bilgiler = $facebook->api("/{fbID}",'GET');

$ad = $bilgiler['first_name'];
$soyad = $bilgiler['last_name'];
$kullaniciadi = $bilgiler['username'];
$fbID = $bilgiler['id'];

Gördüğünüz gibi, veriler dizi olarak geri döner. Dizinin ilgili elemanını alabilirsiniz.

Hiçbir izin alınmadığında bir de arkadaş listesi döndürebilirsiniz. Arkadaşların sadece ID numaraları ve Ad Soyad bilgileri döner.

$arkadaslar = $facebook->api("/{fbID}/friends",'GET');

print_r($arkadaslar);

şeklinde arkadaş listesini görebilirsiniz.

Sıfır siteye entegrasyon kolay. Peki hazır sistemlere, hali hazırda kullandığımız sistemlere Facebook Connect’i nasıl entegre edeceğim?
Facebook Connect entegrasyonunu anlattıktan sonra en çok soru aldığım konu buydu. Bütün internet sitesini ve sistemi Facebook Connect etrafında kurmak kolay. Üyelik sistemini Facebook Connect kullanarak sıfırdan oluşturmak kolay. Peki ya hali hazırda kullandığınız sistemde entegrasyon nasıl olacak?

Daha da açmam gerekirse şundan bahsediyorum. Diyelim ki başkasının yazdığı bir sistem kullanıyorsunuz. Örneğin wordpress. Evet wordpress için hazır yazılmış Facebook Connect eklentileri var. Ama olmadığını düşünün. Facebook Connect’i wordpress için uygulamak istediniz. Neler yapmalı nasıl bir yol haritası izlemelisiniz?

Hazır bir sisteme Facebook Connect entegre etmeden önce benim size bir yol haritam olacak.

Öncelikle Facebook Connect’ten sadece kendi üyeleriniz faydalansın. İlk aşamada dışarıdan sadece Facebook Connect ile üyelik kabul etmeyin. Bunu şunun için yapın. Üyelerinizin var olduğu veritabanı tablonuzda, fbID isimli bir sütun oluşturun. Böylece her üyenizin bir fbID sütunu olacak. Üyeleriniz var olan üye girişlerini yapsınlar. “Bilgilerim” gibi üyelerinizin bilgilerini güncellediği bir sayfanız mutlaka vardır. Bu sayfaya Facebook ile bağlantı kur gibi bir seçenek ekleyin. Bu sayede üyeleriniz Facebook Connect ile sizin web sitenizdeki hesaplarını birleştirmiş olsunlar. Bu sayede hem sizin sitenizde hesap sahibi olup, hem de yeniden Facebook Connect ile yeni bir hesap oluşturmuş olmasınlar.

Üyelerinizi bunu yapmaları konusunda teşvik edin. Site hesapları ile facebook hesaplarını birleştirsinler. Birleştiriliince, fbID sütununa üyenin facebook IDsini yazdırın. Şimdi sitenize daha önce üye olan kişiler için 2 giriş yöntemi oldu. 1.si normal kullanıcı adı ve parola ile giriş. Bunu her zamanki gibi yapacaklar. Bir de facebook ile giriş. Facebook hesapları ile normal hesaplarını birleştirmiş olan üyeleriniz tek tıkla giriş yapabilsinler.

Not olarak düşeyim, bilgilerim sayfasından facebook ile site hesaplarını birleştirecek üyeler linkle tıklayacak. Facebooka gidip sitenize izin verecek ve fbin.php dosyanıza dönecekler. Bu dosya facebooktan gelen ID’yi üyenizin fbID sütünuna yazdıracak.

Belli bir süreden sonra Facebook connect’i, tüm ziyaretçilerinize açabilirsiniz. Bu sefer fbin.php dosyanız veritabanına ekleme işlemini de yapmak zorunda.

Ben makaledeki örnekte, giriş işlemini fboturum session’u ile yaptım. Yani $_SESSION[‘fboturum’] tanımlandıysa, ve id atandıysa, üye girişi yapılmış farzettik. WordPress veya vbulletin gibi sistemlerde tabi ki bu yeterli olmayacaktır. Hangi sessionlar açılıyor, hangi cookie’ler kullanılıyor bunu saptamalı ve sistemin kullanıcıyı giriş yapmış olarak görebilmesi için gerekli işlemleri yaptırmalısınız. Siz belli bir session oluşturabilir ve açabilirsiniz ama wordpress, vbulletin vs bunu tanımalı ki giriş yapılabilsin.

 

Kaynak : http://www.r10.net/php/981661-php-ile-facebook-connect-entegrasyonu-uygulamali-anlatim.html

Buraları "gomple" benim gençler...

Leave a Reply

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

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>