Uçtan uca OAuth 2.0 oturum açma akışını gerçekleştirmek için Firebase SDK'yı kullanarak kullanıcılarınızın Apple Kimliklerini kullanarak Firebase ile kimlik doğrulaması yapmasına izin verebilirsiniz.
Sen başlamadan önce
Apple kullanarak kullanıcıların oturum açmasını sağlamak için önce Apple'ın geliştirici sitesinde Apple ile Giriş Yap'ı yapılandırın, ardından Apple'ı Firebase projeniz için bir oturum açma sağlayıcısı olarak etkinleştirin.
Apple Geliştirici Programına Katılın
Apple ile Giriş Yap, yalnızca Apple Developer Program üyeleri tarafından yapılandırılabilir.
Apple ile Oturum Açmayı Yapılandırın
Apple Sign In, Firebase projenizde etkinleştirilmeli ve uygun şekilde yapılandırılmalıdır. Yapılandırma, Android ve Apple platformlarına göre değişir. Devam etmeden önce lütfen Apple platformlarının ve/veya Android kılavuzlarının "Apple ile Oturum Açmayı Yapılandır" bölümünü takip edin.Oturum açma sağlayıcısı olarak Apple'ı etkinleştirin
- Firebase konsolunda Kimlik Doğrulama bölümünü açın. Oturum açma yöntemi sekmesinde, Apple sağlayıcısını etkinleştirin.
- Apple Sign-in sağlayıcı ayarlarını yapılandırın:
- Uygulamanızı yalnızca Apple platformlarında dağıtıyorsanız, Hizmet Kimliği, Apple Ekip Kimliği, özel anahtar ve anahtar kimliği alanlarını boş bırakabilirsiniz.
- Android cihazlarda destek için:
- Firebase'i Android projenize ekleyin . Uygulamanızı Firebase konsolunda ayarlarken uygulamanızın SHA-1 imzasını kaydettiğinizden emin olun.
- Firebase konsolunda Kimlik Doğrulama 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 kod akışı yapılandırması bölümünde, Apple Ekip Kimliğinizi ve önceki bölümde oluşturduğunuz özel anahtarı ve anahtar kimliğini belirtin.
Apple anonimleştirilmiş veri gereksinimlerine uyun
Apple ile Giriş Yap, kullanıcılara oturum açarken e-posta adresleri dahil olmak üzere verilerini anonimleştirme seçeneği sunar. Bu seçeneği tercih eden kullanıcıların e-posta adresleri privaterelay.appleid.com
etki alanına sahiptir. Uygulamanızda Apple ile Giriş Yap'ı kullandığınızda, bu anonimleştirilmiş Apple Kimlikleri ile ilgili Apple'ın geçerli tüm geliştirici politikalarına veya koşullarına uymalısınız.
Bu, doğrudan tanımlayıcı herhangi bir kişisel bilgiyi anonimleştirilmiş bir Apple Kimliği ile ilişkilendirmeden önce gerekli tüm kullanıcı onayını almayı içerir. Firebase Authentication kullanılırken bu, aşağıdaki eylemleri içerebilir:
- Bir e-posta adresini anonimleştirilmiş bir Apple kimliğine bağlayın veya tam tersini yapın.
- Bir telefon numarasını anonimleştirilmiş bir Apple kimliğine bağlama veya tam tersi
- Anonim olmayan bir sosyal kimlik bilgisini (Facebook, Google vb.) anonimleştirilmiş bir Apple Kimliğine bağlayın veya tam tersini yapın.
Yukarıdaki liste ayrıntılı değildir. Uygulamanızın Apple gereksinimlerini karşıladığından emin olmak için geliştirici hesabınızın Üyelik bölümündeki Apple Geliştirici Programı Lisans Sözleşmesine bakın.
firebase::auth::Auth
sınıfına erişin
Auth
sınıfı, tüm API çağrıları için ağ geçididir.- Auth ve App başlık dosyalarını ekleyin:
#include "firebase/app.h" #include "firebase/auth.h"
- Başlatma kodunuzda bir
firebase::App
sınıfı oluşturun.#if defined(__ANDROID__) firebase::App* app = firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity); #else firebase::App* app = firebase::App::Create(firebase::AppOptions()); #endif // defined(__ANDROID__)
- firebase
firebase::App
firebase::auth::Auth
sınıfını edinin.App
veAuth
arasında bire bir eşleme vardır.firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Oturum açma akışını Firebase SDK ile yönetin
Apple ile Oturum Açma işlemi, Apple ve Android platformlarına göre değişir.
Apple platformlarında
C++ kodunuzdan çağrılan Apple Sign In Objective-C SDK aracılığıyla Firebase ile kullanıcılarınızın kimliğini doğrulayın.
Her oturum açma isteği için, aldığınız kimlik belirtecinin özellikle uygulamanızın kimlik doğrulama isteğine yanıt olarak verildiğinden emin olmak için kullanacağınız rastgele bir dize (bir "nonce") oluşturun. Bu adım, tekrar saldırılarını önlemek için önemlidir.
- (NSString *)randomNonce:(NSInteger)length { NSAssert(length > 0, @"Expected nonce to have positive length"); NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._"; NSMutableString *result = [NSMutableString string]; NSInteger remainingLength = length; while (remainingLength > 0) { NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16]; for (NSInteger i = 0; i < 16; i++) { uint8_t random = 0; int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random); NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode); [randoms addObject:@(random)]; } for (NSNumber *random in randoms) { if (remainingLength == 0) { break; } if (random.unsignedIntValue < characterSet.length) { unichar character = [characterSet characterAtIndex:random.unsignedIntValue]; [result appendFormat:@"%C", character]; remainingLength--; } } } }
Apple'ın yanıtta değiştirmeden ileteceği oturum açma isteğinizle nonce'nin SHA256 hash'ini göndereceksiniz. Firebase, orijinal nonce değerini hashleyerek ve bunu Apple tarafından iletilen değerle karşılaştırarak yanıtı doğrular.
Apple'ın oturum açma akışını başlatın, isteğinizde nonce'nin SHA256 hash'i ve Apple'ın yanıtını işleyecek delege sınıfı dahil (sonraki adıma bakın):
- (void)startSignInWithAppleFlow { NSString *nonce = [self randomNonce:32]; self.currentNonce = nonce; ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init]; ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest]; request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail]; request.nonce = [self stringBySha256HashingString:nonce]; ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]]; authorizationController.delegate = self; authorizationController.presentationContextProvider = self; [authorizationController performRequests]; } - (NSString *)stringBySha256HashingString:(NSString *)input { const char *string = [input UTF8String]; unsigned char result[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(string, (CC_LONG)strlen(string), result); NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { [hashed appendFormat:@"%02x", result[i]]; } return hashed; }
ASAuthorizationControllerDelegate` uygulamanızda Apple'ın yanıtını işleyin. Oturum açma başarılı olduysa, Firebase ile kimlik doğrulaması yapmak için Apple'ın yanıtındaki kimlik belirtecini karma yapılmamış nonce ile kullanın:
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) { if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) { ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential; NSString *rawNonce = self.currentNonce; NSAssert(rawNonce != nil, @"Invalid state: A login callback was received, but no login request was sent."); if (appleIDCredential.identityToken == nil) { NSLog(@"Unable to fetch identity token."); return; } NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken encoding:NSUTF8StringEncoding]; if (idToken == nil) { NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken); } }
Bir Firebase Kimlik Bilgisi oluşturmak ve Firebase'de oturum açmak için ortaya çıkan belirteç dizesini ve orijinal nonce'u kullanın.
firebase::auth::OAuthProvider::GetCredential( /*provider_id=*/"apple.com", token, nonce, /*access_token=*/nullptr); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);
Aynı model, yakın zamanda oturum açmayı gerektiren hassas işlemler için yeni kimlik bilgileri almak üzere kullanılabilen
Reauthenticate
ile kullanılabilir.firebase::Future<firebase::auth::AuthResult> result = user->Reauthenticate(credential);
Aynı kalıp, bir hesabı Apple Sign In ile bağlamak için kullanılabilir. Ancak, mevcut bir Firebase hesabı, bağlantı kurmaya çalıştığınız Apple hesabına zaten bağlanmışsa bir hatayla karşılaşabilirsiniz. Bu gerçekleştiğinde, gelecek bir
kAuthErrorCredentialAlreadyInUse
durumu döndürür veAuthResult
geçerli bircredential
içerebilir. Bu kimlik bilgisi, Apple bağlantılı hesaptaSignInAndRetrieveDataWithCredential
aracılığıyla, başka bir Apple Oturum Açma belirteci oluşturmaya ve nonce oluşturmaya gerek kalmadan oturum açmak için kullanılabilir.firebase::Future<firebase::auth::AuthResult> link_result = auth->current_user().LinkWithCredential(credential); // To keep example simple, wait on the current thread until call completes. while (link_result.status() == firebase::kFutureStatusPending) { Wait(100); } // Determine the result of the link attempt if (link_result.error() == firebase::auth::kAuthErrorNone) { // user linked correctly. } else if (link_result.error() == firebase::auth::kAuthErrorCredentialAlreadyInUse && link_result.result() ->additional_user_info.updated_credential.is_valid()) { // Sign In with the new credential firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential( link_result.result()->additional_user_info.updated_credential); } else { // Another link error occurred. }
Android'de
Android'de, uçtan uca oturum açma akışını gerçekleştirmek için Firebase SDK'yı kullanarak web tabanlı genel OAuth Login'i uygulamanıza entegre ederek Firebase ile kullanıcılarınızın kimliğini doğrulayın.
Firebase SDK ile oturum açma akışını yönetmek için şu adımları izleyin:
Apple için uygun sağlayıcı kimliğiyle yapılandırılmış bir
FederatedOAuthProviderData
örneği oluşturun.firebase::auth::FederatedOAuthProviderData provider_data("apple.com");
İsteğe bağlı: Kimlik doğrulama sağlayıcısından istemek istediğiniz varsayılanın ötesinde ek OAuth 2.0 kapsamları belirtin.
provider_data.scopes.push_back("email"); provider_data.scopes.push_back("name");
İsteğe bağlı: Apple'ın oturum açma ekranını İngilizce dışında bir dilde görüntülemek istiyorsanız
locale
parametreyi ayarlayın. Desteklenen yerel ayarlar için Apple ile Giriş Yap belgelerine bakın.// Localize to French. provider_data.custom_parameters["language"] = "fr"; ```
Sağlayıcı verileriniz yapılandırıldıktan sonra, bunu bir FederatedOAuthProvider oluşturmak için kullanın.
// Construct a FederatedOAuthProvider for use in Auth methods. firebase::auth::FederatedOAuthProvider provider(provider_data);
Kimlik Doğrulama sağlayıcısı nesnesini kullanarak Firebase ile kimlik doğrulaması yapın. Diğer FirebaseAuth işlemlerinden farklı olarak, bu işlemin, kullanıcının kimlik bilgilerini girebileceği bir web görünümü açarak kullanıcı arabiriminizin kontrolünü ele geçireceğini unutmayın.
Oturum açma akışını başlatmak için
signInWithProvider
öğesini arayın:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithProvider(provider_data);
Uygulamanız daha sonra bekleyebilir veya Future üzerinde bir geri arama kaydedebilir .
Aynı model, yakın zamanda oturum açmayı gerektiren hassas işlemler için yeni kimlik bilgilerini almak için kullanılabilen
ReauthenticateWithProvider
ile kullanılabilir.firebase::Future<firebase::auth::AuthResult> result = user.ReauthenticateWithProvider(provider_data);
Uygulamanız daha sonra bekleyebilir veya Future üzerinde bir geri arama kaydedebilir .
Ayrıca, farklı kimlik sağlayıcıları mevcut hesaplara bağlamak için
LinkWithCredential()
kullanabilirsiniz.Apple hesaplarını başka verilere bağlamadan önce Apple'ın kullanıcılardan açık onay almanızı gerektirdiğini unutmayın.
Örneğin, bir Facebook hesabını mevcut Firebase hesabına bağlamak için, kullanıcıyı Facebook'ta oturum açarken elde ettiğiniz erişim jetonunu kullanın:
// Initialize a Facebook credential with a Facebook access token. AuthCredential credential = firebase::auth::FacebookAuthProvider.getCredential(token); // Assuming the current user is an Apple user linking a Facebook provider. firebase::Future<firebase::auth::AuthResult> result = auth.current_user().LinkWithCredential(credential);
Apple Notes ile oturum açın
Firebase Auth tarafından desteklenen diğer sağlayıcıların aksine, Apple bir fotoğraf URL'si sağlamaz.
Ayrıca, kullanıcı e-postasını uygulamayla paylaşmamayı seçtiğinde, Apple söz konusu kullanıcı için uygulamanızla paylaştığı benzersiz bir e-posta adresi ( xyz@privaterelay.appleid.com
biçiminde) sağlar. Özel e-posta geçiş hizmetini yapılandırdıysanız Apple, anonimleştirilmiş adrese gönderilen e-postaları kullanıcının gerçek e-posta adresine iletir.
Apple, görünen ad gibi kullanıcı bilgilerini yalnızca bir kullanıcı ilk kez oturum açtığında uygulamalarla paylaşır. Genellikle Firebase, bir kullanıcı Apple'da ilk kez oturum açtığında görünen adı depolar ve bunu current_user().display_name()
ile alabilirsiniz. Ancak, daha önce bir kullanıcının Firebase kullanmadan uygulamada oturum açması için Apple'ı kullandıysanız, Apple kullanıcının görünen adını Firebase'e sağlamaz.
Sonraki adımlar
Bir kullanıcı ilk kez oturum açtıktan sonra, yeni bir kullanıcı hesabı oluşturulur ve kullanıcının oturum açtığı kimlik bilgilerine (yani, kullanıcı adı ve parolası, telefon numarası veya kimlik doğrulama sağlayıcı bilgileri) bağlanır. Bu yeni hesap, Firebase projenizin bir parçası olarak saklanır ve kullanıcının nasıl oturum açtığına bakılmaksızın projenizdeki her uygulamada bir kullanıcıyı tanımlamak için kullanılabilir. Uygulamalarınızda, kullanıcının temel profil bilgilerini firebase::auth::User
nesnesinden alabilirsiniz. Bkz . Kullanıcıları Yönetin .
Firebase Gerçek Zamanlı Veritabanı ve Bulut Depolama Güvenlik Kurallarınızda, oturum açmış kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve bunu bir kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.