Apple ve C++ Kullanarak Kimlik Doğrulama

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ı yapmalarına olanak tanıyabilirsiniz.

Sen başlamadan önce

Apple'ı kullanarak kullanıcıların oturum açmasını sağlamak için öncelikle Apple'ın geliştirici sitesinde Apple ile Oturum Açma seçeneğini yapılandırın, ardından Firebase projeniz için oturum açma sağlayıcısı olarak Apple'ı etkinleştirin.

Apple Geliştirici Programına Katılın

Apple ile Oturum Açma yalnızca Apple Geliştirici Programı üyeleri tarafından yapılandırılabilir.

Apple ile Oturum Açmayı Yapılandırma

Firebase projenizde Apple Sign In'in etkinleştirilmesi ve doğru şekilde yapılandırılması gerekir. 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ırma" bölümünü izleyin.

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

  1. 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.
  2. Apple Oturum Açma sağlayıcı ayarlarını yapılandırın:
    1. 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.
    2. Android cihazlarda destek için:
      1. Firebase'i Android projenize ekleyin . Uygulamanızı Firebase konsolunda ayarlarken uygulamanızın SHA-1 imzasını kaydettiğinizden emin olun.
      2. 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'ın anonimleştirilmiş veri gereksinimlerine uyun

Apple ile Giriş Yap, kullanıcılara giriş yaparken e-posta adresleri de dahil olmak üzere verilerini anonimleştirme seçeneği sunar. Bu seçeneği seçen kullanıcıların, privaterelay.appleid.com etki alanına sahip e-posta adresleri vardır. Uygulamanızda Apple ile Giriş Yap'ı kullandığınızda, bu anonimleştirilmiş Apple Kimlikleriyle ilgili olarak Apple'ın geçerli geliştirici politikalarına veya şartlarına uymanız gerekir.

Bu, doğrudan tanımlayıcı herhangi bir kişisel bilgiyi anonimleştirilmiş bir Apple Kimliğiyle ilişkilendirmeden önce gerekli tüm kullanıcı onaylarının alınmasını 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 veya tam tersine bağlayın
  • Anonim olmayan bir sosyal kimlik bilgisini (Facebook, Google vb.) anonimleştirilmiş bir Apple Kimliğine bağlayın veya tam tersi.

Yukarıdaki liste kapsamlı 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ının ağ geçididir.
  1. Kimlik Doğrulama ve Uygulama başlık dosyalarını ekleyin:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. 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__)
    
  3. Firebase::Auth firebase::App firebase::auth::Auth sınıfını edinin. App ve Auth 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şiklik gösterir.

Apple platformlarında

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

  1. Her oturum açma isteği için, alacağınız kimlik belirtecinin uygulamanızın kimlik doğrulama isteğine yanıt olarak özel olarak verildiğinden emin olmak için kullanacağınız rastgele bir dize ("tek seferlik") 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'ın SHA256 karmasını göndereceksiniz ve Apple bunu yanıtta değişmeden iletecektir. Firebase, orijinal nonce değerini karma hale getirerek ve bunu Apple tarafından iletilen değerle karşılaştırarak yanıtı doğrular.

  2. İsteğinize, nonce'ın SHA256 karması ve Apple'ın yanıtını işleyecek temsilci sınıfı dahil olmak üzere Apple'ın oturum açma akışını başlatın (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;
      }
    
  3. ASAuthorizationControllerDelegate` uygulamanızda Apple'ın yanıtını ele alın. Oturum açma başarılıysa, Firebase ile kimlik doğrulaması yapmak için Apple'ın yanıtındaki kimlik belirtecini karma uygulanmamış nonce ile birlikte 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);
          }
        }
    
  4. Bir Firebase Kimlik Bilgisi oluşturmak ve Firebase'de oturum açmak için ortaya çıkan 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::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
  5. Aynı model, yakın zamanda oturum açmayı gerektiren hassas işlemler için yeni kimlik bilgileri almak amacıyla kullanılabilen Reauthenticate için de kullanılabilir.

    firebase::Future<firebase::auth::AuthResult> result =
        user->Reauthenticate(credential);
    
  6. Aynı model, bir hesabı Apple Sign In'e 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 meydana geldiğinde gelecekte kAuthErrorCredentialAlreadyInUse durumu döndürülür ve AuthResult geçerli bir credential içerebilir. Bu kimlik bilgisi, başka bir Apple Oturum Açma belirteci oluşturmaya gerek kalmadan SignInAndRetrieveDataWithCredential aracılığıyla Apple bağlantılı hesapta 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 Girişini uygulamanıza entegre ederek kullanıcılarınızın kimliklerini Firebase ile doğrulayın.

Firebase SDK ile oturum açma akışını yönetmek için şu adımları izleyin:

  1. 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");
    
  2. İsteğe bağlı: Kimlik doğrulama sağlayıcısından istemek istediğiniz varsayılanın ötesinde ek OAuth 2.0 kapsamlarını belirtin.

    provider_data.scopes.push_back("email");
    provider_data.scopes.push_back("name");
    
  3. İ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";
    ```
    
  4. 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);
    
  5. Kimlik doğrulama 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 öğesini çağırın:

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

    Uygulamanız daha sonra bekleyebilir veya Future'da bir geri arama kaydedebilir .

  6. Aynı model, yakın zamanda oturum açmayı gerektiren hassas işlemler için yeni kimlik bilgileri almak üzere kullanılabilen ReauthenticateWithProvider ile de kullanılabilir.

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

    Uygulamanız daha sonra bekleyebilir veya Future'da bir geri arama kaydedebilir .

  7. Ayrıca, farklı kimlik sağlayıcılarını mevcut hesaplara bağlamak için LinkWithCredential() yöntemini kullanabilirsiniz.

    Apple'ın, kullanıcıların Apple hesaplarını diğer verilere bağlamadan önce kullanıcıların açık iznini 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ıyla 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'la giriş yapın

Firebase Auth tarafından desteklenen diğer sağlayıcıların aksine Apple, fotoğraf URL'si sağlamaz.

Ayrıca, kullanıcı e-postasını uygulamayla paylaşmamayı seçtiğinde Apple, bu kullanıcı için uygulamanızla paylaştığı benzersiz bir e-posta adresini ( 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, görünen ad gibi kullanıcı bilgilerini yalnızca bir kullanıcı ilk kez oturum açtığında uygulamalarla paylaşır. Firebase genellikle, bir kullanıcı Apple'da ilk kez oturum açtığında, current_user().display_name() ile alabileceğiniz görünen adı saklar. Ancak daha önce Firebase'i kullanmadan bir kullanıcının uygulamada oturum açması için 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çan kullanıcının kimlik bilgileriyle (yani kullanıcı adı ve parolası, telefon numarası veya kimlik doğrulama sağlayıcı bilgileri) ilişkilendirilir. Bu yeni hesap, Firebase projenizin bir parçası olarak depolanı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önetme .

Firebase Gerçek Zamanlı Veritabanı ve Bulut Depolama Güvenliği Kurallarınızda, oturum açan kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve bunu, kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.