Apple ve C++ Kullanarak Kimlik Doğrula

Kullanıcılarınızın Apple kimliklerini kullanarak Firebase ile kimlik doğrulaması yapmasını sağlamak için 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 ile Oturum Açma, Firebase projenizde etkinleştirilmiş ve doğru şekilde yapılandırılmış olmalıdır. Yapılandırma, Android ve Apple platformlarında farklılık gösterir. Lütfen şu talimatları uygulayın: "Apple ile Oturum Açma'yı yapılandır" Apple platformları ve/veya önceki Android kılavuzları devam ediyor.

Apple'ı oturum açma sağlayıcısı olarak etkinleştir

  1. Firebase konsolunda Auth bölümünü açın. Oturum açma yöntemi sekmesinde, Apple sağlayıcısını etkinleştirin.
  2. Apple Oturum Açma sağlayıcısı ayarlarını yapılandırın:
    1. Uygulamanızı yalnızca Apple platformlarına dağıtıyorsanız Hizmet Kimliği, Apple Ekip Kimliği, özel anahtar ve anahtar kimliği alanları boş.
    2. Android cihazlarda destek için:
      1. Firebase'i Android projenize ekleyin. uygulamanızı Firebase konsolu.
      2. Firebase'de konsolunda Kimlik Doğrulama bölümünü açın. Oturum açma yöntemi sekmesinde, Apple sağlayıcısını etkinleştirin. Şurada oluşturduğunuz Hizmet Kimliğini belirtin: geri dönüp bakarsınız. Ayrıca, OAuth kod akışı yapılandırması bölümünde Apple Ekip Kimliğinizi, oluşturduğunuz özel anahtarı ve anahtar kimliğini belirtin ele alacağız.

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.

firebase::auth::Auth sınıfına erişme

Auth sınıfı, tüm API çağrılarına yönelik ağ geçididir.
  1. Auth ve Uygulama başlığı dosyalarını ekleyin:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
    .
  2. Başlatma kodunuzda bir firebase::App sınıfı.
    #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__)
    
  3. firebase::App için firebase::auth::Auth sınıfını edinin. App ile Auth arasında bire bir eşleme var.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

Oturum açma akışını Firebase SDK'sı ile yönetme

Apple ile Oturum Açma işlemi, Apple ve Android platformlarında değişiklik gösterir.

Apple platformlarında

Apple ile Oturum Açma aracılığıyla Firebase ile kullanıcılarınızın kimliklerini doğrulama C++ kodunuzdan çağrılan Objective-C SDK'sı.

  1. 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.

      - (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 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.

  2. İsteğinizde Apple'ın yanıtını işleyecek tek seferlik rastgele sayısı ve temsilci sınıfı (bkz. sıradaki adıma geçin):

      - (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;
      }
    
  3. ASAuthorizationControllerDelegate" öğesine dokunun. Oturum açma başarılı olduysa kimliği kullanın Apple'ın yanıtından gelen ve karma oluşturma işlemi uygulanmamış tek seferlik rastgele sayı içeren jetondan Firebase:

      - (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);
          }
        }
    
  4. Firebase oluşturmak için elde edilen jeton dizesini ve orijinal tek seferlik rastgele sayıyı kullanın Kimlik bilgisini doğrulayın ve Firebase'de oturum açın.

    firebase::auth::OAuthProvider::GetCredential(
            /*provider_id=*/"apple.com", token, nonce,
            /*access_token=*/nullptr);
    
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
  5. Aynı desen Reauthenticate ile de kullanılabilir. Reauthenticate gereken hassas işlemler için yeni kimlik bilgileri almak üzere kullanılır. son giriş.

    firebase::Future<firebase::auth::AuthResult> result =
        user->Reauthenticate(credential);
    
  6. Apple ile Oturum Açma ile bir hesabı bağlamak için de aynı kalıp kullanılabilir. Ancak, mevcut bir Firebase hesabı şu işlemleri gerçekleştirdiğinde hatayla karşılaşabilirsiniz: bağlantı oluşturmaya çalıştığınız Apple hesabına zaten bağlı. Bu durum gerçekleştiğinde, ileride tekrar kAuthErrorCredentialAlreadyInUse ve AuthResult geçerli bir credential. Bu kimlik bilgisi Apple ile bağlantılı oturum açmak için kullanılabilir gerek kalmadan SignInAndRetrieveDataWithCredential üzerinden başka bir Apple Oturum Açma jetonu ve tek seferlik rastgele sayı oluşturabilirsiniz.

    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, web tabanlı entegrasyon sayesinde Firebase ile kullanıcılarınızın kimliğini doğrulayın Firebase SDK'sını kullanarak genel OAuth'a giriş yapın. oturum açma akışını sonlandırın.

Oturum açma akışını Firebase SDK'sı ile yönetmek için aşağıdaki adımları uygulayın:

  1. Şununla yapılandırılmış bir FederatedOAuthProviderData örneği oluşturun: Apple için uygun sağlayıcı kimliğini girin.

    firebase::auth::FederatedOAuthProviderData provider_data("apple.com");
    
  2. İsteğe bağlı: Varsayılan dışında kalan OAuth 2.0 kapsamlarını belirtin kimlik doğrulama sağlayıcısından istekte bulunmak istiyorum.

    provider_data.scopes.push_back("email");
    provider_data.scopes.push_back("name");
    
  3. İ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.

    // Localize to French.
    provider_data.custom_parameters["language"] = "fr";
    ```
    
  4. Sağlayıcı verileriniz yapılandırıldıktan sonra, verilerinizi kullanarak FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. Auth sağlayıcı nesnesini kullanarak Firebase ile kimlik doğrulayın. Unutmayın, diğer FirebaseAuth işlemleri için, bu işlem, Kullanıcının kimlik bilgilerini girebileceği bir web görünümü sunar.

    Oturum açma akışını başlatmak için signInWithProvider numaralı telefonu arayın:

    firebase::Future<firebase::auth::AuthResult> result =
      auth->SignInWithProvider(provider_data);
    

    Uygulamanız bu işlemin ardından bekleyebilir veya Gelecekte bir geri çağırma kaydetmemiz gerekir.

  6. Aynı desen ReauthenticateWithProvider ile de kullanılabilir. ReauthenticateWithProvider gereken hassas işlemler için yeni kimlik bilgileri almak üzere kullanılır. son giriş.

    firebase::Future<firebase::auth::AuthResult> result =
      user.ReauthenticateWithProvider(provider_data);
    

    Uygulamanız bu işlemin ardından bir geri arama bekleyebilir veya hakkında daha fazla bilgi edinin.

  7. Farklı kimlik sağlayıcıları bağlamak için LinkWithCredential() kullanabilirsiniz. .

    Apple, uygulamanızı kullanmadan önce kullanıcılardan açık izin almanızı zorunlu kılar. Apple hesaplarını başka verilere bağlama.

    Örneğin, bir Facebook hesabını mevcut Firebase hesabına bağlamak için kullanıcının Facebook'ta oturum açmasını sağlayarak aldığınız erişim jetonu:

    // 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çma

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 current_user().display_name() Ancak daha önce Apple'ı kullanarak bir veya Firebase'i kullanmadan uygulamaya erişim sağlarsa Apple, Firebase'e kullanıcının görünen adı

Sonraki adımlar

Kullanıcı ilk kez oturum açtığında yeni bir kullanıcı hesabı oluşturulur ve kullanıcı adı ve şifresi, telefon numarası ya da e-posta adresi gibi auth sağlayıcı bilgileri (oturum açan kullanıcı). Bu yeni hesap şu şekilde saklanacak: Firebase projenizin bir parçasıdır ve her uygulamanızın projenize de eklemeniz gerekir.

Uygulamalarınızda, kullanıcıların temel profil bilgilerini şuradan alabilirsiniz: firebase::auth::User nesne algılandı. Görüntüleyin Kullanıcıları Yönetme

Firebase Realtime Database ve Cloud Storage Güvenlik Kurallarınızda şunları alabilirsiniz: oturum açmış kullanıcının kimlik doğrulama değişkenindeki benzersiz kullanıcı kimliğini ve Kullanıcının hangi verilere erişebileceğini kontrol etmek