Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

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ı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 Giriş Yap özelliğini 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 Giriş Yapmayı Yapılandırma

Apple Sign In, Firebase projenizde etkinleştirilmeli ve doğru şekilde yapılandırılmalıdır. Yapılandırma, Android ve iOS platformları arasında farklılık gösterir. Devam etmeden önce lütfen iOS ve / veya Android kılavuzlarının "Apple ile Giriş Yapmayı Yapılandır" bölümünü takip edin.

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

  1. In Firebase konsoluna , Auth bölümünü açın. Giriş yöntemi sekmesinde, Apple sağlayıcısını etkinleştirin.
  2. Apple Sign-in sağlayıcı ayarlarını yapılandırın:
    1. Uygulamanızı yalnızca iOS'ta dağıtıyorsanız Servis 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. In Firebase konsoluna , Auth bölümünü açın. Giriş 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 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 privaterelay.appleid.com etki alanı ile e-posta adreslerine sahiptir. Uygulamanızda Apple ile Giriş Yap özelliğini kullandığınızda, bu anonimleştirilmiş Apple Kimlikleriyle ilgili olarak Apple'ın geçerli geliştirici politikalarına veya hükümlerine uymanız gerekir.

Bu, kişisel bilgileri doğrudan anonimleştirilmiş bir Apple Kimliği ile ilişkilendirmeden önce gerekli tüm kullanıcı onayını almayı içerir. Firebase Kimlik Doğrulaması kullanılırken bu, aşağıdaki eylemleri içerebilir:

  • Bir e-posta adresini anonimleştirilmiş bir Apple Kimliğine bağlayın veya tersini yapın.
  • 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 kapsamlı 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.
  1. Auth ve App 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. Edinme firebase::auth::Auth sizin için sınıf firebase::App . App ve Auth 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 Giriş Yapma süreci iOS ve Android platformları arasında değişiklik gösterir.

İOS'ta

Kullanıcılarınızın kimliğini, C ++ kodunuzdan çağrılan Apple Sign In Objective-C SDK ile Firebase ile doğrulayın.

  1. Her oturum açma isteği için, aldığınız kimlik jetonunun özellikle uygulamanızın kimlik doğrulama isteğine yanıt olarak verildiğinden emin olmak için kullanacağınız rastgele bir dize ("nonce") oluşturun. Bu adım, yeniden oynatma 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--;
            }
          }
        }
      }
    
    

    Nonce'nin SHA256 hash'ini oturum açma talebinizle birlikte göndereceksiniz ve Apple, yanıtta değişmeden iletecektir. Firebase, orijinal nonce'ye hashing uygulayarak ve Apple tarafından iletilen değerle karşılaştırarak yanıtı doğrular.

  2. Apple'ın oturum açma akışını, isteğinizde nonce'nin SHA256 karması ve Apple'ın yanıtını işleyecek temsilci sınıfı dahil olmak üzere 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ı yönetin. Oturum açma başarılı olduysa, Firebase ile kimlik doğrulaması yapmak için Apple'ın yanıtından gelen kimlik jetonunu 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);
          }
        }
    
  4. Bir Firebase Kimlik Bilgisi oluşturmak ve Firebase'de oturum açmak için ortaya çıkan jeton 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);
    
  5. Aynı model, yakın zamanda oturum Reauthenticate 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);
    
  6. Aynı kalıp, bir hesabı Apple Giriş Yapma ile bağlamak için kullanılabilir. Ancak, mevcut bir Firebase hesabı, bağlantı kurmaya çalıştığınız Apple hesabına zaten bağlandığında bir hatayla karşılaşabilirsiniz. Bu durumda gelecek bir durumu dönecektir kAuthErrorCredentialAlreadyInUse ve Userınfo nesnesi SignInResult geçerli içerebilir updated_credential . Bu kimlik bilgisi, Apple bağlantılı hesapta SignInWithCredential aracılığıyla başka bir Apple Sign In belirteci ve nonce oluşturmaya gerek kalmadan oturum açmak için kullanılabilir.

    Eğer kullanması gerektiğini Not LinkAndRetrieveDataWithCredential olarak kimlik içermesi Bu işlem için updated_credential üyesidir SignInResult.UserInfo nesne.

    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 Girişini uygulamanıza entegre ederek Firebase ile kullanıcılarınızın kimliklerini 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ğini oluşturun.

    firebase::auth::FederatedOAuthProviderData provider_data("apple.com");
    
  2. İsteğe bağlı: Kimlik doğrulama sağlayıcısından talep etmek istediğiniz varsayılanın ötesinde 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 Giriş Yap 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. Auth sağlayıcı nesnesini kullanarak Firebase ile kimlik doğrulayı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 geçireceğini 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 Gelecekte bir geri arama bekleyebilir veya kaydedebilir .

  6. Aynı model, yakın zamanda oturum ReauthenticateWithProvider 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 Gelecekte bir geri arama bekleyebilir veya kaydedebilir .

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

    Apple'ın, Apple hesaplarını diğer verilere bağlamadan önce kullanıcılardan açık izin 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çarak 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 bu 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, görünen ad gibi kullanıcı bilgilerini, bir kullanıcı ilk kez oturum açtığında uygulamalarla paylaşır. Genellikle Firebase, bir kullanıcı Apple ile ilk kez oturum açtığında görünen adı kaydeder ve bunu getCurrentUser().getDisplayName() . Ancak, Apple'ı daha önce bir kullanıcıyı Firebase kullanmadan uygulamada oturum açmak için kullandıysanız, Apple Firebase'e kullanıcının görünen adını sağlamaz.

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ı 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 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. Kullanıcıları Yönetme konusuna bakın.

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