Kullanıcılarınızın Apple Kimliklerini kullanarak Firebase ile kimlik doğrulamalarını aşağıdaki şekilde sağlayabilirsiniz: uçtan uca OAuth 2.0 oturum açma akışını gerçekleştirmek için Firebase SDK'sını kullanın.
Başlamadan önce
Apple kullanarak kullanıcıların oturumunu açmak için önce Apple ile oturum açma özelliğini yapılandırın Apple'ın geliştirici sitesinde Apple'ı oturum açma sağlayıcısı olarak etkinleştirin Firebase projesi.
Apple Developer Program'a katılın
Apple ile Oturum Açma özelliği, yalnızca Apple Developer'ın üyeleri tarafından yapılandırılabilir Program'ı tıklayın.
Apple ile oturum açma özelliğini yapılandırma
Apple'da Geliştirici sitesinde aşağıdaki işlemleri yapın:
-
Web sitenizi, ilk bölümde açıklandığı şekilde uygulamanızla ilişkilendirin. / Web için Apple ile oturum açma özelliğini yapılandırın. İstendiğinde Dönüş URL'si olarak şu URL:
https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler
Firebase proje kimliğinizi Firebase konsol ayarlar sayfasına gidin.
İşiniz bittiğinde yeni Hizmet Kimliğinizi not edin. Bu belgeyi ele alacağız.
- Oluştur: Apple özel anahtarıyla oturum açma başlıklı makaleyi inceleyin. Yeni özel anahtarınıza ve anahtarınıza ihtiyacınız olacak kimliğini girin.
-
Firebase Authentication ürününün kullanıcılara e-posta gönderen özelliklerinden herhangi birini kullanıyorsanız e-posta bağlantısı oturum açma, e-posta adresi doğrulama, hesap değişikliği dahil iptal ve diğerleri, Apple özel e-posta geçiş hizmetini yapılandırma ve kaydolma
noreply@YOUR_FIREBASE_PROJECT_ID.firebaseapp.com
(veya özelleştirilmiş e-posta şablon alanınızı) kullanın. Böylece Apple, gönderilen e-postaları aktarabilir Firebase Authentication tarafından anonimleştirilmiş Apple e-posta adreslerine gönderildi.
Apple'ı oturum açma sağlayıcısı olarak etkinleştir
- Firebase'i Android projenize ekleyin. uygulamanızı Firebase konsolu.
- Firebase konsolunda Auth bölümünü açın. Oturum açma yöntemi sekmesinde, Apple sağlayıcısını etkinleştirin. Önceki bölümde oluşturduğunuz Hizmet Kimliğini belirtin. Ayrıca, OAuth kodu akışı yapılandırma bölümü, Apple Ekip Kimliğinizi ve Önceki bölümde oluşturduğunuz özel anahtar ve anahtar kimliği.
Apple'ın anonimleştirilmiş veri şartlarına uyma
Apple ile Oturum Açma, kullanıcılara verilerini anonimleştirme seçeneği sunar.
oturum açarken kullandıkları e-posta adresleri de dahil. Bu seçeneği belirleyen kullanıcılar
privaterelay.appleid.com
alan adına sahip e-posta adresleri var. Zaman
Uygulamanızda Apple ile Oturum Açma özelliğini kullanıyorsanız geçerli tüm
bu anonimleştirilmiş Apple ile ilgili geliştirici politikaları veya Apple'ın şartları
Kimlikler.
Buna, hesabınızı kullanmadan önce gerekli kullanıcı rızasının alınması da dahildir. doğrudan tanımlayıcı kişisel bilgileri anonimleştirilmiş bir Apple ile ilişkilendirme Kimlik. Firebase Authentication kullanılırken şunlar dahil olabilir: işlemler:
- Bir e-posta adresini anonimleştirilmiş Apple kimliğine (veya tam tersi) bağlayın.
- Telefon numarasını anonimleştirilmiş bir Apple kimliğine (veya tam tersi) bağlama
- Anonim olmayan bir sosyal kimliği (ör. Facebook, Google) veya tam tersi de geçerlidir.
Yukarıdaki listede olası her duruma yer verilmemiştir. Apple Developer Program'ı inceleyin Geliştirici hesabınızın Üyelik bölümündeki Lisans Sözleşmesi'ni Uygulamanızın Apple'ın gereksinimlerini karşıladığından emin olun.
Oturum açma akışını Firebase SDK'sı ile yönetme
Android'de, Firebase'de kullanıcılarınızın kimliklerini doğrulamanın en kolay yolu Oturum açma akışının tamamını Firebase Android ile yönetmek için Apple Hesapları gerekir SDK'dır.
Oturum açma akışını Firebase Android SDK'sı ile yönetmek için aşağıdaki adımları uygulayın:
Oluşturucu'yu şununla birlikte kullanarak bir
OAuthProvider
örneği oluşturun: sağlayıcı kimliğiapple.com
:Kotlin+KTX
val provider = OAuthProvider.newBuilder("apple.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");
İsteğe bağlı: Varsayılan kapsam dışında kalan ek OAuth 2.0 kapsamları belirtin. kimlik doğrulama sağlayıcısından istekte bulunabilirsiniz.
Kotlin+KTX
provider.setScopes(arrayOf("email", "name"))
Java
List<String> scopes = new ArrayList<String>() { { add("email"); add("name"); } }; provider.setScopes(scopes);
Varsayılan olarak, E-posta adresi başına bir hesap etkinleştirildiğinde Firebase, e-posta ve ad kapsamları istenir. Bu ayarı Birden fazla hesap sayısı seçerseniz Firebase, Apple'dan herhangi bir kapsam istemez izin verilmez.
İsteğe bağlı: Apple'ın oturum açma ekranını bir dilde görüntülemek istiyorsanız İngilizce dışında bir seçenek varsa
locale
parametresini ayarlayın. Bkz. Apple belgeleriyle oturum açma bakın.Kotlin+KTX
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr")
Java
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr");
OAuth sağlayıcı nesnesini kullanarak Firebase ile kimlik doğrulayın. Unutmayın, diğer
FirebaseAuth
işlemleri için kullanıcı arayüzünüze özel bir Chrome sekmesi açabilirsiniz. Bu nedenle, ekleyeceğiniz şekilde eklediğinizOnSuccessListener
veOnFailureListener
işlem kullanıcı arayüzünü başlattığında hemen ayrılır.Öncelikle bir yanıt alıp almadığınızı kontrol etmeniz gerekir. Oturum açma Bu yöntem, Etkinliğinizi arka plana getirir. Bu da, oturum açma akışı sırasında sistem tarafından geri alınabilir. Bu metodolojiyi bu durumda kullanıcının tekrar denemesini engellemek için bir sonuç olup olmadığını kontrol edebilir.
Bekleyen sonuç olup olmadığını kontrol etmek için
getPendingAuthResult()
numaralı telefonu arayın:Kotlin+KTX
val pending = auth.pendingAuthResult if (pending != null) { pending.addOnSuccessListener { authResult -> Log.d(TAG, "checkPending:onSuccess:$authResult") // Get the user profile with authResult.getUser() and // authResult.getAdditionalUserInfo(), and the ID // token from Apple with authResult.getCredential(). }.addOnFailureListener { e -> Log.w(TAG, "checkPending:onFailure", e) } } else { Log.d(TAG, "pending: null") }
Java
mAuth = FirebaseAuth.getInstance(); Task<AuthResult> pending = mAuth.getPendingAuthResult(); if (pending != null) { pending.addOnSuccessListener(new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { Log.d(TAG, "checkPending:onSuccess:" + authResult); // Get the user profile with authResult.getUser() and // authResult.getAdditionalUserInfo(), and the ID // token from Apple with authResult.getCredential(). } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "checkPending:onFailure", e); } }); } else { Log.d(TAG, "pending: null"); }
Bekleyen bir sonuç yoksa şu numarayı arayarak oturum açma akışını başlatın:
startActivityForSignInWithProvider()
:Kotlin+KTX
auth.startActivityForSignInWithProvider(this, provider.build()) .addOnSuccessListener { authResult -> // Sign-in successful! Log.d(TAG, "activitySignIn:onSuccess:${authResult.user}") val user = authResult.user // ... } .addOnFailureListener { e -> Log.w(TAG, "activitySignIn:onFailure", e) }
Java
mAuth.startActivityForSignInWithProvider(this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Sign-in successful! Log.d(TAG, "activitySignIn:onSuccess:" + authResult.getUser()); FirebaseUser user = authResult.getUser(); // ... } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "activitySignIn:onFailure", e); } });
Firebase Auth tarafından desteklenen diğer sağlayıcıların aksine, Apple fotoğraf URL'si.
Ayrıca kullanıcı, e-postalarını uygulamayla paylaşmamayı seçtiğinde Apple, söz konusu kullanıcı için benzersiz bir e-posta adresi (
xyz@privaterelay.appleid.com
) çıkar ve bunları uygulamanızla paylaşır. Şu durumda: özel e-posta geçiş hizmetini yapılandırdıktan sonra, Apple, kullanıcının gerçek e-posta adresine anonimleştirilmiş adres ekleme.Apple yalnızca görünen ad gibi kullanıcı bilgilerini uygulamalarla paylaşır. Kullanıcı ilk kez oturum açtığında. Genellikle Firebase, görünen adı kullanıcı Apple ile ilk kez oturum açtığında
getCurrentUser().getDisplayName()
Ancak daha önce Apple'ı kullanarak uygulamada bir kullanıcının Firebase kullanarak, Apple, Firebase'e kullanıcının göstergesini sunmaz. dokunun.
Yeniden kimlik doğrulama ve hesap bağlama
Aynı desen startActivityForReauthenticateWithProvider()
ile de kullanılabilir
Yeni bir kimlik bilgisi almak için kullanabileceğiniz
son oturum açmayı gerektirir:
Kotlin+KTX
// The user is already signed-in.
val firebaseUser = auth.getCurrentUser()
firebaseUser
.startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
.addOnSuccessListener( authResult -> {
// User is re-authenticated with fresh tokens and
// should be able to perform sensitive operations
// like account deletion and email or password
// update.
})
.addOnFailureListener( e -> {
// Handle failure.
})
Java
// The user is already signed-in.
FirebaseUser firebaseUser = mAuth.getCurrentUser();
firebaseUser
.startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
.addOnSuccessListener(
new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
// User is re-authenticated with fresh tokens and
// should be able to perform sensitive operations
// like account deletion and email or password
// update.
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle failure.
}
});
Dilerseniz linkWithCredential()
kullanarak farklı kimlik sağlayıcıları da
hesaplar.
Apple, bağlantı oluşturmadan önce kullanıcılardan açıkça izin almanızı zorunlu kılar. diğer verilere aktarmalarını sağlar.
Örneğin, bir Facebook hesabını mevcut Firebase hesabına bağlamak için kullanıcının Facebook'ta oturum açarak aldığınız erişim jetonu:
Kotlin+KTX
// Initialize a Facebook credential with a Facebook access token.
val credential = FacebookAuthProvider.getCredential(token.getToken())
// Assuming the current user is an Apple user linking a Facebook provider.
mAuth.getCurrentUser().linkWithCredential(credential)
.addOnCompleteListener(this, task -> {
if (task.isSuccessful()) {
// Facebook credential is linked to the current Apple user.
// The user can now sign in to the same account
// with either Apple or Facebook.
}
});
Java
// Initialize a Facebook credential with a Facebook access token.
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
// Assuming the current user is an Apple user linking a Facebook provider.
mAuth.getCurrentUser().linkWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Facebook credential is linked to the current Apple user.
// The user can now sign in to the same account
// with either Apple or Facebook.
}
}
});
Gelişmiş: Oturum açma akışını manuel olarak yönetme
Ayrıca, Apple Oturum Açma JS SDK'sını kullanarak oturum açma akışı oluşturun ve OAuth akışı veya şu gibi bir OAuth kitaplığı kullanarak: AppAuth öğesini kullanabilirsiniz.
Her oturum açma isteği için rastgele bir dize oluşturun. "nonce": Aldığınız kimlik jetonunun şu olduğundan emin olmak için kullanırsınız: özel olarak uygulamanızın kimlik doğrulama isteğine yanıt olarak verilir. Bu adımı, tekrar saldırılarını önlemek için önemlidir.
Android'de kriptografik olarak güvenli bir tek seferlik rastgele sayı oluşturabilirsiniz.
SecureRandom
, aşağıdaki örnekte gösterildiği gibi:Kotlin+KTX
private fun generateNonce(length: Int): String { val generator = SecureRandom() val charsetDecoder = StandardCharsets.US_ASCII.newDecoder() charsetDecoder.onUnmappableCharacter(CodingErrorAction.IGNORE) charsetDecoder.onMalformedInput(CodingErrorAction.IGNORE) val bytes = ByteArray(length) val inBuffer = ByteBuffer.wrap(bytes) val outBuffer = CharBuffer.allocate(length) while (outBuffer.hasRemaining()) { generator.nextBytes(bytes) inBuffer.rewind() charsetDecoder.reset() charsetDecoder.decode(inBuffer, outBuffer, false) } outBuffer.flip() return outBuffer.toString() }
Java
private String generateNonce(int length) { SecureRandom generator = new SecureRandom(); CharsetDecoder charsetDecoder = StandardCharsets.US_ASCII.newDecoder(); charsetDecoder.onUnmappableCharacter(CodingErrorAction.IGNORE); charsetDecoder.onMalformedInput(CodingErrorAction.IGNORE); byte[] bytes = new byte[length]; ByteBuffer inBuffer = ByteBuffer.wrap(bytes); CharBuffer outBuffer = CharBuffer.allocate(length); while (outBuffer.hasRemaining()) { generator.nextBytes(bytes); inBuffer.rewind(); charsetDecoder.reset(); charsetDecoder.decode(inBuffer, outBuffer, false); } outBuffer.flip(); return outBuffer.toString(); }
Ardından, tek seferlik rastgele sayı değerinin SHA246 karmasını onaltılık dize olarak alın:
Kotlin+KTX
private fun sha256(s: String): String { val md = MessageDigest.getInstance("SHA-256") val digest = md.digest(s.toByteArray()) val hash = StringBuilder() for (c in digest) { hash.append(String.format("%02x", c)) } return hash.toString() }
Java
private String sha256(String s) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] digest = md.digest(s.getBytes()); StringBuilder hash = new StringBuilder(); for (byte c: digest) { hash.append(String.format("%02x", c)); } return hash.toString(); }
Oturum açma isteğinizle birlikte tek seferlik rastgele sayının SHA256 karmasını gönderirsiniz. Apple, hiçbir değişiklik yapmadan yanıtta geçer. Firebase yanıtı doğrular karma oluşturma işlemini uygulayarak orijinal tek seferlik rastgele sayının karma hale getirilmesi ve Apple tarafından iletilen değerle karşılaştırılması gerekir.
OAuth kitaplığınızı veya başka bir yöntemi kullanarak Apple'ın oturum açma akışını başlatın. Karma oluşturma işlemi uygulanmış tek seferlik rastgele sayı değerini isteğinize parametre olarak eklediğinizden emin olun.
Apple'ın yanıtını aldıktan sonra, yanıttaki kimlik jetonunu alın ve bunu ve karma oluşturma işlemi uygulanmamış tek seferlik rastgele sayı kullanarak
AuthCredential
oluşturun:Kotlin+KTX
val credential = OAuthProvider.newCredentialBuilder("apple.com") .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce) .build()
Java
AuthCredential credential = OAuthProvider.newCredentialBuilder("apple.com") .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce) .build();
Firebase kimlik bilgilerini kullanarak Firebase ile kimlik doğrulayın:
Kotlin+KTX
auth.signInWithCredential(credential) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // User successfully signed in with Apple ID token. // ... } }
Java
mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // User successfully signed in with Apple ID token. // ... } } });
signInWithCredential
çağrısı başarılı olursa getCurrentUser
öğesini kullanabilirsiniz
yöntemini çağırın.
Jeton İptali
Apple, hesap oluşturma özelliğini destekleyen uygulamaların, kullanıcıların işlemi başlatmasına izin vermesini zorunlu kılar App Store İncelemesi'nde açıklandığı gibi, uygulama içinde hesabının silinmesi Kurallar
Ayrıca, Apple ile oturum açma özelliğini destekleyen uygulamalar Apple ile oturum açma özelliğini kullanmalıdır. Kullanıcı jetonlarını iptal eden REST API.
Bu koşulu karşılamak için aşağıdaki adımları uygulayın:
Apple kullanarak oturum açmak için
startActivityForSignInWithProvider()
yöntemini kullanın veAuthResult
edinin.Apple sağlayıcısının erişim jetonunu edinin.
Kotlin+KTX
val oauthCredential: OAuthCredential = authResult.credential val accessToken = oauthCredential.accessToken
Java
OAuthCredential oauthCredential = (OAuthCredential) authResult.getCredential(); String accessToken = oauthCredential.getAccessToken();
revokeAccessToken
API'yi kullanarak jetonu iptal edin.Kotlin+KTX
mAuth.revokeAccessToken(accessToken) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Access token successfully revoked // for the user ... } }
Java
mAuth.revokeAccessToken(accessToken) .addOnCompleteListener(this, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { // Access token successfully revoked // for the user ... } } });
- Son olarak, kullanıcı hesabını silin (ve
ilişkili veriler)
Sonraki adımlar
Kullanıcı ilk kez oturum açtığında yeni bir kullanıcı hesabı oluşturulur ve bilgileri (kullanıcı adı ve şifre, telefon numarası) Numara veya kimlik doğrulama sağlayıcı bilgileri (oturum açan kullanıcı). Bu yeni Firebase projenizin bir parçası olarak saklanır ve aşağıdaki verileri tanımlamak için kullanılabilir: nasıl oturum açarsa açsın, projenizdeki tüm uygulamalarda kullanılır.
-
Uygulamalarınızda, kullanıcıların temel profil bilgilerini şuradan alabilirsiniz:
FirebaseUser
nesnesini ifade eder. Bkz. Kullanıcıları Yönet. Firebase Realtime Database ve Cloud Storage içinde Güvenlik Kuralları'nı kullanarak şunları yapabilirsiniz:
auth
değişkeninden, oturum açmış kullanıcının benzersiz kullanıcı kimliğini alabilirsiniz. ve kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanılır.
Kullanıcıların çoklu kimlik doğrulama kullanarak uygulamanızda oturum açmasına izin verebilirsiniz yetkilendirme sağlayıcısının kimlik bilgilerini hesaba katılmaz.
Bir kullanıcının oturumunu kapatmak için numaralı telefonu arayın
signOut
:Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();
-