Catch up on everthing we announced at this year's Firebase Summit. Learn more

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ı 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

Elma sadece üyeleri tarafından yapılandırılabilir ile Giriş Yap Elma Geliştirici Programı .

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. Bölümünde "ile Apple In yapılandır Sign" takip ediniz Apple platformları ve / veya Android ilerlemeden önce kılavuzları.

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

  1. In Firebase konsoluna , Auth bölümünü açın. Yöntem sekmesinde İşaret Üzerine Apple sağlayıcı sağlar.
  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. Android projeye Firebase ekleyin . Uygulamanızı Firebase konsolunda ayarlarken uygulamanızın SHA-1 imzasını kaydettiğinizden emin olun.
      2. In Firebase konsoluna , Auth bölümünü açın. Yöntem sekmesinde İşaret Üzerine Apple sağlayıcı sağlar. Ö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

Bu seçeneği Elma kullanıcılara giriş yaparken kendi e-posta adresi de dahil olmak verilerini, anonim duruma seçeneği sunar ile Oturum. Kullanıcılar etki alanı ile e-posta adreslerine sahip privaterelay.appleid.com . 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 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.

Erişim firebase::auth::Auth sınıfını

Auth sınıfı tüm API çağrıları için kapıdır.
  1. Auth ve App başlık dosyalarını ekleyin:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. Senin başlatma kodunda, bir oluşturmak 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. Edinme firebase::auth::Auth sizin için sınıf firebase::App . Arasında bire-bir eşleme vardır App ve Auth .
    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.

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

  2. İ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;
      }
    
  3. 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);
          }
        }
    
  4. 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);
    
  5. Aynı desen ile kullanılabilir Reauthenticate son girişi gerektiren hassas operasyonlar için taze kimlik bilgilerini almak için kullanılabilir.

    firebase::Future<firebase::auth::SignInResult> result =
        user->Reauthenticate(credential);
    
  6. 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 durumda gelecek bir durumu dönecektir kAuthErrorCredentialAlreadyInUse ve Userınfo nesnesi SignInResult geçerli içerebilir updated_credential . Bu kimlik üzerinden Elma bağlantılı hesapta oturum açmak için kullanılabilir SignInWithCredential belirteci ve nonce Başka Apple Oturum üretmek için gerek kalmadan.

    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 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:

  1. Bir örneğini Construct FederatedOAuthProviderData Apple için sağlayıcı kimliği uygun yapılandırılmış.

    firebase::auth::FederatedOAuthProviderData provider_data("apple.com");
    
  2. İsteğe bağlı: doğrulama sağlayıcısından talep istediğiniz varsayılan ötesinde ek OAuth 2.0 kapsamlarını belirtme.

    provider_data.scopes.push_back("email");
    provider_data.scopes.push_back("name");
    
  3. İsteğe bağlı: İngilizce dışında bir dilde Apple'ın oturum açma ekranına görüntülemek istiyorsanız, set locale parametre. Bkz Elma docs ile Oturum desteklenen yerler için.

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

    Akışındaki işaretini başlatmak için çağrı signInWithProvider :

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

    Başvuruların bekleyin ya edebilir Geleceği Üzerine Bir geri arama kayıt .

  6. Aynı desen ile kullanılabilir ReauthenticateWithProvider son girişi gerektiren hassas operasyonlar için taze kimlik bilgilerini almak için kullanılabilir.

    firebase::Future<firebase::auth::SignInResult> result =
      user->ReauthenticateWithProvider(provider_data);
    

    Başvuruların bekleyin ya edebilir Geleceği Üzerine Bir geri arama kayıt .

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

    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ı (formun bu kullanıcı için app Apple hükümleri benzersiz e-posta adresi ile e-postalarını paylaşmamak seçtiğinde xyz@privaterelay.appleid.com , uygulamanızla o hisse). Ö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.

Böyle uygulamalarla görünen adı ilk kez olarak Apple sadece hisse kullanıcı bilgileri bir oturum açar. Genellikle Firebase saklar görünen ad ilk defa birlikte alabilirsiniz Apple ile bir kullanıcı oturum getCurrentUser().getDisplayName() . 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ının kimlik bilgileriyle (yani kullanıcı adı ve parolası, telefon numarası veya kimlik doğrulama sağlayıcısı 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 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ı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.