Bạn có thể cho phép người dùng xác thực bằng Firebase bằng Tài khoản Google của họ. Bạn có thể sử dụng Firebase SDK để thực hiện quy trình đăng nhập bằng Google hoặc thực hiện quy trình đăng nhập theo cách thủ công bằng cách sử dụng thư viện Đăng nhập bằng Google và chuyển mã thông báo mã nhận dạng kết quả đến Firebase.
Trước khi bắt đầu
- Thêm Firebase vào dự án JavaScript của bạn.
- Bật Google làm phương thức đăng nhập trong bảng điều khiển Firebase:
- Trong bảng điều khiển của Firebase, hãy mở phần Xác thực.
- Trên thẻ Sign in method (Phương thức đăng nhập), hãy bật phương thức đăng nhập của Google rồi nhấp vào Lưu.
Xử lý quy trình đăng nhập bằng Firebase SDK
Nếu bạn đang tạo một ứng dụng web thì cách dễ nhất để xác thực người dùng với Firebase bằng cách sử dụng Tài khoản Google của họ là để xử lý quy trình đăng nhập bằng Firebase JavaScript SDK. (Nếu bạn muốn xác thực người dùng trong Node.js hoặc môi trường khác không phải trình duyệt, bạn phải xử lý quy trình đăng nhập theo cách thủ công).
Để xử lý quy trình đăng nhập bằng SDK JavaScript của Firebase, hãy làm theo các bước sau các bước:
- Tạo một thực thể của đối tượng nhà cung cấp của Google:
import { GoogleAuthProvider } from "firebase/auth";
const provider = new GoogleAuthProvider();var provider = new firebase.auth.GoogleAuthProvider();
- Không bắt buộc: Chỉ định các phạm vi OAuth 2.0 khác mà bạn
muốn yêu cầu từ nhà cung cấp dịch vụ xác thực. Để thêm phạm vi, hãy gọi
addScope
. Ví dụ:provider.addScope('https://www.googleapis.com/auth/contacts.readonly');
provider.addScope('https://www.googleapis.com/auth/contacts.readonly');
- Không bắt buộc: Để bản địa hoá quy trình OAuth của nhà cung cấp theo lựa chọn ưu tiên của người dùng
ngôn ngữ mà không chuyển rõ ràng các tham số OAuth tuỳ chỉnh có liên quan, hãy cập nhật ngôn ngữ
trên thực thể Xác thực trước khi bắt đầu quy trình OAuth. Ví dụ:
import { getAuth } from "firebase/auth";
const auth = getAuth();
auth.languageCode = 'it';
// To apply the default browser preference instead of explicitly setting it.
// auth.useDeviceLanguage();firebase.auth().languageCode = 'it';
// To apply the default browser preference instead of explicitly setting it.
// firebase.auth().useDeviceLanguage(); - Không bắt buộc: Chỉ định các thông số bổ sung của trình cung cấp OAuth tuỳ chỉnh
mà bạn muốn gửi cùng với yêu cầu OAuth. Để thêm thông số tùy chỉnh, hãy gọi
setCustomParameters
trên trình cung cấp đã khởi tạo có một đối tượng chứa khoá như được chỉ định trong tài liệu về trình cung cấp OAuth và giá trị tương ứng. Ví dụ:provider.setCustomParameters({
'login_hint': 'user@example.com'
});provider.setCustomParameters({
'login_hint': 'user@example.com'
}); - Xác thực bằng Firebase sử dụng đối tượng nhà cung cấp của Google. Bạn có thể
nhắc người dùng đăng nhập bằng Tài khoản Google của họ bằng cách mở
cửa sổ bật lên hoặc bằng cách chuyển hướng đến trang đăng nhập. Phương thức chuyển hướng là
được ưu tiên trên thiết bị di động.
- Để đăng nhập bằng cửa sổ bật lên, hãy gọi
signInWithPopup
:import { getAuth, signInWithPopup, GoogleAuthProvider } from "firebase/auth";
const auth = getAuth();
signInWithPopup(auth, provider)
.then((result) => {
// This gives you a Google Access Token. You can use it to access the Google API.
const credential = GoogleAuthProvider.credentialFromResult(result);
const token = credential.accessToken;
// The signed-in user info.
const user = result.user;
// 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 AuthCredential type that was used.
const credential = GoogleAuthProvider.credentialFromError(error);
// ...
});firebase.auth()
.signInWithPopup(provider)
.then((result) => {
/** @type {firebase.auth.OAuthCredential} */
var credential = result.credential;
// This gives you a Google Access Token. You can use it to access the Google API.
var token = credential.accessToken;
// The signed-in user info.
var user = result.user;
// 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;
// ...
});Đây cũng là nơi bạn có thể phát hiện và xử lý các lỗi. Để biết danh sách mã lỗi, hãy xem Tài liệu tham khảo xác thực.
- Để đăng nhập bằng cách chuyển hướng đến trang đăng nhập, hãy gọi
signInWithRedirect
: Làm theo các phương pháp hay nhất khi sử dụng tính năng "signInWith chuyển hướng".import { getAuth, signInWithRedirect } from "firebase/auth";
const auth = getAuth();
signInWithRedirect(auth, provider);firebase.auth().signInWithRedirect(provider);
getRedirectResult
khi trang của bạn tải:import { getAuth, getRedirectResult, GoogleAuthProvider } from "firebase/auth";
const auth = getAuth();
getRedirectResult(auth)
.then((result) => {
// This gives you a Google Access Token. You can use it to access Google APIs.
const credential = GoogleAuthProvider.credentialFromResult(result);
const token = credential.accessToken;
// The signed-in user info.
const user = result.user;
// 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 AuthCredential type that was used.
const credential = GoogleAuthProvider.credentialFromError(error);
// ...
});firebase.auth()
.getRedirectResult()
.then((result) => {
if (result.credential) {
/** @type {firebase.auth.OAuthCredential} */
var credential = result.credential;
// This gives you a Google Access Token. You can use it to access the Google API.
var token = credential.accessToken;
// ...
}
// The signed-in user info.
var user = result.user;
// 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;
// ...
});
- Để đăng nhập bằng cửa sổ bật lên, hãy gọi
Xử lý Lỗi thông tin đăng nhập khác nhau của tài khoản
Nếu bạn đã bật chế độ cài đặt Một tài khoản cho mỗi địa chỉ email trong bảng điều khiển của Firebase,
khi người dùng cố gắng đăng nhập vào một nhà cung cấp (chẳng hạn như Google) bằng một email đã
cho nhà cung cấp khác của người dùng Firebase (chẳng hạn như Facebook), thì lỗi
auth/account-exists-with-different-credential
được gửi cùng với
Đối tượng AuthCredential
(mã thông báo giá trị nhận dạng của Google). Để hoàn tất quá trình đăng nhập vào
nhà cung cấp dịch vụ mong muốn, trước tiên người dùng phải đăng nhập vào nhà cung cấp hiện tại (Facebook) và sau đó liên kết với
AuthCredential
cũ (mã thông báo mã nhận dạng của Google).
Chế độ cửa sổ bật lên
Nếu sử dụng signInWithPopup
, bạn có thể xử lý
auth/account-exists-with-different-credential
lỗi với mã như sau
ví dụ:
import {
getAuth,
linkWithCredential,
signInWithPopup,
GoogleAuthProvider,
} from "firebase/auth";
try {
// Step 1: User tries to sign in using Google.
let result = await signInWithPopup(getAuth(), new GoogleAuthProvider());
} catch (error) {
// Step 2: User's email already exists.
if (error.code === "auth/account-exists-with-different-credential") {
// The pending Google credential.
let pendingCred = error.credential;
// Step 3: Save the pending credential in temporary storage,
// Step 4: Let the user know that they already have an account
// but with a different provider, and let them choose another
// sign-in method.
}
}
// ...
try {
// Step 5: Sign the user in using their chosen method.
let result = await signInWithPopup(getAuth(), userSelectedProvider);
// Step 6: Link to the Google credential.
// TODO: implement `retrievePendingCred` for your app.
let pendingCred = retrievePendingCred();
if (pendingCred !== null) {
// As you have access to the pending credential, you can directly call the
// link method.
let user = await linkWithCredential(result.user, pendingCred);
}
// Step 7: Continue to app.
} catch (error) {
// ...
}
Chế độ chuyển hướng
Lỗi này được xử lý theo cách tương tự trong chế độ chuyển hướng, chỉ khác là thông tin đăng nhập phải được lưu vào bộ nhớ đệm giữa các lần chuyển hướng trang (ví dụ: sử dụng bộ nhớ phiên).
Nâng cao: Xử lý quy trình đăng nhập theo cách thủ công
Bạn cũng có thể xác thực với Firebase bằng Tài khoản Google bằng cách xử lý quy trình đăng nhập với thư viện Đăng nhập bằng Google:
- Tích hợp tính năng Đăng nhập bằng Google vào ứng dụng của bạn bằng cách làm theo hướng dẫn tích hợp. Hãy nhớ định cấu hình tính năng Đăng nhập bằng Google bằng mã ứng dụng khách Google đã tạo cho dự án Firebase của bạn. Bạn có thể tìm thấy mã ứng dụng khách Google của dự án trong trang Thông tin đăng nhập của dự án trên Developers Console của dự án.
- Trong lệnh gọi lại kết quả đăng nhập, hãy trao đổi mã thông báo mã nhận dạng từ phản hồi xác thực của Google lấy thông tin đăng nhập Firebase và sử dụng mã đó để xác thực với Firebase:
function handleCredentialResponse(response) {
// Build Firebase credential with the Google ID token.
const idToken = response.credential;
const credential = GoogleAuthProvider.credential(idToken);
// Sign in with credential from the Google user.
signInWithCredential(auth, credential).catch((error) => {
// Handle Errors here.
const errorCode = error.code;
const errorMessage = error.message;
// The email of the user's account used.
const email = error.email;
// The credential that was used.
const credential = GoogleAuthProvider.credentialFromError(error);
// ...
});
}
Nâng cao: Xác thực bằng Firebase trong Node.js
Cách xác thực bằng Firebase trong ứng dụng Node.js:
- Đăng nhập người dùng bằng Tài khoản Google của họ và nhận ID Google của người dùng
mã thông báo. Bạn có thể thực hiện việc này theo một số cách. Ví dụ:
- Nếu ứng dụng của bạn có giao diện người dùng trên trình duyệt, hãy sử dụng tính năng Đăng nhập bằng Google theo mô tả
trong bài viết Xử lý
phần quy trình đăng nhập theo cách thủ công. Lấy mã thông báo mã nhận dạng trên Google từ thông tin xác thực
trả lời:
Sau đó, hãy gửi mã thông báo này đến ứng dụng Node.js của bạn.var id_token = googleUser.getAuthResponse().id_token
- Nếu ứng dụng của bạn chạy trên một thiết bị hạn chế khả năng nhập dữ liệu, chẳng hạn như TV, bạn có thể sử dụng Google Quy trình Đăng nhập trên TV và thiết bị.
- Nếu ứng dụng của bạn có giao diện người dùng trên trình duyệt, hãy sử dụng tính năng Đăng nhập bằng Google theo mô tả
trong bài viết Xử lý
phần quy trình đăng nhập theo cách thủ công. Lấy mã thông báo mã nhận dạng trên Google từ thông tin xác thực
trả lời:
- Sau khi bạn nhận được mã thông báo giá trị nhận dạng trên Google của người dùng, hãy sử dụng mã đó để tạo Chứng chỉ danh tính
rồi đăng nhập vào người dùng bằng thông tin đăng nhập:
import { getAuth, signInWithCredential, GoogleAuthProvider } from "firebase/auth";
// Build Firebase credential with the Google ID token.
const credential = GoogleAuthProvider.credential(id_token);
// Sign in with credential from the Google user.
const auth = getAuth();
signInWithCredential(auth, credential).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 AuthCredential type that was used.
const credential = GoogleAuthProvider.credentialFromError(error);
// ...
});// Build Firebase credential with the Google ID token.
var credential = firebase.auth.GoogleAuthProvider.credential(id_token);
// Sign in with credential from the Google user.
firebase.auth().signInWithCredential(credential).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;
// ...
});
Xác thực bằng Firebase trong một tiện ích của Chrome
Nếu bạn đang xây dựng ứng dụng tiện ích của Chrome, hãy xem Hướng dẫn về tài liệu ngoài màn hình
Tuỳ chỉnh miền chuyển hướng để đăng nhập bằng Google
Khi tạo dự án, Firebase sẽ cung cấp một miền con duy nhất cho dự án của bạn:
https://my-app-12345.firebaseapp.com
.
Cơ chế này cũng sẽ được dùng làm cơ chế chuyển hướng cho việc đăng nhập bằng OAuth. Miền đó cần phải được phép đối với tất cả các nhà cung cấp OAuth được hỗ trợ. Tuy nhiên, điều này có nghĩa là người dùng có thể thấy rằng khi đăng nhập vào Google trước khi chuyển hướng trở lại ứng dụng: Tiếp tục truy cập: https://my-app-12345.firebaseapp.com.
Để tránh hiển thị miền con, bạn có thể thiết lập miền tuỳ chỉnh bằng Firebase Hosting:
- Làm theo các bước từ 1 đến 3 trong Thiết lập miền của bạn cho Hosting. Khi bạn xác minh quyền sở hữu miền của bạn, Hosting cung cấp chứng chỉ SSL cho miền tuỳ chỉnh của bạn.
- Thêm miền tuỳ chỉnh của bạn vào danh sách các miền được uỷ quyền trong
Bảng điều khiển Firebase:
auth.custom.domain.com
. - Trong bảng điều khiển dành cho nhà phát triển của Google hoặc trang thiết lập OAuth, hãy thêm URL của trang chuyển hướng vào danh sách cho phép,
bạn có thể truy cập vào tệp này trên miền tuỳ chỉnh của mình:
https://auth.custom.domain.com/__/auth/handler
. - Khi bạn khởi chạy thư viện JavaScript, hãy chỉ định miền tuỳ chỉnh của bạn bằng
Trường
authDomain
:var config = {
apiKey: '...',
// Changed from 'my-app-12345.firebaseapp.com'.
authDomain: 'auth.custom.domain.com',
databaseURL: 'https://my-app-12345.firebaseio.com',
projectId: 'my-app-12345',
storageBucket: 'my-app-12345.appspot.com',
messagingSenderId: '1234567890'
};
firebase.initializeApp(config);
Các bước tiếp theo
Sau khi người dùng đăng nhập lần đầu tiên, một tài khoản người dùng mới sẽ được tạo và được liên kết với thông tin đăng nhập—tức là tên người dùng và mật khẩu, số điện thoại số hoặc thông tin của nhà cung cấp dịch vụ xác thực – người dùng đã đăng nhập. Thông tin mới này được lưu trữ như một phần của dự án Firebase và có thể được dùng để xác định một người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đăng nhập bằng cách nào.
-
Trong ứng dụng của mình, bạn nên sử dụng cách để biết trạng thái xác thực của người dùng đặt trình quan sát trên đối tượng
Auth
. Sau đó, bạn có thể lấy thông tin thông tin hồ sơ cơ bản qua đối tượngUser
. Xem Quản lý người dùng. Trong Firebase Realtime Database và Cloud Storage của bạn Quy tắc bảo mật, bạn có thể lấy mã nhận dạng người dùng duy nhất của người dùng đã đăng nhập từ biến
auth
, để kiểm soát loại dữ liệu mà người dùng có thể truy cập.
Bạn có thể cho phép người dùng đăng nhập vào ứng dụng của mình bằng nhiều phương thức xác thực bằng cách liên kết thông tin đăng nhập của nhà cung cấp dịch vụ xác thực với tài khoản người dùng hiện có.
Để đăng xuất một người dùng, hãy gọi
signOut
:
import { getAuth, signOut } from "firebase/auth";
const auth = getAuth();
signOut(auth).then(() => {
// Sign-out successful.
}).catch((error) => {
// An error happened.
});
firebase.auth().signOut().then(() => {
// Sign-out successful.
}).catch((error) => {
// An error happened.
});