Firebase Google Giriş Entegrasyonlu Kotlin Uygulaması

 

Firebase Google Giriş Entegrasyonlu Kotlin Uygulaması

Aşağıda Firebase Authentication kullanarak Google ile giriş yapmayı sağlayan bir Kotlin uygulaması örneği bulacaksınız. Bu örnek, temel bir giriş arayüzü ve Google giriş işlevselliği içerir.

1. Ön Hazırlıklar

build.gradle (Module: app) Dosyasına Eklemeler

gradle
Copy
Download
dependencies {
    // Firebase Auth ve Google Sign-In
    implementation ("com.google.firebase:firebase-auth-ktx:22.1.2")
   
    
 
}

2. activity_login.xml (Giriş Arayüzü)

xml
Copy
Download
Run
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp"
    tools:context=".LoginActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Google ile Giriş Yap"
        android:textSize="24sp"
        android:textStyle="bold"
        android:layout_marginBottom="32dp"/>

    <com.google.android.gms.common.SignInButton
        android:id="@+id/signInButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"/>

    <TextView
        android:id="@+id/userInfoTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:layout_marginTop="16dp"
        android:visibility="gone"/>

    <Button
        android:id="@+id/signOutButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Çıkış Yap"
        android:layout_marginTop="16dp"
        android:visibility="gone"/>

</LinearLayout>

3. LoginActivity.kt

kotlin
Copy
Download
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.SignInButton
import com.google.android.gms.common.api.ApiException
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.GoogleAuthProvider
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class LoginActivity : AppCompatActivity() {

    private lateinit var auth: FirebaseAuth
    private lateinit var googleSignInClient: GoogleSignInClient
    private lateinit var signInButton: SignInButton
    private lateinit var signOutButton: Button
    private lateinit var userInfoTextView: TextView

    companion object {
        private const val RC_SIGN_IN = 9001
        private const val TAG = "GoogleActivity"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        // View'leri bağlama
        signInButton = findViewById(R.id.signInButton)
        signOutButton = findViewById(R.id.signOutButton)
        userInfoTextView = findViewById(R.id.userInfoTextView)

        // Firebase Auth başlatma
        auth = Firebase.auth

        // Google Sign-In ayarları
        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id)) // strings.xml'de tanımlı olmalı
            .requestEmail()
            .build()

        googleSignInClient = GoogleSignIn.getClient(this, gso)

        // Giriş butonu tıklama olayı
        signInButton.setOnClickListener {
            signIn()
        }

        // Çıkış butonu tıklama olayı
        signOutButton.setOnClickListener {
            signOut()
        }
    }

    override fun onStart() {
        super.onStart()
        // Kullanıcı oturum açık mı kontrol et
        val currentUser = auth.currentUser
        updateUI(currentUser)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        // Google giriş sonucu
        if (requestCode == RC_SIGN_IN) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                // Google giriş başarılı, Firebase ile yetkilendir
                val account = task.getResult(ApiException::class.java)!!
                Log.d(TAG, "firebaseAuthWithGoogle:" + account.id)
                firebaseAuthWithGoogle(account.idToken!!)
            } catch (e: ApiException) {
                // Google giriş başarısız
                Log.w(TAG, "Google giriş başarısız", e)
                updateUI(null)
            }
        }
    }

    private fun firebaseAuthWithGoogle(idToken: String) {
        val credential = GoogleAuthProvider.getCredential(idToken, null)
        auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Giriş başarılı
                    Log.d(TAG, "signInWithCredential:success")
                    val user = auth.currentUser
                    updateUI(user)
                } else {
                    // Giriş başarısız
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    Toast.makeText(this, "Kimlik doğrulama başarısız.", Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }
            }
    }

    private fun signIn() {
        val signInIntent = googleSignInClient.signInIntent
        startActivityForResult(signInIntent, RC_SIGN_IN)
    }

    private fun signOut() {
        // Firebase'den çıkış yap
        auth.signOut()

        // Google'dan çıkış yap
        googleSignInClient.signOut().addOnCompleteListener(this) {
            updateUI(null)
            Toast.makeText(this, "Başarıyla çıkış yapıldı", Toast.LENGTH_SHORT).show()
        }
    }

    private fun updateUI(user: Any?) {
        if (user != null) {
            // Kullanıcı giriş yapmış
            signInButton.visibility = android.view.View.GONE
            signOutButton.visibility = android.view.View.VISIBLE
            userInfoTextView.visibility = android.view.View.VISIBLE

            val currentUser = auth.currentUser
            currentUser?.let {
                val userInfo = "Hoş geldiniz!\n\n" +
                        "Ad: ${it.displayName}\n" +
                        "Email: ${it.email}\n" +
                        "UID: ${it.uid}"

                userInfoTextView.text = userInfo
            }
        } else {
            // Kullanıcı giriş yapmamış
            signInButton.visibility = android.view.View.VISIBLE
            signOutButton.visibility = android.view.View.GONE
            userInfoTextView.visibility = android.view.View.GONE
            userInfoTextView.text = ""
        }
    }
}

4. strings.xml Dosyasına Eklemeler

xml
Copy
Download
Run
<resources>
    <!-- Firebase Google Sign-In için gerekli -->
    <string name="default_web_client_id">YOUR_WEB_CLIENT_ID</string>
</resources>

5. AndroidManifest.xml Eklentileri

xml
Copy
Download
Run
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    
    <application ...>
        <activity android:name=".LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

6. Firebase Console Ayarları

  1. Firebase Console'da projenizi açın

  2. "Authentication" sekmesine gidin

  3. "Sign-in method" tabına tıklayın

  4. Google'ı etkinleştirin ve kaydedin

  5. "Authorized domains" kısmına uygulamanızın domainlerini ekleyin

Önemli Notlar:

  1. default_web_client_id değerini Firebase Console'dan almalısınız. Bu değer google-services.json dosyasında da bulunur.

  2. Uygulamanızın SHA-1 parmak izini Firebase proje ayarlarına eklemelisiniz. Bunu Android Studio'nun Gradle panelinden (Gradle > [proje adı] > Tasks > android > signingReport) veya aşağıdaki komutla alabilirsiniz:

    Copy
    Download
    keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
  3. Google Sign-In butonunu özelleştirmek isterseniz, SignInButton yerine kendi buton tasarımınızı kullanabilir ve tıklama olayını aynı şekilde yönetebilirsiniz.

Bu örnek, kullanıcıların Google hesaplarıyla giriş yapmasını sağlar ve temel kullanıcı bilgilerini gösterir. Uygulamanızın ihtiyaçlarına göre bu yapıyı genişletebilirsiniz.


Yorum Gönder

0 Yorumlar