Bağlı Hesapta Oturum Açma özelliği, kullanıcılar için Google ile One Tap ile Oturum Açma'yı etkinleştirir. hizmetinizle bağlantılı olan bir e-posta alırsınız. Bu sayede kullanıcılar, kullanıcı adlarını ve şifrelerini yeniden girmek zorunda kalmadan tek tıklamayla oturum açabilir. Aynı zamanda kullanıcıların hizmetinizde yinelenen hesaplar.
Bağlı Hesapta Oturum Açma özelliği, şu hizmetler için One Tap ile Oturum Açma akışının bir parçası olarak sunulur: Android Bu, uygulamanız için ayrı bir kitaplık içe aktarmanız One Tap özelliği zaten etkin.
Bu dokümanda, Android uygulamanızı Bağlı Hesapta Oturum Açın.
İşleyiş şekli
- Tek dokunuşla oturum açma akışı sırasında bağlı hesapları göstermeyi etkinleştirirsiniz.
- Kullanıcı Google'da oturum açmışsa ve Google Hesabı ile hizmetini etkinleştirdiğinizde, bağlı erişim izni için bir kimlik jetonu hesap.
- Kullanıcıya, hesabınızda oturum açma seçeneği içeren bir One Tap oturum açma istemi gösterilir. hizmetini bağlaması gerekir.
- 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
Geliştirme ortamınızı ayarlama
Geliştirme ana makinenizde Google Play Hizmetleri'nin son sürümünü edinin:
- Şunu açın: Android SDK Yöneticisi.
SDK Araçları'nın altında Google Play Hizmetleri'ni bulun.
Bu paketlerin durumu Yüklü değilse her ikisini de seçip tıklayın Paketleri Yükle.
Uygulamanızı yapılandırma
Proje düzeyindeki
build.gradle
dosyanızda, Google'ın Maven deposunu hembuildscript
hem deallprojects
bölümlerinize ekleyin.buildscript { repositories { google() } } allprojects { repositories { google() } }
"Link with Google" (Google ile bağla) için bağımlılıkları ekleyin. uygulama düzeyinde gradle dosyası vardır. Bu genellikle
app/build.gradle
olan:dependencies { implementation 'com.google.android.gms:play-services-auth:21.2.0' }
Android uygulamanızı, Bağlı Hesapta Oturum Açma özelliğini destekleyecek şekilde değiştirme
Bağlı Hesapta Oturum Açma akışının sonunda hesabınıza bir kimlik jetonu döndürülür. uygulamasını indirin. Kullanıcı oturum açmadan önce kimlik jetonunun bütünlüğü doğrulanmalıdır.
Aşağıdaki kod örneğinde, içe aktarma işlemine ilişkin adımlar, kimlik jetonunu doğrulayın ve ardından Kullanıcının oturum açmasını sağlayın.
Oturum Açma amacının sonucunu almak için 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") } });
Oturum açma isteği 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()
Oturum Açma Beklemede niyetini başlat
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ğrulayın
Jetonun geçerli olduğunu doğrulamak için aşağıdaki koşulların sağlandığından emin olun: karşılanıyorsa:
- Kimlik jetonu Google tarafından düzgün bir şekilde imzalandı. Google'ın genel anahtarlarını kullanın
(kullanılabilir
JWK veya
PEM biçimini kullanın)
kullanın. Bu anahtarlar düzenli olarak döndürülür; incelemek
ne zaman olduğunu belirlemek için yanıttaki
Cache-Control
üstbilgisi bunları tekrar almanız gerekir. - Kimlik jetonundaki
aud
değeri, uygulamanızın izin vermiştir. Bu kontrol, kötü amaçlı bir sunucuya kimlik jetonlarının verilmesini önlemek için gereklidir. uygulamanızın arka uç sunucusunda aynı kullanıcıyla ilgili verilere erişmek için kullanılan bir uygulamadır. - Kimlik jetonundaki
iss
değeri şuna eşit:accounts.google.com
veyahttps://accounts.google.com
. - Kimlik jetonunun geçerlilik süresi (
exp
) geçmedi. - Kimlik jetonunun bir Google Workspace veya Cloud'u temsil ettiğini doğrulamanız gerekiyorsa
hd
hak talebini kontrol edebilirsiniz. Bu hak talebi, barındırılan etkinliklerin kullanıcının alanıyla ilişkilidir. Bu, bir kaynağa erişimi yalnızca belirli alan adlarında kullanılabilir. Bu hak talebinin olmaması, hesabın Google tarafından barındırılan alan.
email
, email_verified
ve hd
alanlarını kullanarak aşağıdakilerin geçerli olup olmadığını belirleyebilirsiniz:
Google, e-posta adreslerini barındırır ve bu adres konusunda yetkilidir. Google'ın yetkili olduğu durumlarda
kullanıcının yasal hesap sahibi olduğu biliniyorsa, şifre veya diğer iletişim bilgilerini atlayabilirsiniz.
isteyebilirsiniz.
Google'ın yetkili olduğu durumlar:
email
adresinin@gmail.com
son eki var. Bu bir Gmail hesabı.email_verified
doğru vehd
ayarlandı. Bu bir G Suite hesabı.
Kullanıcılar, Gmail veya G Suite kullanmadan Google Hesaplarına kaydolabilir. Zaman
email
, @gmail.com
son eki içermiyor ve hd
mevcut değilse Google
kimlik doğrulama, şifre veya diğer sorgulama yöntemlerinin önerildiğini doğrulama
gösterir. email_verified
, Google'ın ilk olarak
kullanıcı hesabı sırasında üçüncü tarafın
e-posta hesabı değişmiş olabilir.
Bu doğrulama adımlarını uygulamak için kendi kodunuzu yazmak yerine,
Platformunuz için bir Google API istemci kitaplığı veya genel amaçlı bir
JWT kitaplığı. Geliştirme ve hata ayıklama için tokeninfo
hattımızı arayabilirsiniz
doğrulama uç noktası.
Google API İstemci Kitaplığı Kullanın
Her bir Java Google API İstemci Kitaplığı Google kimliği jetonlarını üretim ortamında doğrulamak için önerilen yöntemdir.
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'u temsil ettiğini doğrulamanız gerekiyorsa
alan adını kontrol ederek hd
hak talebini doğrulayabilirsiniz.
Payload.getHostedDomain()
yöntemi tarafından döndürülür.
Jeton bilgisi uç noktasını çağırma
Hata ayıklama için kimlik jetonu imzasını doğrulamanın kolay bir yolu,
tokeninfo
uç noktasını kullanın. Bu uç noktanın çağrılmasında bir
düzgün testiniz sırasında doğrulamanın çoğunu sizin için yapan ek ağ isteği
doğrulama ve yük ayıklama işlemlerini kendi kodunuzda gerçekleştirin. Üretimde kullanılmaya uygun değil
zaman zaman hatalarına maruz kalabilir. Bu nedenle istekler kısıtlanabilir veya
tokeninfo
uç noktasını kullanarak kimlik jetonunu doğrulamak için HTTPS oluşturun
uç noktaya POST veya GET isteği gönderebilir ve kimlik jetonunuzu
id_token
parametresinden yararlanın.
Örneğin, "XYZ123" jetonunu doğrulamak için aşağıdaki GET isteğini yapın:
https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123
Jeton düzgün şekilde imzalandıysa ve iss
ile exp
hak talebi beklenen değerlere sahipse bir HTTP 200 yanıtı alırsınız.
JSON biçiminde kimlik jetonu hak taleplerini içerir.
Örnek bir yanıt şöyle:
{ // These six fields are included in all Google ID Tokens. "iss": "https://accounts.google.com", "sub": "110169484474386276334", "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com", "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com", "iat": "1433978353", "exp": "1433981953", // These seven fields are only included when the user has granted the "profile" and // "email" OAuth scopes to the application. "email": "testuser@gmail.com", "email_verified": "true", "name" : "Test User", "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg", "given_name": "Test", "family_name": "User", "locale": "en" }.
Kimlik jetonunun bir Google Workspace hesabını temsil ettiğini doğrulamanız gerekiyorsa aşağıdakileri kontrol edebilirsiniz:
Kullanıcının barındırılan alan adını belirten hd
hak talebi. Bu özellik, şu durumlarda kullanılmalıdır:
Bir kaynağa erişimi yalnızca belirli alanların üyeleriyle kısıtlayarak. Bu iddianın olmaması
hesabın Google Workspace tarafından barındırılan bir alana ait olmadığını gösterir.