Apple'ı JavaScript ile 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

Apple Developer sitesinde aşağıdakileri yapın:

  1. Web için Apple ile Oturum Açmayı Yapılandırma bölümünün ilk bölümünde açıklandığı gibi web sitenizi uygulamanızla ilişkilendirin. İstendiğinde aşağıdaki URL'yi Dönüş URL'si olarak kaydedin:

    https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler

    Firebase proje kimliğinizi Firebase konsol ayarları sayfasından alabilirsiniz.

    İşiniz bittiğinde, bir sonraki bölümde ihtiyaç duyacağınız yeni Hizmet Kimliğinizi not edin.

  2. Apple özel anahtarıyla Oturum Açma oluşturun . Bir sonraki bölümde yeni özel anahtarınıza ve anahtar kimliğinize ihtiyacınız olacak.
  3. E-posta bağlantısıyla oturum açma, e-posta adresi doğrulama, hesap değişikliği iptali ve diğerleri dahil olmak üzere kullanıcılara e-posta gönderen Firebase Authentication özelliklerinden herhangi birini kullanıyorsanız, Apple özel e-posta aktarma hizmetini yapılandırın ve noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com kaydedin (veya özelleştirilmiş e-posta şablonu etki alanınız) böylece Apple, Firebase Authentication tarafından gönderilen e-postaları anonimleştirilmiş Apple e-posta adreslerine aktarabilir.

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

  1. Firebase'i projenize ekleyin .
  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.

Oturum açma akışını Firebase SDK ile yönetin

Bir web uygulaması oluşturuyorsanız, kullanıcılarınızın Apple hesaplarını kullanarak Firebase ile kimliklerini doğrulamanın en kolay yolu, tüm oturum açma akışını Firebase JavaScript SDK ile yönetmektir.

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

  1. İlgili sağlayıcı kimliğini apple.com kullanarak bir OAuthProvider örneği oluşturun.

    Web modular API

    import { OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('apple.com');

    Web namespaced API

    var provider = new firebase.auth.OAuthProvider('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.

    Web modular API

    provider.addScope('email');
    provider.addScope('name');

    Web namespaced API

    provider.addScope('email');
    provider.addScope('name');

    Varsayılan olarak, E-posta adresi başına bir hesap etkinleştirildiğinde Firebase, e-posta ve ad kapsamlarını ister. Bu ayarı E-posta adresi başına birden fazla hesap olarak değiştirirseniz Firebase, siz belirtmediğiniz sürece Apple'dan herhangi bir kapsam talep etmez.

  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.

    Web modular API

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });

    Web namespaced API

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });
  4. OAuth sağlayıcı nesnesini kullanarak Firebase ile kimlik doğrulaması yapın. Bir açılır pencere açarak veya oturum açma sayfasına yönlendirerek kullanıcılarınızdan Apple Hesaplarıyla oturum açmalarını isteyebilirsiniz. Mobil cihazlarda yönlendirme yöntemi tercih edilmektedir.

    • Açılır pencereyle oturum açmak içinsignInWithPopup signInWithPopup() öğesini çağırın:

      Web modular API

      import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      signInWithPopup(auth, provider)
        .then((result) => {
          // The signed-in user info.
          const user = result.user;
      
          // Apple credential
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
      
          // IdP data available using getAdditionalUserInfo(result)
          // ...
        })
        .catch((error) => {
          // Handle Errors here.
          const errorCode = error.code;
          const errorMessage = error.message;
          // The email of the user's account used.
          const email = error.customData.email;
          // The credential that was used.
          const credential = OAuthProvider.credentialFromError(error);
      
          // ...
        });

      Web namespaced API

      firebase
        .auth()
        .signInWithPopup(provider)
        .then((result) => {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
      
          // The signed-in user info.
          var user = result.user;
      
          // You can also get the Apple OAuth Access and ID Tokens.
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
      
          // IdP data available using getAdditionalUserInfo(result)
        // ...
        })
        .catch((error) => {
          // Handle Errors here.
          var errorCode = error.code;
          var errorMessage = error.message;
          // The email of the user's account used.
          var email = error.email;
          // The firebase.auth.AuthCredential type that was used.
          var credential = error.credential;
      
          // ...
        });
    • Oturum açma sayfasına yönlendirerek oturum açmak için signInWithRedirect() öğesini çağırın:

    signInWithRedirect , linkWithRedirect veya reauthenticateWithRedirect kullanırken en iyi uygulamaları izleyin.

    Web modular API

    import { getAuth, signInWithRedirect } from "firebase/auth";
    
    const auth = getAuth();
    signInWithRedirect(auth, provider);

    Web namespaced API

    firebase.auth().signInWithRedirect(provider);

    Kullanıcı oturum açmayı tamamlayıp sayfaya döndükten sonra, getRedirectResult() öğesini çağırarak oturum açma sonucunu alabilirsiniz:

    Web modular API

    import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth";
    
    // Result from Redirect auth flow.
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        const credential = OAuthProvider.credentialFromResult(result);
        if (credential) {
          // You can also get the Apple OAuth Access and ID Tokens.
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
        }
        // The signed-in user info.
        const user = result.user;
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.customData.email;
        // The credential that was used.
        const credential = OAuthProvider.credentialFromError(error);
    
        // ...
      });

    Web namespaced API

    // Result from Redirect auth flow.
    firebase
      .auth()
      .getRedirectResult()
      .then((result) => {
        if (result.credential) {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
    
          // You can get the Apple OAuth Access and ID Tokens.
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
    
          // IdP data available in result.additionalUserInfo.profile.
          // ...
        }
        // The signed-in user info.
        var user = result.user;
      })
      .catch((error) => {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
        // The email of the user's account used.
        var email = error.email;
        // The firebase.auth.AuthCredential type that was used.
        var credential = error.credential;
    
        // ...
      });

    Burası aynı zamanda hataları yakalayıp yönetebileceğiniz yerdir. Hata kodlarının listesi için API referansına bakı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 firebase.auth().currentUser.displayName . 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.

Yeniden kimlik doğrulama ve hesap bağlama

Aynı model, yakın zamanda oturum açmayı gerektiren hassas işlemler için yeni bir kimlik bilgisi almak amacıyla kullanabileceğiniz reauthenticateWithPopup() ve reauthenticateWithRedirect() ile kullanılabilir:

Web modular API

import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth";

// Result from Redirect auth flow.
const auth = getAuth();
const provider = new OAuthProvider('apple.com');

reauthenticateWithPopup(auth.currentUser, provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.

    // The signed-in user info.
    const user = result.user;

    // You can also get the Apple OAuth Access and ID Tokens.
    const credential = OAuthProvider.credentialFromResult(result);
    const accessToken = credential.accessToken;
    const idToken = credential.idToken;

    // ...
  })
  .catch((error) => {
    // Handle Errors here.
    const errorCode = error.code;
    const errorMessage = error.message;
    // The email of the user's account used.
    const email = error.customData.email;
    // The credential that was used.
    const credential = OAuthProvider.credentialFromError(error);

    // ...
  });

Web namespaced API

const provider = new firebase.auth.OAuthProvider('apple.com');

firebase
  .auth()
  .currentUser
  .reauthenticateWithPopup(provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.
    /** @type {firebase.auth.OAuthCredential} */
    var credential = result.credential;

    // The signed-in user info.
    var user = result.user;
     // You can also get the Apple OAuth Access and ID Tokens.
    var accessToken = credential.accessToken;
    var idToken = credential.idToken;

    // IdP data available in result.additionalUserInfo.profile.
      // ...
  })
  .catch((error) => {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // The email of the user's account used.
    var email = error.email;
    // The firebase.auth.AuthCredential type that was used.
    var credential = error.credential;

    // ...
  });

Ayrıca, farklı kimlik sağlayıcılarını mevcut hesaplara bağlamak için linkWithPopup() ve linkWithRedirect() yöntemlerini 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:

Web modular API

import { getAuth, linkWithPopup, FacebookAuthProvider } from "firebase/auth";

const auth = getAuth();
const provider = new FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
linkWithPopup(auth.currentUser, provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // ...

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

Web namespaced API

const provider = new firebase.auth.FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
firebase.auth().currentUser.linkWithPopup(provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // Facebook additional data available in result.additionalUserInfo.profile,

      // Additional Facebook OAuth access token can also be retrieved.
      // result.credential.accessToken

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

Chrome uzantısında Firebase ile kimlik doğrulama

Bir Chrome uzantısı uygulaması oluşturuyorsanız Ekran Dışı Belgeler kılavuzuna bakın.

Özel alan adını, varsayılan firebaseapp.com alan adına benzer şekilde Apple ile doğrulamanız gerektiğini unutmayın:

http://auth.custom.example.com/.well-known/apple-developer-domain-association.txt

Jeton iptali

Apple, hesap oluşturmayı destekleyen uygulamaların , App Store İnceleme Yönergeleri'nde açıklandığı gibi, kullanıcıların uygulama içinde hesaplarını silme işlemini başlatmasına izin vermesini şart koşuyor

Bu gereksinimi karşılamak için aşağıdaki adımları uygulayın:

  1. Apple ile Oturum Açma sağlayıcı yapılandırmasının Hizmet Kimliği ve OAuth kod akışı yapılandırması bölümünü, Apple ile Oturum Açmayı Yapılandırma bölümünde belirtildiği gibi doldurduğunuzdan emin olun.

  2. Firebase, Apple ile Giriş Yap ile kullanıcılar oluşturulduğunda kullanıcı jetonlarını saklamadığından, jetonlarını iptal edip hesabı silmeden önce kullanıcıdan tekrar oturum açmasını istemeniz gerekir.

    Ardından, OAuthCredential Apple OAuth erişim belirtecini edinin ve Apple OAuth erişim belirtecini iptal etmek üzere revokeAccessToken(auth, token) öğesini çağırmak için bunu kullanın.

    const provider = new OAuthProvider('apple.com');
    provider.addScope('email');
    provider.addScope('name');
    
    const auth = getAuth();
    signInWithPopup(auth, provider).then(result => {
      // Get the Apple OAuth access token.
      const credential = OAuthProvider.credentialFromResult(result);
      const accessToken = credential.accessToken;
    
      // Revoke the Apple OAuth access token.
      revokeAccessToken(auth, accessToken)
        .then(() => {
          // Token revoked.
    
          // Delete the user account.
          // ...
        })
        .catch(error => {
          // An error happened.
          // ...
        });
    });
    
  3. Son olarak kullanıcı hesabını (ve ilişkili tüm verileri) silin .

Gelişmiş: Node.js'de Firebase ile kimlik doğrulama

Bir Node.js uygulamasında Firebase ile kimlik doğrulamak için:

  1. Kullanıcının Apple Hesabıyla oturum açın ve kullanıcının Apple Kimliği belirtecini alın. Bunu birkaç yolla başarabilirsiniz. Örneğin, Node.js uygulamanızın bir tarayıcı ön ucu varsa:

    1. Arka ucunuzda rastgele bir dize ("tek seferlik") oluşturun ve bunun SHA256 karmasını hesaplayın. Nonce, arka ucunuz ile Apple'ın kimlik doğrulama sunucuları arasındaki tek gidiş-dönüş yolculuğunu doğrulamak için kullandığınız tek kullanımlık bir değerdir.

      Web modular API

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = (length) => {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        let nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.slice(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');

      Web namespaced API

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = function(length) {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        var nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.slice(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');
    2. Oturum açma sayfanızda, Apple ile Oturum Açma yapılandırmanızda karma oluşturmalı nonce değerini belirtin:

      <script src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
      <div id="appleid-signin" data-color="black" data-border="true" data-type="sign in"></div>
      <script>
          AppleID.auth.init({
              clientId: YOUR_APPLE_CLIENT_ID,
              scope: 'name email',
              redirectURI: URL_TO_YOUR_REDIRECT_HANDLER,  // See the next step.
              state: '[STATE]',  // Optional value that Apple will send back to you
                                 // so you can return users to the same context after
                                 // they sign in.
              nonce: HASHED_NONCE  // The hashed nonce you generated in the previous step.
          });
      </script>
      
    3. POSTed kimlik doğrulama yanıtı sunucusu tarafından Apple Kimliği belirtecini alın:

      app.post('/redirect', (req, res) => {
        const savedState = req.cookies.__session;
        const code = req.body.code;
        const state = req.body.state;
        const appleIdToken = req.body.id_token;
        if (savedState !== state || !code) {
          res.status(403).send('403: Permission denied');
        } else {
          // Sign in with Firebase using appleIdToken. (See next step).
        }
      });
      

    Ayrıca bkz. Apple ile Oturum Açmak için Web Sayfanızı Yapılandırma .

  2. Kullanıcının Apple Kimliği belirtecini aldıktan sonra bunu bir Kimlik Bilgisi nesnesi oluşturmak için kullanın ve ardından kimlik bilgileriyle kullanıcıda oturum açın:

    Web modular API

    import { getAuth, signInWithCredential, OAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    
    // Build Firebase credential with the Apple ID token.
    const provider = new OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    signInWithCredential(auth, authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

    Web namespaced API

    // Build Firebase credential with the Apple ID token.
    const provider = new firebase.auth.OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    firebase.auth().signInWithCredential(authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

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ızın kimlik doğrulama durumunu öğrenmenin önerilen yolu, Auth Doğrulama nesnesine bir gözlemci ayarlamaktır. Daha sonra kullanıcının temel profil bilgilerini 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.

Kimlik doğrulama sağlayıcısı kimlik bilgilerini mevcut bir kullanıcı hesabına bağlayarak kullanıcıların birden fazla kimlik doğrulama sağlayıcısı kullanarak uygulamanızda oturum açmasına izin verebilirsiniz.

Bir kullanıcının oturumunu kapatmak için signOut arayın:

Web modular API

import { getAuth, signOut } from "firebase/auth";

const auth = getAuth();
signOut(auth).then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});

Web namespaced API

firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});
,

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

Apple Developer sitesinde aşağıdakileri yapın:

  1. Web için Apple ile Oturum Açmayı Yapılandırma bölümünün ilk bölümünde açıklandığı gibi web sitenizi uygulamanızla ilişkilendirin. İstendiğinde aşağıdaki URL'yi Dönüş URL'si olarak kaydedin:

    https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler

    Firebase proje kimliğinizi Firebase konsol ayarları sayfasından alabilirsiniz.

    İşiniz bittiğinde, bir sonraki bölümde ihtiyaç duyacağınız yeni Hizmet Kimliğinizi not edin.

  2. Apple özel anahtarıyla Oturum Açma oluşturun . Bir sonraki bölümde yeni özel anahtarınıza ve anahtar kimliğinize ihtiyacınız olacak.
  3. E-posta bağlantısıyla oturum açma, e-posta adresi doğrulama, hesap değişikliği iptali ve diğerleri dahil olmak üzere kullanıcılara e-posta gönderen Firebase Authentication özelliklerinden herhangi birini kullanıyorsanız, Apple özel e-posta aktarma hizmetini yapılandırın ve noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com kaydedin (veya özelleştirilmiş e-posta şablonu etki alanınız) böylece Apple, Firebase Authentication tarafından gönderilen e-postaları anonimleştirilmiş Apple e-posta adreslerine aktarabilir.

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

  1. Firebase'i projenize ekleyin .
  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.

Oturum açma akışını Firebase SDK ile yönetin

Bir web uygulaması oluşturuyorsanız, Apple hesaplarını kullanarak kullanıcılarınızın Firebase ile kimliklerini doğrulamanın en kolay yolu, tüm oturum açma akışını Firebase JavaScript SDK ile yönetmektir.

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

  1. İlgili sağlayıcı kimliğini apple.com kullanarak bir OAuthProvider örneği oluşturun.

    Web modular API

    import { OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('apple.com');

    Web namespaced API

    var provider = new firebase.auth.OAuthProvider('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.

    Web modular API

    provider.addScope('email');
    provider.addScope('name');

    Web namespaced API

    provider.addScope('email');
    provider.addScope('name');

    Varsayılan olarak, E-posta adresi başına bir hesap etkinleştirildiğinde Firebase, e-posta ve ad kapsamlarını ister. Bu ayarı E-posta adresi başına birden fazla hesap olarak değiştirirseniz Firebase, siz belirtmediğiniz sürece Apple'dan herhangi bir kapsam talep etmez.

  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.

    Web modular API

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });

    Web namespaced API

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });
  4. OAuth sağlayıcı nesnesini kullanarak Firebase ile kimlik doğrulaması yapın. Bir açılır pencere açarak veya oturum açma sayfasına yönlendirerek kullanıcılarınızdan Apple Hesaplarıyla oturum açmalarını isteyebilirsiniz. Mobil cihazlarda yönlendirme yöntemi tercih edilmektedir.

    • Açılır pencereyle oturum açmak içinsignInWithPopup signInWithPopup() öğesini çağırın:

      Web modular API

      import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      signInWithPopup(auth, provider)
        .then((result) => {
          // The signed-in user info.
          const user = result.user;
      
          // Apple credential
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
      
          // IdP data available using getAdditionalUserInfo(result)
          // ...
        })
        .catch((error) => {
          // Handle Errors here.
          const errorCode = error.code;
          const errorMessage = error.message;
          // The email of the user's account used.
          const email = error.customData.email;
          // The credential that was used.
          const credential = OAuthProvider.credentialFromError(error);
      
          // ...
        });

      Web namespaced API

      firebase
        .auth()
        .signInWithPopup(provider)
        .then((result) => {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
      
          // The signed-in user info.
          var user = result.user;
      
          // You can also get the Apple OAuth Access and ID Tokens.
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
      
          // IdP data available using getAdditionalUserInfo(result)
        // ...
        })
        .catch((error) => {
          // Handle Errors here.
          var errorCode = error.code;
          var errorMessage = error.message;
          // The email of the user's account used.
          var email = error.email;
          // The firebase.auth.AuthCredential type that was used.
          var credential = error.credential;
      
          // ...
        });
    • Oturum açma sayfasına yönlendirerek oturum açmak için signInWithRedirect() öğesini çağırın:

    signInWithRedirect , linkWithRedirect veya reauthenticateWithRedirect kullanırken en iyi uygulamaları izleyin.

    Web modular API

    import { getAuth, signInWithRedirect } from "firebase/auth";
    
    const auth = getAuth();
    signInWithRedirect(auth, provider);

    Web namespaced API

    firebase.auth().signInWithRedirect(provider);

    Kullanıcı oturum açmayı tamamlayıp sayfaya döndükten sonra, getRedirectResult() öğesini çağırarak oturum açma sonucunu alabilirsiniz:

    Web modular API

    import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth";
    
    // Result from Redirect auth flow.
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        const credential = OAuthProvider.credentialFromResult(result);
        if (credential) {
          // You can also get the Apple OAuth Access and ID Tokens.
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
        }
        // The signed-in user info.
        const user = result.user;
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.customData.email;
        // The credential that was used.
        const credential = OAuthProvider.credentialFromError(error);
    
        // ...
      });

    Web namespaced API

    // Result from Redirect auth flow.
    firebase
      .auth()
      .getRedirectResult()
      .then((result) => {
        if (result.credential) {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
    
          // You can get the Apple OAuth Access and ID Tokens.
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
    
          // IdP data available in result.additionalUserInfo.profile.
          // ...
        }
        // The signed-in user info.
        var user = result.user;
      })
      .catch((error) => {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
        // The email of the user's account used.
        var email = error.email;
        // The firebase.auth.AuthCredential type that was used.
        var credential = error.credential;
    
        // ...
      });

    Burası aynı zamanda hataları yakalayıp yönetebileceğiniz yerdir. Hata kodlarının listesi için API referansına bakı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 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 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 firebase.auth().currentUser.displayName . 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ğlamaz.

Yeniden kimlik doğrulama ve hesap bağlama

Aynı model, yakın zamanda oturum açmayı gerektiren hassas işlemler için yeni bir kimlik bilgisi almak amacıyla kullanabileceğiniz reauthenticateWithPopup() ve reauthenticateWithRedirect() ile kullanılabilir:

Web modular API

import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth";

// Result from Redirect auth flow.
const auth = getAuth();
const provider = new OAuthProvider('apple.com');

reauthenticateWithPopup(auth.currentUser, provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.

    // The signed-in user info.
    const user = result.user;

    // You can also get the Apple OAuth Access and ID Tokens.
    const credential = OAuthProvider.credentialFromResult(result);
    const accessToken = credential.accessToken;
    const idToken = credential.idToken;

    // ...
  })
  .catch((error) => {
    // Handle Errors here.
    const errorCode = error.code;
    const errorMessage = error.message;
    // The email of the user's account used.
    const email = error.customData.email;
    // The credential that was used.
    const credential = OAuthProvider.credentialFromError(error);

    // ...
  });

Web namespaced API

const provider = new firebase.auth.OAuthProvider('apple.com');

firebase
  .auth()
  .currentUser
  .reauthenticateWithPopup(provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.
    /** @type {firebase.auth.OAuthCredential} */
    var credential = result.credential;

    // The signed-in user info.
    var user = result.user;
     // You can also get the Apple OAuth Access and ID Tokens.
    var accessToken = credential.accessToken;
    var idToken = credential.idToken;

    // IdP data available in result.additionalUserInfo.profile.
      // ...
  })
  .catch((error) => {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // The email of the user's account used.
    var email = error.email;
    // The firebase.auth.AuthCredential type that was used.
    var credential = error.credential;

    // ...
  });

Ayrıca, farklı kimlik sağlayıcılarını mevcut hesaplara bağlamak için linkWithPopup() ve linkWithRedirect() yöntemlerini 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:

Web modular API

import { getAuth, linkWithPopup, FacebookAuthProvider } from "firebase/auth";

const auth = getAuth();
const provider = new FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
linkWithPopup(auth.currentUser, provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // ...

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

Web namespaced API

const provider = new firebase.auth.FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
firebase.auth().currentUser.linkWithPopup(provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // Facebook additional data available in result.additionalUserInfo.profile,

      // Additional Facebook OAuth access token can also be retrieved.
      // result.credential.accessToken

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

Chrome uzantısında Firebase ile kimlik doğrulama

Bir Chrome uzantısı uygulaması oluşturuyorsanız Ekran Dışı Belgeler kılavuzuna bakın.

Özel alan adını, varsayılan firebaseapp.com alan adına benzer şekilde Apple ile doğrulamanız gerektiğini unutmayın:

http://auth.custom.example.com/.well-known/apple-developer-domain-association.txt

Jeton iptali

Apple, hesap oluşturmayı destekleyen uygulamaların , App Store İnceleme Yönergeleri'nde açıklandığı gibi, kullanıcıların uygulama içinde hesaplarını silme işlemini başlatmasına izin vermesini şart koşuyor

Bu gereksinimi karşılamak için aşağıdaki adımları uygulayın:

  1. Apple ile Oturum Açma sağlayıcı yapılandırmasının Hizmet Kimliği ve OAuth kod akışı yapılandırması bölümünü, Apple ile Oturum Açmayı Yapılandırma bölümünde belirtildiği gibi doldurduğunuzdan emin olun.

  2. Firebase, Apple ile Giriş Yap ile kullanıcılar oluşturulduğunda kullanıcı jetonlarını saklamadığından, jetonlarını iptal edip hesabı silmeden önce kullanıcıdan tekrar oturum açmasını istemeniz gerekir.

    Ardından, OAuthCredential Apple OAuth erişim belirtecini edinin ve Apple OAuth erişim belirtecini iptal etmek üzere revokeAccessToken(auth, token) öğesini çağırmak için bunu kullanın.

    const provider = new OAuthProvider('apple.com');
    provider.addScope('email');
    provider.addScope('name');
    
    const auth = getAuth();
    signInWithPopup(auth, provider).then(result => {
      // Get the Apple OAuth access token.
      const credential = OAuthProvider.credentialFromResult(result);
      const accessToken = credential.accessToken;
    
      // Revoke the Apple OAuth access token.
      revokeAccessToken(auth, accessToken)
        .then(() => {
          // Token revoked.
    
          // Delete the user account.
          // ...
        })
        .catch(error => {
          // An error happened.
          // ...
        });
    });
    
  3. Son olarak kullanıcı hesabını (ve ilişkili tüm verileri) silin .

Gelişmiş: Node.js'de Firebase ile kimlik doğrulama

Bir Node.js uygulamasında Firebase ile kimlik doğrulamak için:

  1. Kullanıcının Apple Hesabıyla oturum açın ve kullanıcının Apple Kimliği belirtecini alın. Bunu birkaç yolla başarabilirsiniz. Örneğin, Node.js uygulamanızın bir tarayıcı ön ucu varsa:

    1. Arka ucunuzda rastgele bir dize ("tek seferlik") oluşturun ve bunun SHA256 karmasını hesaplayın. Nonce, arka ucunuz ile Apple'ın kimlik doğrulama sunucuları arasındaki tek gidiş-dönüş yolculuğunu doğrulamak için kullandığınız tek kullanımlık bir değerdir.

      Web modular API

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = (length) => {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        let nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.slice(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');

      Web namespaced API

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = function(length) {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        var nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.slice(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');
    2. Oturum açma sayfanızda, Apple ile Oturum Açma yapılandırmanızda karma oluşturmalı nonce değerini belirtin:

      <script src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
      <div id="appleid-signin" data-color="black" data-border="true" data-type="sign in"></div>
      <script>
          AppleID.auth.init({
              clientId: YOUR_APPLE_CLIENT_ID,
              scope: 'name email',
              redirectURI: URL_TO_YOUR_REDIRECT_HANDLER,  // See the next step.
              state: '[STATE]',  // Optional value that Apple will send back to you
                                 // so you can return users to the same context after
                                 // they sign in.
              nonce: HASHED_NONCE  // The hashed nonce you generated in the previous step.
          });
      </script>
      
    3. POSTed kimlik doğrulama yanıtı sunucusu tarafından Apple Kimliği belirtecini alın:

      app.post('/redirect', (req, res) => {
        const savedState = req.cookies.__session;
        const code = req.body.code;
        const state = req.body.state;
        const appleIdToken = req.body.id_token;
        if (savedState !== state || !code) {
          res.status(403).send('403: Permission denied');
        } else {
          // Sign in with Firebase using appleIdToken. (See next step).
        }
      });
      

    Ayrıca bkz. Apple ile Oturum Açmak için Web Sayfanızı Yapılandırma .

  2. Kullanıcının Apple Kimliği belirtecini aldıktan sonra bunu bir Kimlik Bilgisi nesnesi oluşturmak için kullanın ve ardından kimlik bilgileriyle kullanıcıda oturum açın:

    Web modular API

    import { getAuth, signInWithCredential, OAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    
    // Build Firebase credential with the Apple ID token.
    const provider = new OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    signInWithCredential(auth, authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

    Web namespaced API

    // Build Firebase credential with the Apple ID token.
    const provider = new firebase.auth.OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    firebase.auth().signInWithCredential(authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

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 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ızın kimlik doğrulama durumunu öğrenmenin önerilen yolu, Auth Doğrulama nesnesine bir gözlemci ayarlamaktır. Daha sonra kullanıcının temel profil bilgilerini 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.

Kimlik doğrulama sağlayıcısı kimlik bilgilerini mevcut bir kullanıcı hesabına bağlayarak kullanıcıların birden fazla kimlik doğrulama sağlayıcısı kullanarak uygulamanızda oturum açmasına izin verebilirsiniz.

Bir kullanıcının oturumunu kapatmak için signOut arayın:

Web modular API

import { getAuth, signOut } from "firebase/auth";

const auth = getAuth();
signOut(auth).then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});

Web namespaced API

firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});