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ılarda oturum açmak için önce Apple'ın geliştirici sitesinde Apple ile Oturum Aç'ı yapılandırın, ardından Apple'ı Firebase projeniz için 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 Geliştirici 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ında değişiklik gösterir. 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ü izleyin.Apple'ı oturum açma sağlayıcısı olarak etkinleştirin
- Firebase konsolunda , Yetkilendirme bölümünü açın. Oturum açma yöntemi sekmesinde Apple sağlayıcısını etkinleştirin.
- Apple Oturum Açma 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:
- Android projenize Firebase ekleyin . Uygulamanızı Firebase konsolunda ayarlarken uygulamanızın SHA-1 imzasını kaydettiğinizden emin olun.
- Firebase konsolunda , Yetkilendirme 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ırma bölümünde, Apple Takım Kimliğinizi ve önceki bölümde oluşturduğunuz özel anahtar ve anahtar kimliğinizi belirtin.
Apple anonimleştirilmiş veri gereksinimlerine uyun
Apple ile Giriş Yap, kullanıcılara oturum açarken e-posta adresleri de dahil olmak üzere verilerini anonimleştirme seçeneği sunar. Bu seçeneği seçen kullanıcıların e-posta adresleri privaterelay.appleid.com
. Uygulamanızda Apple ile Giriş Yap'ı kullandığınızda, bu anonimleştirilmiş Apple Kimlikleri ile ilgili olarak Apple'ın geçerli geliştirici politikalarına veya koşullarına uymanız gerekir.
Bu, herhangi bir doğrudan tanımlayıcı 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ırken bu, aşağıdaki eylemleri içerebilir:
- Bir e-posta adresini anonimleştirilmiş bir Apple Kimliğine bağlayın veya tam tersi.
- Bir telefon numarasını anonimleştirilmiş bir Apple Kimliğine bağlayın veya tam tersi
- Anonim olmayan bir sosyal kimlik bilgisini (Facebook, Google, vb.) anonimleştirilmiş bir Apple Kimliğine bağlayın veya tam tersi.
Yukarıdaki liste ayrıntılı değildir. Uygulamanızın Apple'ın 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.- Yetkilendirme ve Uygulama 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::App
içinfirebase::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);
Firebase SDK ile oturum açma akışını yönetin
Apple ile Oturum Açma işlemi, Apple ve Android platformlarında değişiklik gösterir.
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--; } } } }
Oturum açma isteğinizle birlikte nonce'nin SHA256 karmasını göndereceksiniz ve Apple bu yanıtta değişmeden geçecektir. Firebase, orijinal nonce'yi hash ederek ve Apple tarafından iletilen değerle karşılaştırarak yanıtı doğrular.
İsteğinizde nonce'nin SHA256 karması ve Apple'ın yanıtını işleyecek delege sınıfı dahil olmak üzere Apple'ın oturum açma akışını başlatın (bir 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ı ele alın. Oturum açma başarılı olduysa, Firebase ile kimlik doğrulaması yapmak için Apple'ın yanıtındaki kimlik belirtecini karma olmayan 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 elde edilen belirteç dizesini ve orijinal nonce'yi kullanın.
firebase::auth::OAuthProvider::GetCredential( /*provider_id=*/"apple.com", token, nonce, /*access_token=*/nullptr); firebase::Future<firebase::auth::User*> result = auth->SignInWithCredential(credential);
Aynı model, yakın zamanda oturum açmayı gerektiren hassas işlemler için yeni kimlik bilgilerini almak için kullanılabilen Yeniden Kimlik
Reauthenticate
ile kullanılabilir.firebase::Future<firebase::auth::SignInResult> result = user->Reauthenticate(credential);
Aynı model, bir hesabı Apple Sign In ile bağlamak için kullanılabilir. Ancak, mevcut bir Firebase hesabı, bağlanmaya çalıştığınız Apple hesabına zaten bağlanmışsa bir hatayla karşılaşabilirsiniz. Bu gerçekleştiğinde, gelecek
updated_credential
durumunu döndürür vekAuthErrorCredentialAlreadyInUse
UserInfo nesnesi geçerli birSignInResult
içerebilir. Bu kimlik bilgisi, Apple'a bağlı hesaptaSignInWithCredential
aracılığıyla başka bir Apple Oturum Açma belirteci ve nonce oluşturmaya gerek kalmadan oturum açmak için kullanılabilir.SignInResult.UserInfo
updated_credential
bir üyesi olduğundan, bu işlemin kimlik bilgilerini içermesi içinLinkAndRetrieveDataWithCredential
kullanmanız gerektiğini unutmayın.firebase::Future<firebase::auth::SignInResult> link_result = auth->current_user()->LinkAndRetrieveDataWithCredential(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()->info.updated_credential.is_valid()) { // Sign In with the new credential firebase::Future<firebase::auth::User*> result = auth->SignInWithCredential( link_result.result()->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 kullanıcılarınızın kimliğini Firebase ile 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
parametresini ayarlayın. Desteklenen yerel ayarlar için Apple ile Oturum Açma 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);
Yetkilendirme sağlayıcı nesnesini kullanarak Firebase ile kimlik doğrulaması yapın. Diğer FirebaseAuth işlemlerinden farklı olarak, bunun, kullanıcının kimlik bilgilerini girebileceği bir web görünümü açarak kullanıcı arayüzünüzün kontrolünü ele alacağını unutmayın.
Oturum açma akışını başlatmak için
signInWithProvider
:firebase::Future<firebase::auth::SignInResult> result = auth->SignInWithProvider(provider_data);
Başvurunuz daha sonra bekleyebilir veya Gelecek'te 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::SignInResult> result = user->ReauthenticateWithProvider(provider_data);
Başvurunuz daha sonra bekleyebilir veya Gelecek'te bir geri arama kaydedebilir .
Ayrıca, farklı kimlik sağlayıcılarını mevcut hesaplara bağlamak için
linkWithCredential()
'ı kullanabilirsiniz.Apple'ın, Apple hesaplarını diğer verilere bağlamadan önce 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ının Facebook'ta oturum açmasından 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::SignInResult> result = auth.getCurrentUser().linkWithCredential(credential);
Apple Notes ile giriş yapı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, o kullanıcı için uygulamanızla paylaştığı benzersiz bir e-posta adresi ( xyz@privaterelay.appleid.com
biçiminde) sağlar. Özel e-posta aktarma 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, bir kullanıcı ilk kez oturum açtığında uygulamalarla yalnızca görünen ad gibi kullanıcı bilgilerini paylaşır. Genellikle, Firebase, bir kullanıcı Apple'da ilk kez oturum açtığında görünen adı saklar ve bunu getCurrentUser().getDisplayName()
ile alabilirsiniz. Ancak, daha önce bir kullanıcının uygulamada oturum açmak için Firebase'i kullanmadan Apple'ı kullandıysanız Apple, Firebase'e kullanıcının görünen adını sağlamayacaktır.
Sonraki adımlar
Bir kullanıcı ilk kez oturum açtıktan sonra, yeni bir kullanıcı hesabı oluşturulur ve oturum açtığı kullanıcı adı ve parolası, telefon numarası veya kimlik doğrulama sağlayıcısı bilgileri gibi kimlik bilgilerine bağlanır. Bu yeni hesap, Firebase projenizin bir parçası olarak depolanır ve kullanıcının nasıl oturum açtığından bağımsız olarak 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. Kullanıcıları Yönetme konusuna bakın.
Firebase Gerçek Zamanlı Veritabanınız 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.