Bạn có thể cho phép người dùng xác thực bằng Firebase bằng tài khoản GitHub của họ bằng cách tích hợp tính năng xác thực GitHub vào ứng dụng. Bạn có thể tích hợp tính năng xác thực GitHub bằng cách sử dụng SDK Firebase để thực hiện quy trình đăng nhập hoặc thực hiện quy trình GitHub OAuth 2.0 theo cách thủ công và chuyển mã truy cập thu được đến Firebase.
Trước khi bắt đầu
- Thêm Firebase vào dự án JavaScript.
- Trong bảng điều khiển Firebase, hãy mở phần Auth (Xác thực).
- Trên thẻ Phương thức đăng nhập, hãy bật trình cung cấp GitHub.
- Thêm Mã ứng dụng khách và Mật khẩu ứng dụng khách từ bảng điều khiển dành cho nhà phát triển của nhà cung cấp đó vào cấu hình nhà cung cấp:
- Đăng ký ứng dụng làm ứng dụng dành cho nhà phát triển trên GitHub và lấy Mã ứng dụng và Khoá bí mật của ứng dụng OAuth 2.0.
- Đảm bảo rằng URI chuyển hướng OAuth của Firebase (ví dụ:
my-app-12345.firebaseapp.com/__/auth/handler
) được đặt làm URL gọi lại uỷ quyền trong trang cài đặt của ứng dụng trên cấu hình của ứng dụng GitHub.
- Nhấp vào Lưu.
Xử lý quy trình đăng nhập bằng SDK Firebase
Nếu bạn đang xây dựng một ứng dụng web, cách dễ nhất để xác thực người dùng bằng Firebase thông qua tài khoản GitHub của họ là xử lý quy trình đăng nhập bằng SDK JavaScript Firebase. (Nếu muốn xác thực người dùng trong Node.js hoặc môi trường không phải trình duyệt khác, 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:
- Tạo một thực thể của đối tượng trình cung cấp GitHub:
import { GithubAuthProvider } from "firebase/auth"; const provider = new GithubAuthProvider();
var provider = new firebase.auth.GithubAuthProvider();
- Không bắt buộc: Chỉ định các phạm vi OAuth 2.0 bổ sung mà bạn muốn yêu cầu từ trình cung cấp dịch vụ xác thực. Để thêm một phạm vi, hãy gọi
addScope
. Ví dụ:provider.addScope('repo');
provider.addScope('repo');
- Không bắt buộc: Chỉ định các thông số nhà cung cấp OAuth tuỳ chỉnh bổ sung mà bạn muốn gửi cùng với yêu cầu OAuth. Để thêm một tham số tuỳ chỉnh, hãy gọi
setCustomParameters
trên trình cung cấp đã khởi chạy bằng một đối tượng chứa khoá được chỉ định trong tài liệu của trình cung cấp OAuth và giá trị tương ứng. Ví dụ:provider.setCustomParameters({ 'allow_signup': 'false' });
provider.setCustomParameters({ 'allow_signup': 'false' });
- Xác thực bằng Firebase bằng đối tượng nhà cung cấp GitHub. Bạn có thể nhắc người dùng đăng nhập bằng tài khoản GitHub của họ bằng cách mở cửa sổ bật lên hoặc chuyển hướng đến trang đăng nhập. Phương thức chuyển hướng đượ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, GithubAuthProvider } from "firebase/auth"; const auth = getAuth(); signInWithPopup(auth, provider) .then((result) => { // This gives you a GitHub Access Token. You can use it to access the GitHub API. const credential = GithubAuthProvider.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 = GithubAuthProvider.credentialFromError(error); // ... });
firebase .auth() .signInWithPopup(provider) .then((result) => { /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // This gives you a GitHub Access Token. You can use it to access the GitHub 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ý lỗi. Để biết danh sách mã lỗi, hãy xem Tài liệu tham khảo về 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 `signInWithRedirect`.import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);
firebase.auth().signInWithRedirect(provider);
getRedirectResult
khi trang tải:import { getAuth, getRedirectResult, GithubAuthProvider } from "firebase/auth"; const auth = getAuth(); getRedirectResult(auth) .then((result) => { const credential = GithubAuthProvider.credentialFromResult(result); if (credential) { // This gives you a GitHub Access Token. You can use it to access the GitHub API. 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 = GithubAuthProvider.credentialFromError(error); // ... });
firebase.auth() .getRedirectResult() .then((result) => { if (result.credential) { /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // This gives you a GitHub Access Token. You can use it to access the GitHub 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 account-exists-with-different-credential
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 Firebase, thì khi người dùng cố gắng đăng nhập vào một nhà cung cấp (chẳng hạn như GitHub) bằng một email đã tồn tại cho nhà cung cấp của người dùng Firebase khác (chẳng hạn như Google), lỗi auth/account-exists-with-different-credential
sẽ được gửi cùng với đối tượng AuthCredential
(mã truy cập GitHub). Để hoàn tất quá trình đăng nhập vào nhà cung cấp dự kiến, trước tiên, người dùng phải đăng nhập vào nhà cung cấp hiện tại (Google) rồi liên kết với AuthCredential
cũ (mã truy cập GitHub).
Chế độ bật lên
Nếu sử dụng signInWithPopup
, bạn có thể xử lý lỗi auth/account-exists-with-different-credential
bằng mã như ví dụ sau:
import { getAuth, linkWithCredential, signInWithPopup, GitHubAuthProvider, } from "firebase/auth"; try { // Step 1: User tries to sign in using GitHub. let result = await signInWithPopup(getAuth(), new GitHubAuthProvider()); } catch (error) { // Step 2: User's email already exists. if (error.code === "auth/account-exists-with-different-credential") { // The pending GitHub 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 GitHub 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, với điểm khác biệt là thông tin xác thực đang chờ xử lý phải được lưu vào bộ nhớ đệm giữa các lệnh chuyển hướng trang (ví dụ: sử dụng bộ nhớ phiên).
Xử lý quy trình đăng nhập theo cách thủ công
Bạn cũng có thể xác thực bằng Firebase bằng tài khoản GitHub bằng cách xử lý quy trình đăng nhập bằng cách gọi các điểm cuối OAuth 2.0 của GitHub:
- Tích hợp tính năng xác thực GitHub vào ứng dụng của bạn bằng cách làm theo tài liệu dành cho nhà phát triển. Khi quy trình đăng nhập vào GitHub kết thúc, bạn sẽ nhận được mã truy cập OAuth 2.0.
- Nếu bạn cần đăng nhập vào một ứng dụng Node.js, hãy gửi mã thông báo truy cập OAuth đến ứng dụng Node.js.
- Sau khi người dùng đăng nhập thành công bằng GitHub, hãy trao đổi mã truy cập OAuth 2.0 lấy thông tin xác thực Firebase:
import { GithubAuthProvider } from "firebase/auth"; const credential = GithubAuthProvider.credential(token);
var credential = firebase.auth.GithubAuthProvider.credential(token);
- Xác thực bằng Firebase bằng thông tin xác thực Firebase:
import { getAuth, signInWithCredential } from "firebase/auth"; // Sign in with the credential from the user. const auth = getAuth(); signInWithCredential(auth, credential) .then((result) => { // Signed in // ... }) .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; // ... });
// Sign in with the credential from the user. firebase.auth() .signInWithCredential(credential) .then((result) => { // Signed in // ... }) .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; // ... });
Xác thực bằng Firebase trong tiện ích Chrome
Nếu bạn đang xây dựng một ứng dụng tiện ích 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 vào GitHub
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
.
URL này cũng sẽ được dùng làm cơ chế chuyển hướng cho việc đăng nhập OAuth. Bạn cần cho phép tất cả các nhà cung cấp OAuth được hỗ trợ truy cập vào miền đó. Tuy nhiên, điều này có nghĩa là người dùng có thể thấy miền đó trong khi đăng nhập vào GitHub trước khi chuyển hướng trở lại ứng dụng: Tiếp tục đến: 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 phần Thiết lập miền cho Hosting. Khi bạn xác minh quyền sở hữu miền, Hosting sẽ cung cấp chứng chỉ SSL cho miền tuỳ chỉnh của bạn.
- Thêm miền tuỳ chỉnh vào danh sách 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 GitHub 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 trang chuyển hướng này trên miền tuỳ chỉnh:
https://auth.custom.domain.com/__/auth/handler
. - Khi khởi chạy thư viện JavaScript, hãy chỉ định miền tuỳ chỉnh bằng trường
authDomain
:var config = { apiKey: '...', // Changed from '
PROJECT_ID .firebaseapp.com'. authDomain: 'auth.custom.domain.com', databaseURL: 'https://PROJECT_ID .firebaseio.com', projectId: 'PROJECT_ID ', storageBucket: ' ', messagingSenderId: 'PROJECT_ID .firebasestorage.appSENDER_ID ' }; firebase.initializeApp(config);
Các bước tiếp theo
Sau khi người dùng đăng nhập lần đầu, một tài khoản người dùng mới sẽ được tạo và liên kết với thông tin xác thực (tức là tên người dùng và mật khẩu, số điện thoại hoặc thông tin về nhà cung cấp dịch vụ xác thực) mà người dùng đã đăng nhập. Tài khoản mới này được lưu trữ trong dự án Firebase và có thể được dùng để xác định người dùng trên mọi ứng dụng trong dự án, bất kể người dùng đăng nhập như thế nào.
-
Trong ứng dụng, bạn nên biết trạng thái xác thực của người dùng bằng cách đặt trình quan sát trên đối tượng
Auth
. Sau đó, bạn có thể lấy thông tin hồ sơ cơ bản của người dùng từ đối tượngUser
. Xem phần Quản lý người dùng. Trong Quy tắc bảo mật Firebase Realtime Database và Cloud Storage, 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
và sử dụng mã nhận dạng đó để kiểm soát 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 bạn bằng nhiều trình cung cấp dịch vụ xác thực bằng cách liên kết thông tin xác thực của trình cung cấp dịch vụ xác thực với một tài khoản người dùng hiện có.
Để đăng xuấ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. });