Apple ve C++ Kullanarak Kimlik Doğrula

Uçtan uca OAuth 2.0 oturum açma akışını gerçekleştirmek için Firebase SDK'sını kullanarak kullanıcılarınızın Apple kimliklerini kullanarak Firebase ile kimlik doğrulama yapmasını sağlayabilirsiniz.

Başlamadan önce

Apple kullanarak kullanıcıların oturumunu açmak için önce Apple'ın geliştirici sitesinde Apple ile Oturum Açma'yı yapılandırın, ardından Apple'ı Firebase projeniz için oturum açma sağlayıcısı olarak etkinleştirin.

Apple Developer Program'a 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ç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 devam etmeden önce Apple platformları ve/veya Android kılavuzlarının "Apple ile Oturum Açmayı Yapılandırma" bölümünü inceleyin.

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ını boş bırakabilirsiniz.
    2. Android cihazlarda destek için:
      1. Firebase'i Android projenize ekleyin. Firebase konsolunda uygulamanızı kurarken uygulamanızın SHA-1 imzasını kaydettiğinizden emin olun.
      2. 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 kod akışı yapılandırması bölümünde Apple Ekip Kimliğinizi ve bir önceki bölümde oluşturduğunuz özel anahtarı ve anahtar kimliğini belirtin.

Apple'ın anonimleştirilmiş veri şartlarına uyma

Apple ile Oturum Açma, kullanıcılara oturum açarken e-posta adresleri de dahil olmak üzere verilerini anonimleştirme seçeneği sunar. Bu seçeneği belirleyen kullanıcılar privaterelay.appleid.com alan adında e-posta adreslerine sahip olur. Uygulamanızda Apple ile Oturum Açma özelliğini kullandığınızda bu anonimleştirilmiş Apple kimlikleriyle ilgili geçerli tüm geliştirici politikalarına veya Apple'ın şartlarına uymanız gerekir.

Buna, doğrudan tanımlayıcı kişisel bilgileri anonimleştirilmiş bir Apple kimliğiyle ilişkilendirmeden önce gerekli tüm kullanıcı izinlerini almak da dahildir. Firebase Authentication'ı kullanırken aşağıdaki işlemleri yapabilirsiniz:

  • 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 kimlik bilgisini (Facebook, Google vb.) anonimleştirilmiş bir Apple kimliğine (veya tam tersi) bağlayın.

Yukarıdaki listede olası her duruma yer verilmemiştir. Uygulamanızın Apple'ın şartlarını 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şmesi'ne bakın.

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. İlk kullanıma hazırlama 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::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

C++ kodunuzdan çağrılan Apple Sign InObjective-C SDK'sı aracılığıyla kullanıcılarınızın kimliğini Firebase ile doğrulayın.

  1. Her oturum açma isteği için aldığınız kimlik jetonunun, uygulamanızın kimlik doğrulama isteğine özel olarak verildiğinden emin olmak amacıyla kullanacağınız rastgele bir dize ("tek seferlik rastgele sayı") oluşturun. Bu adım, tekrarlama 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, bu bilgiyi yanıtta değiştirmeden iletir. Firebase, orijinal tek seferlik rastgele sayıya karma oluşturma işlemi uygulayarak ve bunu Apple tarafından iletilen değerle karşılaştırarak yanıtı doğrular.

  2. İsteğinizde tek seferlik rastgele sayını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ı olduysa Firebase ile kimlik doğrulamak için Apple'ın yanıtında karma olmayan tek seferlik rastgele sayıdaki kimlik jetonunu 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. Firebase Kimlik Bilgisi oluşturmak ve Firebase'de oturum açmak için elde edilen jeton dizesini ve orijinal tek seferlik rastgele sayıyı 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ı kalıp, yakın zamanda giriş yapılmasını gerektiren hassas işlemler için yeni kimlik bilgileri almak amacıyla Reauthenticate ile kullanılabilir.

    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ı, bağlantı oluşturmaya çalıştığınız Apple hesabına zaten bağlıysa hatayla karşılaşabilirsiniz. Bu durumda gelecekteki bir 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 jetonu ve tek seferlik rastgele sayı 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ışı gerçekleştirmek için Firebase SDK'sı ile uygulamanıza web tabanlı genel OAuth Girişi'ni entegre ederek kullanıcılarınızın kimliklerini Firebase ile doğrulayın.

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

  1. Apple'a 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ıdan istemek istediğiniz varsayılan kapsam dışında ek OAuth 2.0 kapsamları 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, bu verileri kullanarak FederatedOAuthProvider oluşturun.

    // 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. Diğer FirebaseAuth işlemlerinin aksine bu işlem, kullanıcının kimlik bilgilerini girebileceği bir web görünümü açarak kullanıcı arayüzünüzü kontrol eder.

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

  6. Aynı kalıp, yakın zamanda giriş yapılmasını gerektiren hassas işlemler için yeni kimlik bilgileri almak amacıyla ReauthenticateWithProvider ile kullanılabilir.

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

    Uygulamanız daha sonra bekleyebilir veya gelecekte bir geri çağırma kaydedebilir.

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

    Apple, kullanıcıların Apple hesaplarını diğer verilere bağlamadan önce onlardan açık izin almanızı zorunlu kılar.

    Örneğin, bir Facebook hesabını mevcut Firebase hesabına bağlamak için kullanıcının Facebook'ta oturum açtığında aldığınız 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çma

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-posta adresini uygulamayla paylaşmamayı seçtiğinde Apple, bu kullanıcı için xyz@privaterelay.appleid.com biçiminde benzersiz bir e-posta adresi sağlar. Bu adresi uygulamanızla paylaşır. Ö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 yönlendirir.

Apple, görünen ad gibi kullanıcı bilgilerini yalnızca kullanıcı ilk kez oturum açtığında uygulamalarla paylaşır. Firebase, görünen adı genellikle bir kullanıcı Apple'da ilk kez oturum açtığında depolar. Bunu current_user().display_name() ile alabilirsiniz. Ancak daha önce Firebase'i kullanmadan uygulamada bir kullanıcının oturumunu açmak 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 (kullanıcı adı ve şifre, telefon numarası veya kimlik doğrulama sağlayıcı bilgileri) 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 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 sayfasına göz atın.

Firebase Realtime Database ve Cloud Storage Güvenlik Kurallarınızda, oturum açan kullanıcının benzersiz kullanıcı kimliğini kimlik doğrulama değişkeninden alabilir ve kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.