Yazılım Mimarileri ve Tasarım Desenleri Üzerine

Asp.NET Core Identity – Google Login

Merhaba,

Bir önceki Asp.NET Core Identity – Facebook Login başlıklı makalemizde Asp.NET Core Identity mimarisi ile Facebook üzerinden login işlemlerinin nasıl yapıldığını ele almıştık. Bu içeriğimizde ise yine benzer mahiyette ilgili mimari ile Google login işlemlerini ele alacağız…

Herşeyden önce şunu bilmenizi isterim ki, Asp.NET Core Identity mimarisinde “Üçüncü Taraf Kimlik Doğrulama” yapılanmaları tüm sosyal ağlar için birebir aynı olmak kaydıyla geçerlidir. Yani Google login yapabilmek için Facebook, Twitter vs. loginler de ne yaptıysak birebir aynısını yapmamız gerekmektedir.

Bu sebepten dolayı ben bu ve bundan sonraki tüm üçüncü taraf kimlik doğrulama makalelerimde yukarıda adresini verdiğim Facebook login makalesinde oluşturduğum proje üzerinden anlatım sergileyeceğim. Neticede genel çatıyla birlikte temeli anlamlandırdığınız taktirde istediğiniz herhangi bir sağlayıcı tarafından kimlik doğrulama özelliğini uygulamanıza kazandırmanızın ne kadar basit olduğuna sizde şahit olacaksınız.

Google Developer’dan Uygulama Yapılandırma

İlk olarak tüm sağlayıcılarda olduğu gibi karşı tarafta uygulamamızı temsil edecek bir proje yapılandırmamız gerekmektedir. Bunun için https://developers.google.com/identity/sign-in/web/sign-in#before_you_begin adresine tıklayarak uygulamanıza Google Authentication özelliğini entegre edecek bir yapılandırmada bulunabilirsiniz.

İlgili bağlantıya tıkladıktan sonra açılan sayfa üzerinden aşağıdaki önergeleri adım adım uygulayınız;

Tüm adımları tamamladıktan sonra artık Google uygulaması oluşturulmuş ve login işlemleri için hali hazır hale getirilmiş bulunmaktadır.

Şimdi ilk olarak yapmanız gereken Google authentication yapılanmasını kullanabilmek için Microsoft.AspNetCore.Authentication.Google kütüphanesini projenize yükleyiniz.

Ardından “Startup” dosyasındaki “ConfigureServices” metodu içerisinde aşağıdaki çalışmayı gerçekleştiriniz.

    public class Startup
    {
        public IConfiguration Configuration { get; set; }
        .
        .
        .
        public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            .

            services.AddAuthentication()
                .AddFacebook(x =>
                {
                    x.AppId = Configuration["FacebookAppId"];
                    x.AppSecret = Configuration["FacebookAppSecret"];
                    x.CallbackPath = new PathString("/User/Hata");
                })
                .AddGoogle(x =>
                {
                    x.ClientId = Configuration["GoogleClientId"];
                    x.ClientSecret = Configuration["GoogleClientSecret"];
                });

            .
            .
        }
    }

Yukarıdaki kod bloğunda 20 ile 24. satırlar arasına göz atarsanız eğer “AddGoogle” fonksiyonu ile uygulamamıza Google Authentication eklenmiştir. Böylece ilgili uygulamada Facebook olduğu gibi Google login işlemide gerçekleştirilebilir vaziyettedir.

Sırada Google login talebinin sorumluluğunu üstlenecek olan action metodun geliştirilmesi vardır. Bunun için “User(Controller).cs” dosyasında “GoogleLogin” isimli bir action oluşturunuz ve içeriğini aşağıdaki gibi doldurunuz.

        public IActionResult GoogleLogin(string ReturnUrl)
        {
            string redirectUrl = Url.Action("ExternalResponse", "User", new { ReturnUrl = ReturnUrl });
            //Google'a yapılan Login talebi neticesinde kullanıcıyı yönlendirmesini istediğimiz url'i oluşturuyoruz.
            AuthenticationProperties properties = _signInManager.ConfigureExternalAuthenticationProperties("Google", redirectUrl);
            //Bağlantı kurulacak harici platformun hangisi olduğunu belirtiyor ve bağlantı özelliklerini elde ediyoruz.
            return new ChallengeResult("Google", properties);
            //ChallengeResult; kimlik doğrulamak için gerekli olan tüm özellikleri kapsayan AuthenticationProperties nesnesini alır ve ayarlar.
        }

Yukarıdaki kod bloğuna göz atarsanız eğer 5. satırdaki hangi platforma login talebinde bulunulduğunu belirttiğimiz “ConfigureExternalAuthenticationProperties” metodunun birinci parametresine verilen “Google” değerinin birebir aynı olması gerektiğine özen gösteriniz.

Bu işlemden sonra artık son olarak Google login talebi neticesinde dönen sonucun işlenmesi ve gerekli giriş yahut kayıt işlemlerinin yapılması gerekmektedir. Bunun için yukarıdaki “GoogleLogin” metodunda oluşturduğumuz redirect url’de ki “ExternalResponse” isimli metodunu aşağıdaki gibi inşa ediniz.

        public async Task<IActionResult> ExternalResponse(string ReturnUrl = "/")
        {
            ExternalLoginInfo loginInfo = await _signInManager.GetExternalLoginInfoAsync();
            //Kullanıcıyla ilgili dış kaynaktan gelen tüm bilgileri taşıyan nesnedir.
            //Bu nesnesnin 'LoginProvider' propertysinin değerine göz atarsanız eğer hangi dış kaynaktan geliniyorsa onun bilgisinin yazdığını göreceksiniz.
            if (loginInfo == null)
                return RedirectToAction("Login");
            else
            {
                Microsoft.AspNetCore.Identity.SignInResult loginResult = await _signInManager.ExternalLoginSignInAsync(loginInfo.LoginProvider, loginInfo.ProviderKey, true);
                //Giriş yapıyoruz.
                if (loginResult.Succeeded)
                    return Redirect(ReturnUrl);
                else
                {
                    //Eğer ki akış bu bloğa girerse ilgili kullanıcı uygulamamıza kayıt olmadığından dolayı girişi başarısız demektir.
                    //O halde kayıt işlemini yapıp, ardından giriş yaptırmamız gerekmektedir.
                    AppUser user = new AppUser
                    {
                        Email = loginInfo.Principal.FindFirst(ClaimTypes.Email).Value,
                        UserName = loginInfo.Principal.FindFirst(ClaimTypes.Email).Value
                    };
                    //Dış kaynaktan gelen Claimleri uygun eşlendikleri propertylere atıyoruz.
                    IdentityResult createResult = await _userManager.CreateAsync(user);
                    //Kullanıcı kaydını yapıyoruz.
                    if (createResult.Succeeded)
                    {
                        //Eğer kayıt başarılıysa ilgili kullanıcı bilgilerini AspNetUserLogins tablosuna kaydetmemiz gerekmektedir ki
                        //bir sonraki dış kaynak login talebinde Identity mimarisi ilgili kullanıcının hangi dış kaynaktan geldiğini anlayabilsin.
                        IdentityResult addLoginResult = await _userManager.AddLoginAsync(user, loginInfo);
                        //Kullanıcı bilgileri dış kaynaktan gelen bilgileriyle AspNetUserLogins tablosunda eşleştirilmek suretiyle kaydedilmiştir.
                        if (addLoginResult.Succeeded)
                        {
                            await _signInManager.SignInAsync(user, true);
                            //await _signInManager.ExternalLoginSignInAsync(loginInfo.LoginProvider, loginInfo.ProviderKey, true);
                            return Redirect(ReturnUrl);
                        }
                    }

                }
            }
            return Redirect(ReturnUrl);
        }

Derleme, Çalıştırma, Test Etme

Şimdi sıra geliştirilen uygulamayı test etmeye gelmiştir. Bunun için uygulamayı derleyip, çalıştırdığınız vakit aşağıdaki ekran görüntüsünde olduğu gibi Google login yapılanmasını test ettiğiniz taktirde kusursuz çalıştığını görebilirsiniz.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek çalışma projesini indirebilmek için buraya tıklayınız.

Mobil sürümden çık