Tài liệu này mô tả các phương pháp hay nhất để sử dụng chức năng đăng nhập bằng lệnh chuyển hướng trên trình duyệt
để chặn cookie của bên thứ ba. Bạn phải làm theo một trong các lựa chọn nêu tại đây cho signInWithRedirect()
để hoạt động như dự kiến trong môi trường phát hành công khai và trên mọi trình duyệt.
Tổng quan
Để giúp
Quy trình signInWithRedirect()
liền mạch cho bạn và người dùng của bạn, SDK JavaScript xác thực Firebase sẽ sử dụng
iframe trên nhiều nguồn gốc kết nối với miền Lưu trữ Firebase của ứng dụng.
Tuy nhiên, cơ chế này không hoạt động với các trình duyệt chặn bên thứ ba
quyền truy cập vào bộ nhớ.
Vì hiếm khi việc yêu cầu người dùng tắt tính năng phân vùng bộ nhớ trên trình duyệt, bạn nên áp dụng một trong các tuỳ chọn thiết lập sau đây cho ứng dụng, tuỳ thuộc vào trường hợp sử dụng cụ thể của bạn.
- Nếu bạn lưu trữ ứng dụng thông qua tính năng Lưu trữ Firebase trên miền con của
firebaseapp.com
, thì vấn đề này sẽ không ảnh hưởng đến bạn và bạn không cần làm gì cả. - Nếu bạn lưu trữ ứng dụng bằng tính năng Lưu trữ Firebase trên một miền tuỳ chỉnh hoặc miền con của
web.app
, hãy sử dụng Lựa chọn 1. - Nếu bạn lưu trữ ứng dụng bằng một dịch vụ không phải Firebase, hãy sử dụng Phương án 2, Lựa chọn 3, Lựa chọn 4, hoặc Lựa chọn 5.
Cách 1: Cập nhật cấu hình Firebase để sử dụng miền tuỳ chỉnh làm authDomain
của bạn
Nếu đang lưu trữ ứng dụng với tính năng Lưu trữ Firebase bằng miền tuỳ chỉnh, bạn có thể
định cấu hình SDK Firebase để sử dụng miền tuỳ chỉnh của bạn làm authDomain
. Chiến dịch này
đảm bảo rằng ứng dụng của bạn và iframe xác thực sử dụng cùng một miền, điều này giúp ngăn chặn
vấn đề đăng nhập. (Nếu không sử dụng tính năng Lưu trữ Firebase, bạn cần sử dụng
tuỳ chọn khác). Hãy đảm bảo rằng bạn đã thiết lập miền tuỳ chỉnh trên cùng một miền
dự án mà bạn đang sử dụng để xác thực.
Để cập nhật cấu hình Firebase nhằm sử dụng miền tuỳ chỉnh làm miền xác thực, hãy thực hiện như sau:
Định cấu hình Firebase JS SDK để sử dụng miền tuỳ chỉnh của bạn làm
authDomain
:const firebaseConfig = { apiKey: "<api-key>", authDomain: "<the-domain-that-serves-your-app>", databaseURL: "<database-url>", projectId: "<project-id>", appId: "<app-id>" };
Thêm
authDomain
mới vào danh sách người dùng được uỷ quyền của nhà cung cấp OAuth URI chuyển hướng. Cách bạn thực hiện việc này sẽ tuỳ thuộc vào nhà cung cấp, nhưng nhìn chung bạn có thể làm theo hướng dẫn trong phần "Trước khi bắt đầu" trong bất kỳ nhà cung cấp nào (ví dụ: nhà cung cấp Facebook). URI đã cập nhật thành uỷ quyền trông giống nhưhttps://<the-domain-that-serves-your-app>/__/auth/handler
— đứng sau/__/auth/handler
rất quan trọng.Tương tự, nếu bạn đang sử dụng nhà cung cấp SAML, hãy thêm
authDomain
mới vào URL của Dịch vụ người tiêu dùng xác nhận SAML (ACS).Đảm bảo
continue_uri
của bạn có trong danh sách miền được cấp phép.Triển khai lại bằng tính năng Lưu trữ Firebase nếu cần để tìm nạp tệp cấu hình Firebase mới nhất được lưu trữ tại
/__/firebase/init.json
.
Lựa chọn 2: Chuyển sang signInWithPopup()
Sử dụng signInWithPopup()
thay vì
signInWithRedirect()
. Chiến lược phát hành đĩa đơn
phần mã còn lại của ứng dụng vẫn giữ nguyên, nhưng đối tượng UserCredential
được truy xuất theo cách khác.
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());
```
Đăng nhập bằng cửa sổ bật lên không phải lúc nào cũng lý tưởng đối với người dùng—cửa sổ bật lên đôi khi bị chặn bởi thiết bị hoặc nền tảng và quy trình sẽ ít suôn sẻ hơn đối với người dùng thiết bị di động. Nếu sử dụng cửa sổ bật lên là một vấn đề đối với ứng dụng của bạn, bạn sẽ cần thực hiện theo một trong hai .
Cách 3: Yêu cầu xác thực proxy đến firebaseapp.com
Luồng signInWithRedirect
bắt đầu bằng cách chuyển hướng từ miền ứng dụng của bạn đến
miền được chỉ định trong thông số authDomain
trong cấu hình Firebase
("authDomain
lưu trữ trình trợ giúp đăng nhập
mã chuyển hướng đến Nhà cung cấp danh tính, khi thành công, sẽ chuyển hướng trở lại
cho miền ứng dụng.
Khi luồng xác thực trở lại miền ứng dụng của bạn, bộ nhớ của trình duyệt bạn đã truy cập vào miền của trình trợ giúp đăng nhập. Lựa chọn này và tiếp theo (để tự lưu trữ mã) loại bỏ quyền truy cập vào bộ nhớ trên nhiều nguồn gốc, vốn sẽ bị trình duyệt chặn.
Thiết lập proxy ngược trên máy chủ ứng dụng của bạn để yêu cầu GET/POST
https://<app domain>/__/auth/
được chuyển tiếp đếnhttps://<project>.firebaseapp.com/__/auth/
. Đảm bảo rằng quá trình chuyển tiếp này minh bạch đối với trình duyệt; thì bạn không thể thực hiện việc này thông qua Chuyển hướng 302.Nếu bạn đang sử dụng nginx để phân phối miền tuỳ chỉnh của mình, cấu hình proxy ngược sẽ có dạng như sau:
# reverse proxy for signin-helpers for popup/redirect sign in. location /__/auth { proxy_pass https://<project>.firebaseapp.com; }
Làm theo các bước trong Phương án 1 để cập nhật
redirect_uri
được uỷ quyền, URL ACS vàauthDomain
của bạn. Sau khi triển khai lại ứng dụng của bạn, thì quyền truy cập vào bộ nhớ trên nhiều nguồn gốc sẽ không còn xảy ra.
Cách 4: Tự lưu trữ mã trình trợ giúp đăng nhập trong miền của bạn
Một cách khác để loại bỏ quyền truy cập vào bộ nhớ trên nhiều nguồn gốc là tự lưu trữ mã trợ giúp đăng nhập Firebase. Tuy nhiên, phương pháp này không hiệu quả đối với Apple đăng nhập hoặc SAML. Chỉ sử dụng tuỳ chọn này nếu thiết lập proxy ngược trong lựa chọn 3 là không khả thi.
Quy trình lưu trữ mã trợ giúp gồm các bước sau:
Tải các tệp xuống để lưu trữ từ vị trí của
<project>.firebaseapp.com
bằng cách thực thi các lệnh sau: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/__/firebase/init.json
Lưu trữ các tệp trên trong miền ứng dụng của bạn. Đảm bảo rằng máy chủ web của bạn có thể phản hồi
https://<app domain>/__/auth/<filename>
vàhttps://<app domain>/__/firebase/init.json
.Sau đây là cách triển khai máy chủ mẫu sẽ tải xuống và lưu trữ các tệp. Bạn nên tải xuống và đồng bộ hoá các tệp theo định kỳ để đảm bảo cập nhật các bản sửa lỗi và tính năng mới nhất.
Làm theo các bước trong Phương án 1 để cập nhật
redirect_uri
được uỷ quyền vàauthDomain
của bạn. Sau khi triển khai lại ứng dụng của bạn, thì quyền truy cập vào bộ nhớ trên nhiều nguồn gốc sẽ không còn xảy ra.
Cách 5: Xử lý hoạt động đăng nhập của nhà cung cấp một cách độc lập
SDK xác thực Firebase cung cấp
signInWithPopup()
và
signInWithRedirect()
dưới tên
các phương thức thuận tiện để gói logic phức tạp và tránh cần liên quan đến
một SDK khác. Bạn có thể tránh sử dụng toàn bộ một trong hai phương thức bằng cách ký riêng
cho nhà cung cấp của bạn, sau đó sử dụng
signInWithCredential()
đến
trao đổi thông tin đăng nhập của trình cung cấp để lấy thông tin xác thực Firebase.
Ví dụ: bạn có thể sử dụng
SDK đăng nhập bằng Google,
mã mẫu
để có thông tin xác thực Tài khoản Google, sau đó tạo thông tin đăng nhập Google mới,
bằng cách chạy đoạn mã sau:
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);
Sau khi bạn gọi signInWithCredential()
, phần còn lại của ứng dụng sẽ hoạt động
như trước đây.
Hướng dẫn lấy thông tin đăng nhập Apple: tại đây.