Android İçin Bağlı Hesapta Oturum Açma

Bağlı Hesap Oturum Açma özelliği, Google Hesaplarını hizmetinize bağlamış olan kullanıcılar için Google ile Tek Dokunuşla Oturum Açma özelliğini etkinleştirir. Bu sayede kullanıcılar, kullanıcı adlarını ve şifrelerini yeniden girmeden tek tıklamayla oturum açabilir ve daha iyi bir deneyim yaşayabilir. Ayrıca kullanıcıların hizmetinizde yinelenen hesaplar oluşturma olasılığını da azaltır.

Bağlı Hesapla Oturum Açma, Android için One Tap ile oturum açma akışının bir parçası olarak kullanılabilir. Bu, uygulamanızda Tek Dokunuş özelliği zaten etkinse ayrı bir kitaplığı içe aktarmanız gerekmediği anlamına gelir.

Bu dokümanda, Android uygulamanızı Bağlı Hesapla Oturum Açma'yı destekleyecek şekilde nasıl değiştireceğinizi öğreneceksiniz.

İşleyiş şekli

  1. One Tap ile oturum açma akışı sırasında bağlı hesapları göstermeyi etkinleştirirsiniz.
  2. Kullanıcı Google'da oturum açmışsa ve Google Hesabı'nı hizmetinizdeki hesabına bağlamışsa bağlı hesap için bir kimlik jetonu döndürülür.
  3. Kullanıcıya, bağlı hesabıyla hizmetinizde oturum açma seçeneği sunan bir One Tap ile oturum açma istemi gösterilir.
  4. Kullanıcı bağlı hesapla devam etmeyi seçerse kullanıcının kimlik jetonu uygulamanıza döndürülür. Giriş yapan kullanıcıyı tanımlamak için bu jetonu 2. adımda sunucunuza gönderilen jetonla eşleştirirsiniz.

Kurulum

Bağlı Hesap Oturum Açma özelliğini ayarlamak için geliştirme ortamınızı ve uygulamanızı yapılandırın.

Geliştirme ortamınızı ayarlama

Geliştirme ana makinenizde Google Play Hizmetleri'nin en son sürümünü edinin:

  1. Android SDK Manager'ı açın.
  1. SDK Tools (SDK Araçları) bölümünde Google Play Hizmetleri'ni bulun.

  2. Bu paketlerin durumu Yüklü değilse her ikisini de seçip Paketleri Yükle'yi tıklayın.

Uygulamanızı yapılandırma

  1. Proje düzeyindeki build.gradle dosyanızda, Google'ın Maven deposunu hem buildscript hem de allprojects bölümünüze ekleyin.

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. "Google ile bağla" API'sinin bağımlılıklarını, modülünüzün uygulama düzeyindeki Gradle dosyasına (genellikle app/build.gradle) ekleyin:

    dependencies {
      implementation 'com.google.android.gms:play-services-auth:21.3.0'
    }
    

Android uygulamanızı, Bağlı Hesap Oturum Açma özelliğini destekleyecek şekilde değiştirme

Bağlı Hesap Oturum Açma akışının sonunda uygulamanıza bir kimlik jetonu döndürülür. Kullanıcı oturum açmadan önce kimlik jetonunun bütünlüğü doğrulanmalıdır.

Aşağıdaki kod örneğinde, kimlik jetonunu alma ve doğrulama ve ardından kullanıcının oturumunu açma adımları ayrıntılı olarak açıklanmaktadır.

  1. Oturum açma intent'inin sonucunu almak için bir etkinlik oluşturun.

    Kotlin

      private val activityResultLauncher = registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
          try {
            val signInCredentials = Identity.signInClient(this)
                                    .signInCredentialFromIntent(result.data)
            // Review the Verify the integrity of the ID token section for
            // details on how to verify the ID token
            verifyIdToken(signInCredential.googleIdToken)
          } catch (e: ApiException) {
            Log.e(TAG, "Sign-in failed with error code:", e)
          }
        } else {
          Log.e(TAG, "Sign-in failed")
        }
      }
    

    Java

      private final ActivityResultLauncher<IntentSenderResult>
        activityResultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartIntentSenderForResult(),
        result -> {
        If (result.getResultCode() == RESULT_OK) {
            try {
              SignInCredential signInCredential = Identity.getSignInClient(this)
                             .getSignInCredentialFromIntent(result.getData());
              verifyIdToken(signInCredential.getGoogleIdToken());
            } catch (e: ApiException ) {
              Log.e(TAG, "Sign-in failed with error:", e)
            }
        } else {
            Log.e(TAG, "Sign-in failed")
        }
    });
    
  2. Oturum açma isteğini oluşturma

    Kotlin

    private val tokenRequestOptions =
    GoogleIdTokenRequestOptions.Builder()
      .supported(true)
      // Your server's client ID, not your Android client ID.
      .serverClientId(getString("your-server-client-id")
      .filterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                               scopes)
      .build()
    

    Java

     private final GoogleIdTokenRequestOptions tokenRequestOptions =
         GoogleIdTokenRequestOptions.Builder()
      .setSupported(true)
      .setServerClientId("your-service-client-id")
      .setFilterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                                scopes)
      .build()
    
  3. Oturum Açma Beklemede Olan intent'ini başlatma

    Kotlin

     Identity.signInClient(this)
        .beginSignIn(
      BeginSignInRequest.Builder()
        .googleIdTokenRequestOptions(tokenRequestOptions)
      .build())
        .addOnSuccessListener{result ->
          activityResultLauncher.launch(result.pendingIntent.intentSender)
      }
      .addOnFailureListener {e ->
        Log.e(TAG, "Sign-in failed because:", e)
      }
    

    Java

     Identity.getSignInClient(this)
      .beginSignIn(
        BeginSignInRequest.Builder()
          .setGoogleIdTokenRequestOptions(tokenRequestOptions)
          .build())
      .addOnSuccessListener(result -> {
        activityResultLauncher.launch(
            result.getPendingIntent().getIntentSender());
    })
    .addOnFailureListener(e -> {
      Log.e(TAG, "Sign-in failed because:", e);
    });
    

Kimlik jetonunun bütünlüğünü doğrulama

Google API istemci kitaplığı kullanma

Üretim ortamında Google kimlik jetonlarını doğrulamak için Java Google API istemci kitaplığının kullanılması önerilir.

Java

  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

  ...

  GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
      // Specify the CLIENT_ID of the app that accesses the backend:
      .setAudience(Collections.singletonList(CLIENT_ID))
      // Or, if multiple clients access the backend:
      //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
      .build();

  // (Receive idTokenString by HTTPS POST)

  GoogleIdToken idToken = verifier.verify(idTokenString);
  if (idToken != null) {
    Payload payload = idToken.getPayload();

    // Print user identifier
    String userId = payload.getSubject();
    System.out.println("User ID: " + userId);

    // Get profile information from payload
    String email = payload.getEmail();
    boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
    String name = (String) payload.get("name");
    String pictureUrl = (String) payload.get("picture");
    String locale = (String) payload.get("locale");
    String familyName = (String) payload.get("family_name");
    String givenName = (String) payload.get("given_name");

    // Use or store profile information
    // ...

  } else {
    System.out.println("Invalid ID token.");
  }

GoogleIdTokenVerifier.verify() yöntemi; JWT imzasını, aud hak talebini, iss hak talebini ve exp hak talebini doğrular.

Kimlik jetonunun bir Google Workspace veya Cloud kuruluş hesabını temsil ettiğini doğrulamanız gerekiyorsa hd hak talebini, Payload.getHostedDomain() yönteminin döndürdüğü alan adını kontrol ederek doğrulayabilirsiniz.