Merhaba arkadaşlar,
Bugün dersimizde sizlere Firebase kütüphanesi kullanarak Firebase Authentication işleminin nasıl yapılacağını anlatacağım. Firebase ile ilgili realtime database kullanımını bu dersimizde ayrıntılı bir şekilde anlatmıştım. Şimdi ( Kimlik Doğrulama ) adımlarını incelemeye başlayalım.
Öncelikle Android Studio da yeni bir proje oluşturuyoruz ve Firebase Authentication ile ilgili işlemlerini gerçekleştirebilmemiz için projemizi console firebase tanıtıyoruz. Kimlik doğrulama ile ilgili gerekli fonksiyonları kullanabilmemiz için Android Studio da Tools->Firebase->Authentication kısmını açıyoruz. Email and password authentication seçeneğini tıkladıktan sonra karşımıza çıkan adımları tek tek uyguluyoruz.
Firebase Authentication Ayarları
1-) Connect your app to Firebase
2-) Add Firebase Authentication to your app
Bu adımları sırayla uyguladıktan sonra seçeneklerin yeşil olduğunu göreceksiniz böylece hem uygulamamızı firebase tanıtmış olduk hem de authentication ile ilgili kodları ve gerekli dosyaları projemize otomatik olarak import etmiş olduk. ( build.gradle incelediğinizde firebase auth compile olarak geldiğini göreceksiniz. )
build.gradle
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "26.0.0" defaultConfig { applicationId "com.mobilhanem.androidfirebaseauthproject" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.google.firebase:firebase-auth:10.0.1' testCompile 'junit:junit:4.12' } apply plugin: 'com.google.gms.google-services'
Firebase authentication için bir çok kimlik doğrulama yönetimi geliştiricilere sunmaktadır (Email/Password , Phone, Google, Facebook, Twitter, Github ve Anonymous ) ben bu uygulamamda E posta ve parola ile girişi kullanacağım ; uygulama içinde kullanabilmemiz içinde bu yöntemi aktif hale getirmemiz gerekiyor. Aşağıdaki ekran görüntüsünde gördüğünüz gibi bu linkten ilgili projemizi seçip Authentication->SIGN-IN Method->Email/Password statusu Enabled yapıyoruz.
Şimdi gelelim kodlamaya ; uygulama ilk açılışında çalışacak olan MainActivity sınıfımız aşağıdadır. Kaynak kodları incelersek eğer MainActivity çalıştığında eğer authenticate olmuş bir kullanıcı var ise ProfileActivity sayfasını açtırıyoruz eğer yok ise karşımıza gelen ekranda login butonu ve altında da register sayfasına yönlendirdiğimiz bir textview olduğunu göreceksiniz. signInWithEmailAndPassword methodu kullanıcıdan email adresi ile parola alıyor ve login isteğinde bulunuyor. Daha sonra addOnCompleteListener ile de işlemin başarılı olup olmadığını kontrol ediyoruz.
MainActivity.java
package com.mobilhanem.androidfirebaseauthproject; import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; public class MainActivity extends AppCompatActivity { private EditText editTextUserName; private EditText editTextUserPassword; private Button buttonLogin; private TextView txtRegister; private FirebaseAuth mAuth; private FirebaseUser firebaseUser; private String userName; private String userPassword; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextUserName = (EditText)findViewById(R.id.editTextUserName); editTextUserPassword = (EditText)findViewById(R.id.editTextUserPassword); buttonLogin = (Button) findViewById(R.id.buttonLogin); txtRegister = (TextView) findViewById(R.id.txtRegister); mAuth = FirebaseAuth.getInstance(); firebaseUser = mAuth.getCurrentUser(); // authenticated user if(firebaseUser != null){ // check user session Intent i = new Intent(MainActivity.this,ProfileActivity.class); startActivity(i); finish(); } buttonLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { userName = editTextUserName.getText().toString(); userPassword = editTextUserPassword.getText().toString(); if(userName.isEmpty() || userPassword.isEmpty()){ Toast.makeText(getApplicationContext(),"Lütfen gerekli alanları doldurunuz!",Toast.LENGTH_SHORT).show(); }else{ loginFunc(); } } }); txtRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,RegisterActivity.class); startActivity(intent); } }); } private void loginFunc() { mAuth.signInWithEmailAndPassword(userName,userPassword).addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if(task.isSuccessful()){ Intent i = new Intent(MainActivity.this,ProfileActivity.class); startActivity(i); finish(); } else{ // hata Toast.makeText(getApplicationContext(),task.getException().getMessage(),Toast.LENGTH_SHORT).show(); } } }); } }
Eğer kullanıcı authenticate olmadıysa yani sisteme kayıtlı değilse kimlik doğrulamasını sağlamak için üye ol kısmından RegisterActivity sayfasına yönleniyor. Kodları incelediğimizde; createUserWithEmailAndPassword methodu kullanıcı adını ( kullanıcı email adresi ) ile parolasını alıyor yine addOnCompleteListener ile de işlemin başarılı olup olmadığını kontrol ediyoruz eğer register işleminde sorun yok ise kullanıcıyı ProfileActivity sayfasına yönlendiriyoruz. ( Kaydolma işleminde Firebase tarafından belirlenen bazı kurallar var örneğin parola uzunluğu 6 haneden daha kısa olamaz ayrıca girdiğiniz e-posta adresi kontrolünü de firebase sağlıyor eğer e posta formatından farklı bir değer ile sisteme register olmaya çalışırsanız yine hata alacaksınız. Eğer daha önceden üye olunan bir e-posta adresi ile üye olmaya çalışırsanız da yine hata alacaksınız. )
RegisterActivity.java
package com.mobilhanem.androidfirebaseauthproject; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; public class RegisterActivity extends AppCompatActivity { private EditText registerUserName; private EditText registerPassword; private Button buttonRegister; private FirebaseAuth mAuth; private String userName; private String userPassword; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); registerUserName = (EditText)findViewById(R.id.registerUserName); registerPassword = (EditText)findViewById(R.id.registerPassword); buttonRegister = (Button) findViewById(R.id.buttonRegister); mAuth = FirebaseAuth.getInstance(); // register buton tiklaninca buttonRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { userName = registerUserName.getText().toString(); userPassword = registerPassword.getText().toString(); if(userName.isEmpty() || userPassword.isEmpty()){ Toast.makeText(getApplicationContext(),"Lütfen gerekli alanları doldurunuz!",Toast.LENGTH_SHORT).show(); }else{ registerFunc(); } } }); } private void registerFunc() { mAuth.createUserWithEmailAndPassword(userName,userPassword) .addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(Task<AuthResult> task) { if(task.isSuccessful()){ Intent i = new Intent(RegisterActivity.this,ProfileActivity.class); startActivity(i); finish(); } else{ Toast.makeText(getApplicationContext(),task.getException().getMessage(),Toast.LENGTH_SHORT).show(); } } }); } }
Uygulamamıza üye olduğumuzda veya giriş yaptığımızda karşımıza ProfileActivity sayfası gelmektedir. Buradaki kodları incelersek eğer ; FirebaseAuth instance üzerinden güncel kullanıcıya ulaşıyoruz ve firebase user ın bize sağlamış olduğu bazı methodlar var onları uygulamamızda kullanıyoruz örneğin; updatePassword methodu ile kullanıcının parolasını, updateEmail methodu ile de kullanıcının e-posta adresini güncelleyebiliyoruz. Çıkış Yap butonuna basmadığımız sürece veya uygulamayı silmediğimiz sürece kullanıcı session devamlı açık kalacak ve bir kez giriş yaptıktan sonra bir daha kullanıcı adı ve parola adımlarını sormayacaktır. Kullanıcının auth durumunda herhangi bir değişiklik olduğu zaman dinleyici methodumuz FirebaseAuth.AuthStateListener değişikliği yakalayıp gerekli işlemleri yapacaktır. Örneğin kullanıcı e-posta adresini değiştirdi veya parolasını değiştirdi bu durumda kullanıcınında kimlik doğrulaması değişmiş oldu ve bizde direk olarak uygulamadan çıkış yaptırıyoruz.
ProfileActivity.java
package com.mobilhanem.androidfirebaseauthproject; import android.content.DialogInterface; import android.support.annotation.NonNull; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.InputType; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; public class ProfileActivity extends AppCompatActivity { private TextView userNameTxt; private Button changeEmailBttn; private Button changePasswordBttn; private Button signOutBttn; private FirebaseAuth auth; private FirebaseUser firebaseUser; private FirebaseAuth.AuthStateListener authListener; private String str; @Override public void onBackPressed() { } @Override public void onStart() { super.onStart(); auth.addAuthStateListener(authListener); } @Override public void onStop() { super.onStop(); if (authListener != null) { auth.removeAuthStateListener(authListener); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_profile); auth = FirebaseAuth.getInstance(); firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); // get current user authListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user == null) { // when auth state change finish(); } } }; userNameTxt = (TextView)findViewById(R.id.userNameTxt); changeEmailBttn = (Button) findViewById(R.id.changeEmailBttn); changePasswordBttn = (Button)findViewById(R.id.changePasswordBttn); signOutBttn = (Button)findViewById(R.id.signOutBttn); userNameTxt.setText("Kullanıcı Adı:" + " " + auth.getCurrentUser().getEmail()); signOutBttn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { signOutFunc(); // sign out } }); changeEmailBttn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { str = "Lütfen yeni e-posta adresini giriniz."; changeEmailOrPasswordFunc(str,true); } }); changePasswordBttn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { str = "Lütfen yeni şifreyi giriniz."; changeEmailOrPasswordFunc(str,false); } }); } private void signOutFunc() { auth.signOut(); } private void changeEmailOrPasswordFunc(String title, final boolean option) { AlertDialog.Builder builder = new AlertDialog.Builder( ProfileActivity.this); final EditText edit = new EditText(ProfileActivity.this); builder.setPositiveButton(getString(R.string.change_txt), null); builder.setNegativeButton(getString(R.string.close_txt), null); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); edit.setLayoutParams(lp); if(!option){ // password type edit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); } builder.setTitle(title); builder.setView(edit); final AlertDialog mAlertDialog = builder.create(); mAlertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { Button b = mAlertDialog.getButton(AlertDialog.BUTTON_POSITIVE); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(edit.getText().toString().isEmpty()){ edit.setError("Lütfen ilgili alanı doldurunuz!"); }else{ if(option){ // email change changeEmail(); }else{ // password change changePassword(); } } } }); } private void changePassword() { firebaseUser.updatePassword(edit.getText().toString()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(ProfileActivity.this, "Şifre değiştirildi.", Toast.LENGTH_LONG).show(); signOutFunc(); } else { edit.setText(""); Toast.makeText(ProfileActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show(); } } }); } private void changeEmail() { firebaseUser.updateEmail(edit.getText().toString().trim()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(ProfileActivity.this, "E-posta değiştirildi.", Toast.LENGTH_LONG).show(); signOutFunc(); } else { edit.setText(""); Toast.makeText(ProfileActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show(); } } }); } }); mAlertDialog.show(); } }
Evet arkadaşlar gördüğünüz gibi Android de Firebase Authentication işlemleri bu kadar kolay sizlere örnek olması açısından e-posta/parola kullanarak nasıl oturum açılır , nasıl sisteme üye olunur, parola ve e-posta nasıl değiştirilir gibi adımları gerçekleştirdik. Konuyu daha iyi anlamak için kaynak kodu indirip çalıştırmanız faydalı olacaktır. Bir sonraki dersimizde Firebase Realtime Database ile Firebase Authentication işlemlerini birleştirerek bir chat uygulaması örneği yapacağım.
Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.
Mobilhanem.com üzerinden anlattığımız mobil uygulama geliştirme derslerine devam edeceğiz. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitemizden de sorabilirsiniz.
Bir dahaki dersimizde görüşmek dileğiyle..