Google Hesabı ile Login İşlemleri
Merhabalar..
Bir kaç ay aradan sonra, yine ben geldim. 🙂
Geldim ve artık gitme gibi bi niyetim yok. (Umarım gitmem)
Neyse..
Bu makalede http://umutonur.com/ceviri-google-hesabi-ile-login-olma/ adresinde yapmış olduğum çevirideki olayları ayrıntılarıyla anlatmaya çalışacağım..
Öncelikle boş bir Android Projesi oluşturup bu projemizi Firebase uygulamamıza bağlayalım..
(Android Studio ile bağlamak için : http://umutonur.com/android-studio-2-2-ve-yenilenen-firebase-kullanimi/)
Projemizi Android Studio ile Firebase uygulamamıza bağladıktan sonra Firebase Assistant penceresine gelerek;
– Authentication > Email and Password Authentication kısmındaki Add Firebase Authentication to your app butonuna tıklayarak login olabilmek için gerekli bağımlılıkları (dependencies) projemize ekleyelim..
Tüm işlemler başarılı bir şekilde gerçekleşirse Firebase Assistant görünümü şu şekilde olacaktır.
Gerekli bağımlılıkları projemize entegre ettikten sonra küçük bir işlem daha kalıyor.
build.gradle (app) dosyasına geldiğimizde bağımlılıkların şu şekilde ayarlanmış olduğunu göreceksiniz.
küçük dikdörgen içinde olan
1 |
compile 'com.google.firebase:firebase-auth:10.0.1' |
kısmını
1 2 |
compile 'com.google.firebase:firebase-auth:10.0.1' compile 'com.google.android.gms:play-services-auth:10.0.1' |
şeklinde düzenleyip “Sync Now” yaparak entegrasyon işlemlerini tamamlıyoruz. Burada 10.0.1 versionu benim kullandığım Android SDK‘de yüklü olan Google Play Services‘in versiyonudur.
Yani Firebase uygulamanızı bağladığınızda eklenen firebase-auth ‘un versiyonu ne ise, play-services-auth ‘un versiyonununda aynı olması sizin açınızdan hayırlı olacaktır 🙂
ÖNEMLİ NOT : Uygulamanızın çalışabilmesi için Google Play Services‘in yüklü olması gerekmektedir. Eğer yüklü değilse SDK Manager‘dan yüklemelisiniz.
Burada eklemiş olduğumuz;
“firebase-auth” paketi Firebase üzerinde yetkilendirme işlemleri için,
“play-services-auth” paketi ise Google hesabımızla oturum açabilmemiz için gerekli sınıfları barındırmaktadır.
Ekleme-çıkarma-entegre etme-ırt-zırt işlemleri hallettikten sonra, nihayet kodlara geçiyoruz..
Sign In ve Sign Out işlemleri için activity_main.xml ‘e 2 adet buton ekleyelim..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<Button android:id="@+id/signIn_button" android:layout_width="0dp" android:layout_height="48dp" android:text="Sign In" tools:layout_editor_absoluteY="231dp" tools:layout_editor_absoluteX="148dp" /> <Button android:id="@+id/signOut_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="Sign Out" app:layout_constraintTop_toBottomOf="@+id/signIn_button" tools:layout_editor_absoluteX="148dp" /> |
Arayüz Tasarımı :
Arayüzü’de hallettiğimize göre asıl işlemlere geçebiliriz..
Öncelikle; Firebase üzerindeki yetkilendirme işlemlerini yönetebilmek için bir FirebaseAuth nesnesine, bu işlemlerin sonuçlarını takip edebilmek için de FirebaseAuth sınıfı içerisindeki AuthStateListener dinleyicine ihtiyaç duyarız.
Özetle; asıl sign in veya sign out işlemi FirebaseAuth nesnesi üzerinden yapılır. Bu işlemler gerçekleştiğinde ise AuthStateListener dinleyicisi tetiklenir ve bize yapılan işlem hakkında bilgi verir.
Bildiğiniz üzere Firebase üzerinde yetkilendirme için çeşitli yöntemler mevcuttur. (Email & Şifre yöntemi, Facebook Hesabı ile yetkilendirme, Twitter Hesabıyla yetkilendirme gibi..) Google Hesabıyla yetkilendirme de bunlardan biridir. Firebase üzerindeki yetkilendirme işlemlerinin yönetildildiği FirebaseAuth sınıfı; hangi yöntemi seçersek seçelim, seçtiğimiz yönteme bağlı hesap ile bağlantı kurmak zorundadır.
Yani, biz Google Hesabıyla yetkilendirme yöntemini seçtiğimize göre; FirebaseAuth nesnesinin, Google Hesabımızla bağlantı kurması gerekir. Bu bağlantı işlemi de GoogleApiClient sınıfı aracılığıyla gerçekleştirilir.
Toparlayacak olursak;
FirebaseAuth sınıfı:
– AuthStateListener sayesinde yetkilendirme işlemlerini takip eder;
– GoogleApiClient sınıfı sayesinde de Login olabilmek için kullanacağımız Google Hesabımızla bağlantı kurar.
ve başlıyoruz… (hele şükür..)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener { private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; private GoogleApiClient mGoogleApiClient; private static final int RC_SIGN_IN = 67; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); |
Sırasıyla; FirebaseAuth nesnemizi (mAuth), AuthStateListener dinleyicimizi (mAuthStateListener) ve GoogleApiClient nesnemizi (mGoogleApiClient) tanımlıyoruz.
Farkettiğiniz üzere burada GoogleApiClient içerisindeki OnConnectionFailedListener dinleyicisini de dahil ettim. Bu dinleyici; adındanda anlaşılacağı gibi, Google Hesabı ile yapılan bağlantının başarısız olduğu durumlarda tetiklenir.
1 2 3 |
private static final int RC_SIGN_IN = 67; |
Bu kısımdaki 67 değeri isteğe bağlı bir değerdir. Siz istediğiniz değeri verebilirsiniz. Bununla ilgili ayrıntıya daha sonra gireceğim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { Log.e("Google Login", "Kullanıcı Artık Yetkili. Kullanıcı ID : " + user.getUid()); } else { Log.e("Google Login", "Kullanıcı Artık Yetkili Değil."); } } }; |
mAuth ve mAuthListener nesnesini oluşturuyoruz..
Uygulama içerisinde bir yetki durumu değiştiğinde dinleyici tetiklenir ve onAuthStateChanged() metodu çalışır. Burada yetki durumunun değişimi ile kastettiğim şey şudur:
Kullanıcı Google Hesabı ile (yada Facebook, Twitter v.s..) Login olduğunda; başlangıçta yetkisiz olan kullanıcı Firebase üzerinde yetkili hale gelmiş olmaktadır. Bu da yetki durumunun değişmesi anlamına gelmektedir. Aynı durum Logout olduğunda da gerçekleşir. Kullanıcı yetkili konumdan yetkisiz konuma geçmiş, yani yetki durumu değişmiş olmaktadır.
Kullanıcı, Firebase üzerinde yetkili (login) olduğunda FirebaseAuth nesnesi üzerinde yeni bir FirebaseUser nesnesi oluşturulur, ve kullanıcıya ait bilgiler bu nesneye aktarılır.
1 2 3 |
FirebaseUser user = firebaseAuth.getCurrentUser(); |
FirebaseAuth üzerinde bir FirebaseUser nesnesinin oluşturulmuş olması demek; programatik açıdan bu nesnenin var olduğunu yani bellekte yer kapladığı anlamına gelmektedir. Bu da FirebaseUser nesnesinin null olmadığını gösterir.
1 2 3 4 5 |
if (user != null) { Log.e("Google Login", "Oturum açıldı. Kullanıcı ID : " + user.getUid()); } |
Kullanıcı, Firebase üzerinde yetkisi sahibi olduğunda FirebaseUser nesnesi null olmadığına göre; aksi durumda da yani Kullanıcı Firebase üzerinde yetki sahibi değil ise FirebaseUser nesnesi oluşturulmamış olacak; dolayısıyla da nesne null değerine eşit olacaktır.
1 2 3 4 5 |
else { Log.e("Google Login", "Oturum Kapandı."); } |
FirebaseUser nesnesinin null değerine eşit olması; Kullanıcının yetkisiz olduğuna yani herhangi bir oturumun açık olmadığına işaret eder.
Buna göre; eğer kullanıcı açık olan oturumu kapattığı zaman sırasıyla:
– FirebaseUser nesnesinin değeri null olacak,
– onAuthStateChanged() metodu çalıştırılacak,
– FirebaseUser tipindeki user nesnesi getCurrentUser() metodundan referans alacak (yani user = null olacak),
– if (user != null) koşulu sağlamadığı için else { } kısmına geçecek,
– ve Google Login : Oturum Kapandı. yazısını Logcat’e basacaktır.
Sign In ve Sign Out butonlarına basıldığında gerçekleşecek işlemler :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
findViewById(R.id.signIn_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { signIn(); // Login işlemi } }); findViewById(R.id.signOut_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { signOut(); // Logout işlemi } }); |
GoogleApiClient işlemleri :
1 2 3 4 5 6 7 8 9 10 11 |
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); } |
bu kısımla ilgili ayrıntıya girmiyorum. Yoksa makaleyi bitiremeyeceğim 🙂
Şimdi gelelim signIn() ve signOut() metodlarına..
1 2 3 4 5 6 7 8 9 10 |
private void signOut() { mAuth.signOut(); Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(@NonNull Status status) { Log.e("Google Login","Google Hesabının Oturumu Kapatıldı. "+ status.getStatus()); } }); } |
mAuth.signOut() metodu Kullanıcının Firebase üzerindeki oturumunu kapatır, yani kullanıcıyı yetkisiz hale getirir.
GoogleSignInApi.signOut() metodu ise Firebase ile bağlamış olduğunuz Google Hesabının oturumunu kapatır. Bu Google oturumu kapatma işlemi sona erdiğinde onResult() metodu çalışır.
signIn() metoduna gelecek olursak
1 2 3 4 5 6 |
private void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, requestCode_SIGN_IN); } |
Ilk olarak; Google hesabıyla oturum açabilmek için signInIntent adında bir istek (Intent) oluşturuyoruz.
sonrasında istek kodu requestCode_SIGN_IN (yani 67) olan bu isteği sistemimize yolluyoruz. Burada ki startActivityForResult() metodundan biraz bahsetmek gerekirse; Türkçe’ye çevirdiğimiz zaman “Sonuç için aktivite başlat” anlamına gelen bu metod, sistemden herhangi bir aktivite başlatmasını ve aktivitenin sonucunu bize bildirmesini istediğimiz zamanlar kullanılır.
Olay şu şekildedir.
– Uygulamamız;Sistemde kayıtlı olan (Yada kaydedeceğimiz) Google hesabımız ile oturum açabilmek için GoogleSignInApi aracılığı ile bir istek oluşturur. Yani burada bizim aktivite olarak nitelendirdiğimiz şey aslında Google Hesap bilgilerini kullanarak oturum açabilmektir.
– Oluşturduğumuz bu isteği gerçekleştirebilmek, yani aktiviteyi başlatabilmek için startActivityForResult() metodunu çalıştırırız.
– startActivityForResult() metodu çalıştığında da Override ettiğimiz onActivityResult() metodu tetiklenir..
Eveeet.. şimdi geldik requestCode olayına… Uygulama içerisinde birden fazla aktivite başlatma isteği yapılabilir. Her başlatma isteği gerçekleştiğinde aynı onActivityResult() metodu tetiklenecektir.. Yapılan her aktivite isteğine göre gerçekleşecek işlemler farklı olacağından, bu işlemleri bir birinden ayırmak; yani hangi isteğe göre hangi işlemlerin yapılacağını belirlemek amacıyla yapılan her aktivity isteğinde bir istek kodu (requestCode) belirtilir..
Yani;
startActivityForResult(intent, 67) metodu çalıştığında
1 2 3 4 5 6 7 8 |
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 67) { // bu kısım çalışacaktır.. } } |
Kodlarımıza dönecek olursak;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == requestCode_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { Log.e("Google Login", "Oturum Açılıyor.."); GoogleSignInAccount account = result.getSignInAccount(); AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null); mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { Log.e("Google Login", "Oturum Google Hesabı ile açıldı."); } else { Log.e("Google Login", "Oturum Açılamadı.", task.getException()); Toast.makeText(MainActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } } }); } else { Log.e("Google Login", "Google hesabıyla oturum açma isteği yapılamadı."); } } } |
Bu kısmında ayrıntısına girmeyeceğim.. Logcat mesajlarından hangi bölümde ne gibi olayların oluştuğunu az çok anlayabilirsiniz.
Login işleminin akışını da yine Logcat mesajlarından takip edebilirsiniz.
Şimdilik sizlere anlatacaklarım bu kadar..
Kaynak kodlar için :
Bilgilendirmelerin için teşekkürler
anlatım acısından güzel örnek olmus aga:)