22.05.2012

Asp.Net ile Google Login İşlemi


Öncelikle merhabalar bu makalemde sizlere google servisini kullanarak web sayfamıza nasıl login olunabileceğini anlatıyor olacağım.
Tabiki öncelikle neden böyle bir servise ihtiyaç duyarım, bize ne avantaj sağlar ona değinmek lazım. Facebook ile login veya Google ile login gibi servisler bize yapacağımız web uygulamasını kullanacak kişilerin üye olmadan sistemimize daha doğrusu var olan üyelikleri(Google,Facebook vb..) ile çok hızlı bir şekilde işlem yapabilmelerini sağlar. Günümüzde her gördüğümüz siteye üye olmak bizi yormakta oysa benim zaten var olan üyelik bilgilerimi kullansa ben çok daha hızlı olarak işlem yapabilirim mantığla yola çıkarsak bu tür servislerin önemini anlayabiliriz. Ayrıca bu tür servisleri kullanırken kullanıcıya asla onun şifresini almayacağımızı, alamayacağımızı hissettirmemiz gerekmektedir bunun için butür servisleri kullanırken küçük bir bilgi vermemiz önemli olabilir.
Kısacası böyle bir servise ihtiyaç duyarım çünkü sistemime gelen insanları en kısa zamanda, uğraştırmadan sistemime dahil edebilmek için. Avantajlarına gelince kısa sürede kişi sisteme üye olabilmekte, her sistem için aynı e-posta adresi ve şifre kullanmış oluyur, her sitenin güvenlik sistemini bilmediğimiz için şifremizi google güvenerek korumuş oluyoruz
Lafı fazla uzatmadan hemen örneğimize geçelim.  
Öncelikle Google OpenID protokolunu kullanır bundan dolayı bizde ücretsiz olan DotNetOpenAuth kütüphanesini kullanacağız. http://www.dotnetopenauth.net/ adresinden kütüphaneyi indirdikten sonra projemize referans olarak ekliyoruz.
    
 Bundan sonra yapacağımız işlem bu kütüphaneyi kullanarak google'ın login sayfasını çağırmak daha sonra ise google'ın bize login olunup olunmadığını bildirmesi. Önemli nokta ise şu biz bu aşamada kişinin asla google e-posta adresini ve şifresini öğrenmiyoruz sadece login olup olmadığını öğreniyor olacağız.  
Hemen default.aspx sayfama bir adet button ve label koyuyorum.
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server"
Text="Google ile Login" OnClick="Button1_Click" />
<br />
<asp:Label ID="lblUyari" runat="server"></asp:Label>
</div>
</form>
</body>

Kişinin button'a basınca google'ın login sayfasına gitmesine istiyorum ve eğer kişiye uyarı vereceksemde label'ı kullanacağım. Hemen button'unonclick olayını yazıyorum.
protected void Button1_Click(object senderEventArgs e)
{
OpenIdRelyingParty openid = new OpenIdRelyingParty();
//öncelikle referans olarak eklediğimiz OpenIdRelyingParty nesnesinden oluşturuyorum
var b = new UriBuilder(Request.Url) { Query = "" };
//birtane google'a gönderilmek üzere Uri nesnesi oluşturuyorum
var req = openid.CreateRequest("https://www.google.com/accounts/o8/id", b.Uri, b.Uri);
//birtane istek nesnesi oluşturup parametre olarakda daha önce oluşturduğum Uri nesnesini veriyorum
req.RedirectToProvider();
//google'a gönderiyorum
}  
 Burada sayfamıza using DotNetOpenAuth.OpenId.RelyingParty; referansını vermeyi unutmuyoruz. Google'a bilgileri gönderdikten sonra gelecek olacak cevabıda aynı sayfanın Page Load olayında yakalayacağız.
protected void Page_Load(object senderEventArgs e)
{
OpenIdRelyingParty rp = new OpenIdRelyingParty();
var r = rp.GetResponse();
if (r != null)
{
switch (r.Status)
{
case AuthenticationStatus.Authenticated:
Session["GoogleToken"] = r.ClaimedIdentifier.ToString();
//kişinin bilgilerini sorgulayabileceğimiz google'in bize vermiş olduğu geçici Token
Response.Redirect("giris.aspx"); //login başarılı ise yönlendirilecek sayfa
break;
case AuthenticationStatus.Canceled:
//kişi login sayfasında iptala basmışsa gösterilecek uyarı
lblUyari.Text = "İptal edildi.";
break;
case AuthenticationStatus.Failed:
//kişi yanlış kullanıcı adı veya şifre girmişse gösterilecek uyarı
lblUyari.Text = "Login başarısız.";
break;
}
}
}
 Burada dikkat edecek olursak eğer kişi login olmuş ise google'in bize vermiş olduğu geçici Token'ı bir session'a atıyoruz daha sonrada kişiyigiris.aspx sayfasına yönlendiriyoruz. Eğer kişi login olamamışsa iptal etmiş veya kullanıcı adı,şifre gibi bilgileri yanlış ise sayfaya koyduğumuz labelnesnesinde uyarımızı veriyoruz.
Şimdi ise giris.aspx sayfasını yapalım bu sayfada kişinin istediğimiz bilgilerini google'dan isteyebileceğiz çünkü elimizde google'ın bize vermiş olduğuToken var.
Öncelikle giris.aspx sayfama 3 adet label ekliyorum. Bunlara login olan kişinin e-posta adresini,adını ve soyadını yazdıracağım.
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblEPosta" runat="server"></asp:Label>
<asp:Label ID="lblAdi" runat="server"></asp:Label>
<asp:Label ID="lblSoyadi" runat="server"></asp:Label>
</div>
</form>
</body>
Hemen giris.aspx sayfasının Page Load olayını yazıyoruz.
protected void Page_Load(object senderEventArgs e)
{
OpenIdRelyingParty openid = new OpenIdRelyingParty();
var response = openid.GetResponse();

if (response == null)
{
//google'dan kişinin bilgilerini istemek için istek nesnesi oluşturuyoruz ve
//parametre olarakta daha önceden almış olduğumuz token'ı veriyoruz
var request = openid.CreateRequest(Session["GoogleToken"].ToString());

var fetchRequest = new FetchRequest();
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.First);
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.Last);
//oluşturduğumuz istek nesnesine kişinin hangi bilgilerini istediğmizi ekliyoruz.
request.AddExtension(fetchRequest);

request.RedirectToProvider();
//isteği google'a iletiyoruz
}
else
{
var fetchResponse = response.GetExtension<FetchResponse>();
// Dönen cevabı session'da saklıyoruz
Session["FetchResponse"] = fetchResponse;
var response1 = Session["FetchResponse"as FetchResponse;
//eğer cevap yoksa sayfa yüklenmiyor
if (response1 == null)
return;

// Gelen cevapları ekrandaki label'lara yazıyoruz.
lblEPosta.Text = response1.GetAttributeValue(WellKnownAttributes.Contact.Email?? "Boş";
lblAdi.Text = response1.GetAttributeValue(WellKnownAttributes.Name.First?? "Boş";
lblSoyadi.Text = response1.GetAttributeValue(WellKnownAttributes.Name.Last?? "Boş";
}
}
  Page load olayında google'dan kişinin bilgilerini istiyoruz elimizdeki GoogleToken'ı kullanarak ve gelen cevabıda label nesneleri ile gösteriyoruz.
Eğer işlemlerimizi doğru yaptıysak tarayıcımızda e-posta adresimiz,adımız ve soyadımızın yazması gerekiyor.
    
 Umarım faydalı olmuştur. Bir sonraki makalede görüşmek dileğiyle.
Not:Facebook login servisini kullanan örnek bir site www.secretcv.com, Google login servisini kullanan örnek bir site www.enerjik.com.tr  incelemekte fayda olabilir.
ibrahim BAYIR 
www.ibrahimbayir.com.tr

DotNetOpenAuth

Örnek Uygulama
Alıntıdır

Hiç yorum yok:

Yorum Gönder