Bu belgede, üçüncü taraf çerezlerini engelleyen tarayıcılarda yönlendirmeli oturum açma özelliğini kullanmayla ilgili en iyi uygulamalar açıklanmaktadır. signInWithRedirect() öğesinin üretim ortamlarında tüm tarayıcılarda beklendiği gibi çalışması için burada listelenen seçeneklerden birini uygulamanız gerekir.
Genel Bakış
signInWithRedirect() akışını sizin ve kullanıcılarınız için sorunsuz hale getirmek amacıyla Firebase Authentication JavaScript SDK, uygulamanızın Firebase Hosting alanına bağlanan bir kaynaklar arası iframe kullanır.
Ancak bu mekanizma, üçüncü taraf depolama alanına erişimi engelleyen tarayıcılarda çalışmaz.
Kullanıcılarınızdan tarayıcıda depolama bölümleme özelliklerini devre dışı bırakmalarını istemek nadiren bir seçenek olduğundan, bunun yerine kullanım alanınızın özelliklerine bağlı olarak aşağıdaki kurulum seçeneklerinden birini uygulamanız gerekir.
- Uygulamanızı
firebaseapp.comalan adının bir alt alanında Firebase Hosting ile barındırıyorsanız bu sorundan etkilenmezsiniz ve herhangi bir işlem yapmanız gerekmez. - Uygulamanızı Firebase Hosting ile özel bir alan veya
web.appalanının bir alt alanında barındırıyorsanız 1. seçeneği kullanın. - Uygulamanızı Firebase dışında bir hizmetle barındırıyorsanız 2. Seçenek, 3. Seçenek, 4. Seçenek veya 5. Seçenek'i kullanın.
1. seçenek: Firebase yapılandırmanızı, özel alanınızı authDomain olarak kullanacak şekilde güncelleyin
Uygulamanızı özel bir alan kullanarak Firebase Hosting ile barındırıyorsanız Firebase SDK'sını authDomain olarak özel alanınızı kullanacak şekilde yapılandırabilirsiniz. Bu, uygulamanızın ve kimlik doğrulama iFrame'inin aynı alanı kullanmasını sağlayarak oturum açma sorununu önler. (Firebase Hosting'i kullanmıyorsanız farklı bir seçenek kullanmanız gerekir.) Özel alan adını, kimlik doğrulama için kullandığınız projede ayarladığınızdan emin olun.
Firebase yapılandırmanızı, özel alanınızı kimlik doğrulama alanı olarak kullanacak şekilde güncellemek için aşağıdakileri yapın:
Firebase JS SDK'sını, özel alanınızı
authDomainolarak kullanacak şekilde yapılandırın:const firebaseConfig = { apiKey: "<api-key>", authDomain: "<the-domain-that-serves-your-app>", databaseURL: "<database-url>", projectId: "<project-id>", appId: "<app-id>" };
Yeni
authDomaindeğerini, OAuth sağlayıcınızın yetkilendirilmiş yönlendirme URI'leri listesine ekleyin. Bu işlemi nasıl yapacağınız sağlayıcıya bağlıdır ancak genel olarak kesin talimatlar için herhangi bir sağlayıcının "Başlamadan önce" bölümünü (örneğin, Facebook sağlayıcısı) takip edebilirsiniz. Yetkilendirme için güncellenen URI,https://<the-domain-that-serves-your-app>/__/auth/handlerşeklinde görünüyor. Sondaki/__/auth/handlerönemlidir.Benzer şekilde, SAML sağlayıcı kullanıyorsanız yeni
authDomaindeğerini SAML Assertion Consumer Service (ACS) URL'sine ekleyin.continue_urialanınızın yetkili alanlar listesinde olduğundan emin olun./__/firebase/init.jsonadresinde barındırılan en güncel Firebase yapılandırma dosyasını getirmek için gerekirse Firebase Hosting ile yeniden dağıtın.
2. seçenek: signInWithPopup() işlevine geçin
signInWithRedirect() yerine signInWithPopup() kullanın. Uygulamanızın kodunun geri kalanı aynı kalır ancak UserCredential nesnesi farklı şekilde alınır.
Web
// Before
// ==============
signInWithRedirect(auth, new GoogleAuthProvider());
// After the page redirects back
const userCred = await getRedirectResult(auth);
// After
// ==============
const userCred = await signInWithPopup(auth, new GoogleAuthProvider());
Web
// Before
// ==============
firebase.auth().signInWithRedirect(new firebase.auth.GoogleAuthProvider());
// After the page redirects back
var userCred = await firebase.auth().getRedirectResult();
// After
// ==============
var userCred = await firebase.auth().signInWithPopup(
new firebase.auth.GoogleAuthProvider());
```
Pop-up ile oturum açma, kullanıcılar için her zaman ideal değildir. Pop-up'lar bazen cihaz veya platform tarafından engellenir ve mobil kullanıcılar için akış daha az sorunsuz olur. Uygulamanızda pop-up kullanmak sorun oluşturuyorsa diğer seçeneklerden birini kullanmanız gerekir.
3. seçenek: Kimlik doğrulama isteklerini firebaseapp.com'a yönlendirin
signInWithRedirect akışı, uygulama alanınızdan firebase yapılandırmasındaki authDomain parametresinde belirtilen alana yönlendirme yapılarak başlatılır ("authDomain, kimlik sağlayıcıya yönlendiren oturum açma yardımcısı kodunu barındırır. Bu kod, başarılı olursa uygulama alanına geri yönlendirir.
Kimlik doğrulama akışı uygulama alanınıza döndüğünde, oturum açma yardımcısı alanının tarayıcı depolama alanına erişilir. Bu seçenek ve kodu kendi sunucunuzda barındırmanıza olanak tanıyan bir sonraki seçenek, aksi takdirde tarayıcılar tarafından engellenen kaynaklar arası depolama erişimini ortadan kaldırır.
Uygulama sunucunuzda,
https://<app domain>/__/auth/adresine yapılan GET/POST isteklerininhttps://<project>.firebaseapp.com/__/auth/adresine yönlendirilmesi için bir ters proxy ayarlayın. Bu yönlendirmenin tarayıcı için şeffaf olduğundan emin olun. Bu, 302 yönlendirmesi aracılığıyla yapılamaz.Özel alanınıza hizmet vermek için nginx kullanıyorsanız ters proxy yapılandırması şu şekilde görünür:
# reverse proxy for signin-helpers for popup/redirect sign in. location /__/auth { proxy_pass https://<project>.firebaseapp.com; }Yetkilendirilmiş
redirect_uri, ACS URL'si veauthDomain'nizi güncellemek için 1. seçenekteki adımları uygulayın. Uygulamanızı yeniden dağıttıktan sonra kaynaklar arası depolama alanı erişimi artık gerçekleşmemelidir.
4. seçenek: Oturum açma yardımcısı kodunu alanınızda kendiniz barındırın
Kaynaklar arası depolama erişimini ortadan kaldırmanın bir diğer yolu da Firebase oturum açma yardımcı kodunu kendiniz barındırmaktır. Ancak bu yaklaşım Apple ile giriş veya SAML için geçerli değildir. Bu seçeneği yalnızca 3. seçenekteki ters proxy kurulumu mümkün değilse kullanın.
Yardımcı kodun barındırılması için aşağıdaki adımlar uygulanır:
Aşağıdaki komutları çalıştırarak dosyaları
<project>.firebaseapp.comkonumundan ana makineye indirin:mkdir signin_helpers/ && cd signin_helpers wget https://<project>.firebaseapp.com/__/auth/handler wget https://<project>.firebaseapp.com/__/auth/handler.js wget https://<project>.firebaseapp.com/__/auth/experiments.js wget https://<project>.firebaseapp.com/__/auth/iframe wget https://<project>.firebaseapp.com/__/auth/iframe.js wget https://<project>.firebaseapp.com/__/auth/links wget https://<project>.firebaseapp.com/__/auth/links.js wget https://<project>.firebaseapp.com/__/firebase/init.jsonYukarıdaki dosyaları uygulama alanınızda barındırın. Web sunucunuzun
https://<app domain>/__/auth/<filename>vehttps://<app domain>/__/firebase/init.jsonisteklerine yanıt verebildiğinden emin olun.Dosyaları indirip barındıran bir örnek sunucu uygulaması aşağıda verilmiştir. En yeni hata düzeltmelerinin ve özelliklerin kullanıldığından emin olmak için dosyaları düzenli olarak indirip senkronize etmenizi öneririz.
Yetkili
redirect_uriveauthDomainbilgilerinizi güncellemek için 1. seçenekteki adımları uygulayın. Uygulamanızı yeniden dağıttıktan sonra kaynaklar arası depolama alanı erişimi artık gerçekleşmemelidir.
5. seçenek: Sağlayıcı oturum açma işlemlerini bağımsız olarak yönetme
Firebase Authentication SDK, karmaşık mantığı sarmalamak ve başka bir SDK'yı dahil etme ihtiyacını önlemek için kolaylık sağlayan yöntemler olarak signInWithPopup() ve signInWithRedirect() yöntemlerini sunar. Sağlayıcınızda bağımsız olarak oturum açıp sağlayıcının kimlik bilgilerini Firebase Authentication kimlik bilgisiyle değiştirmek için signInWithCredential() komutunu kullanarak bu yöntemlerden birini tamamen kullanmaktan kaçınabilirsiniz.
Örneğin, bir Google Hesabı kimlik bilgisi almak için Google ile Oturum Açma SDK'sını, ardından aşağıdaki kodu çalıştırarak yeni bir Google kimlik bilgisi oluşturmak için örnek kodu kullanabilirsiniz:
Web
// `googleUser` from the onsuccess Google Sign In callback.
// googUser = gapi.auth2.getAuthInstance().currentUser.get();
const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);
const result = await signInWithCredential(auth, credential);
Web
// `googleUser` from the onsuccess Google Sign In callback.
const credential = firebase.auth.GoogleAuthProvider.credential(
googleUser.getAuthResponse().id_token);
const result = await firebase.auth().signInWithCredential(credential);
signInWithCredential() işlevini çağırdıktan sonra uygulamanızın geri kalan işlevleri eskisi gibi çalışır.
Apple kimliği edinmeyle ilgili talimatları burada bulabilirsiniz.