Xác thực bằng mạng xã hội là một quy trình xác thực nhiều bước, cho phép bạn đăng nhập người dùng vào một tài khoản hoặc liên kết người dùng với một tài khoản hiện có.
Cả nền tảng gốc và web đều hỗ trợ việc tạo thông tin đăng nhập mà sau đó có thể được chuyển đến các phương thức signInWithCredential hoặc linkWithCredential. Ngoài ra, trên các nền tảng web, bạn có thể kích hoạt quy trình xác thực thông qua một cửa sổ bật lên hoặc chuyển hướng.
Hầu hết cấu hình đã được thiết lập khi bạn sử dụng tính năng Đăng nhập bằng Google với Firebase. Tuy nhiên, bạn cần đảm bảo rằng khoá SHA1 của máy đã được định cấu hình để sử dụng với Android. Bạn có thể xem cách tạo khoá trong tài liệu xác thực .
Đảm bảo rằng nhà cung cấp dịch vụ đăng nhập "Google" đã được bật trong bảng điều khiển Firebase (chuyển đến thẻ Security > Authentication > Sign-in method tab).
Nếu người dùng đăng nhập bằng Google sau khi đã đăng ký tài khoản theo cách thủ công, thì nhà cung cấp dịch vụ xác thực của họ sẽ tự động chuyển sang Google do khái niệm về nhà cung cấp đáng tin cậy của Xác thực Firebase. Bạn có thể tìm hiểu thêm về vấn đề này tại đây.
iOS+ và Android
Trên các nền tảng gốc, bạn cần có thư viện của bên thứ ba để kích hoạt quy trình xác thực.
Cài đặt trình bổ trợ google_sign_in chính thức.
Sau khi cài đặt, hãy kích hoạt quy trình đăng nhập và tạo thông tin đăng nhập mới:
import 'package:google_sign_in/google_sign_in.dart';
Future<UserCredential> signInWithGoogle() async {
// Trigger the authentication flow
final GoogleSignInAccount? googleUser = await GoogleSignIn.instance.authenticate();
// Obtain the auth details from the request
final GoogleSignInAuthentication googleAuth = googleUser.authentication;
// Create a new credential
final credential = GoogleAuthProvider.credential(idToken: googleAuth.idToken);
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithCredential(credential);
}
Web
Trên web, SDK Firebase hỗ trợ tự động xử lý quy trình xác thực bằng dự án Firebase của bạn. Ví dụ:
Tạo nhà cung cấp dịch vụ xác thực của Google, cung cấp mọi phạm vi quyền bổ sung mà bạn muốn nhận từ người dùng:
GoogleAuthProvider googleProvider = GoogleAuthProvider();
googleProvider.addScope('https://www.googleapis.com/auth/contacts.readonly');
googleProvider.setCustomParameters({
'login_hint': 'user@example.com'
});
Cung cấp thông tin đăng nhập cho phương thức signInWithPopup. Thao tác này sẽ kích hoạt một cửa sổ mới xuất hiện, nhắc người dùng đăng nhập vào dự án của bạn. Ngoài ra, bạn có thể sử dụng signInWithRedirect để giữ quy trình xác thực trong cùng một cửa sổ.
Future<UserCredential> signInWithGoogle() async {
// Create a new provider
GoogleAuthProvider googleProvider = GoogleAuthProvider();
googleProvider.addScope('https://www.googleapis.com/auth/contacts.readonly');
googleProvider.setCustomParameters({
'login_hint': 'user@example.com'
});
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithPopup(googleProvider);
// Or use signInWithRedirect
// return await FirebaseAuth.instance.signInWithRedirect(googleProvider);
}
Google Play Games (chỉ dành cho Android)
Đảm bảo rằng nhà cung cấp dịch vụ đăng nhập "Play Games" đã được bật trong bảng điều khiển Firebase (chuyển đến thẻ Security > Authentication > Sign-in method tab). Hãy làm theo các hướng dẫn này để thiết lập dự án Firebase cho Play Games.
Hãy làm theo các hướng dẫn này để định cấu hình dịch vụ Play Games bằng ứng dụng Firebase.
Android
Future<void> _signInWithPlayGames() async {
// Get server auth code from 3rd party provider
// See PR description for details on how you might get the server auth code:
// https://github.com/firebase/flutterfire/pull/12201#issue-2100392487
final serverAuthCode = '...';
final playGamesCredential = PlayGamesAuthProvider.credential(
serverAuthCode: serverAuthCode);
await FirebaseAuth.instance
.signInWithCredential(playGamesCredential);
}
Trước khi bắt đầu, hãy thiết lập Ứng dụng nhà phát triển Facebook và làm theo quy trình thiết lập để bật tính năng Đăng nhập bằng Facebook.
Đảm bảo rằng nhà cung cấp dịch vụ đăng nhập "Facebook" đã được bật trong bảng điều khiển Firebasevới Mã ứng dụng và Khoá bí mật của Facebook được thiết lập (chuyển đến thẻ Security > Authentication > Sign-in method tab).
iOS+ và Android
Trên các nền tảng gốc, bạn cần có thư viện của bên thứ ba để cài đặt SDK Facebook và kích hoạt quy trình xác thực.
Cài đặt trình bổ trợ flutter_facebook_auth.
Bạn cần làm theo các bước trong tài liệu về trình bổ trợ để đảm bảo rằng cả SDK Facebook dành cho Android và iOS đều đã được khởi chạy đúng cách. Sau khi hoàn tất, hãy kích hoạt quy trình đăng nhập, tạo thông tin đăng nhập Facebook và đăng nhập cho người dùng:
import 'package:flutter_facebook_auth/flutter_facebook_auth.dart';
Future<UserCredential> signInWithFacebook() async {
// Trigger the sign-in flow
final LoginResult loginResult = await FacebookAuth.instance.login();
// Create a credential from the access token
final OAuthCredential facebookAuthCredential = FacebookAuthProvider.credential(loginResult.accessToken.token);
// Once signed in, return the UserCredential
return FirebaseAuth.instance.signInWithCredential(facebookAuthCredential);
}
Web
Trên web, SDK Firebase hỗ trợ tự động xử lý quy trình xác thực bằng thông tin chi tiết về ứng dụng Facebook được cung cấp trong bảng điều khiển Firebase. Ví dụ:
Tạo nhà cung cấp Facebook, cung cấp mọi phạm vi quyền bổ sung mà bạn muốn nhận từ người dùng.
Đảm bảo rằng URI chuyển hướng OAuth từ bảng điều khiển Firebase được thêm làm URI chuyển hướng OAuth hợp lệ trong Ứng dụng Facebook của bạn.
FacebookAuthProvider facebookProvider = FacebookAuthProvider();
facebookProvider.addScope('email');
facebookProvider.setCustomParameters({
'display': 'popup',
});
Cung cấp thông tin đăng nhập cho phương thức signInWithPopup. Thao tác này sẽ kích hoạt một cửa sổ mới xuất hiện, nhắc người dùng đăng nhập vào ứng dụng Facebook của bạn:
Future<UserCredential> signInWithFacebook() async {
// Create a new provider
FacebookAuthProvider facebookProvider = FacebookAuthProvider();
facebookProvider.addScope('email');
facebookProvider.setCustomParameters({
'display': 'popup',
});
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithPopup(facebookProvider);
// Or use signInWithRedirect
// return await FirebaseAuth.instance.signInWithRedirect(facebookProvider);
}
Apple
iOS+
Trước khi bắt đầu, hãy định cấu hình tính năng Đăng nhập bằng Apple và bật Apple làm nhà cung cấp dịch vụ đăng nhập.
Tiếp theo, hãy đảm bảo rằng các ứng dụng Runner của bạn có tính năng "Đăng nhập bằng Apple".
Android
Trước khi bắt đầu, hãy định cấu hình tính năng Đăng nhập bằng Apple và bật Apple làm nhà cung cấp dịch vụ đăng nhập.
Web
Trước khi bắt đầu, hãy định cấu hình tính năng Đăng nhập bằng Apple và bật Apple làm nhà cung cấp dịch vụ đăng nhập.
import 'package:firebase_auth/firebase_auth.dart';
Future<UserCredential> signInWithApple() async {
final appleProvider = AppleAuthProvider();
if (kIsWeb) {
await FirebaseAuth.instance.signInWithPopup(appleProvider);
} else {
await FirebaseAuth.instance.signInWithProvider(appleProvider);
}
}
Chỉ đăng nhập bằng nền tảng Apple
Bạn cũng có thể đăng nhập bằng Apple trên các nền tảng iOS+ bằng phương thức sau:
// Implement a function that generates a nonce. See iOS documentation for how to create a nonce:
// https://firebase.google.com/docs/auth/ios/apple#sign_in_with_apple_and_authenticate_with_firebase
String rawNonce = createNonce();
// Create a SHA-256 hash of the nonce. Consider using the `crypto` package from the pub.dev registry.
String hashSHA256String = createHashSHA256String(rawNonce);
// Use the hash of the nonce to get the idToken. Consider using the `sign_in_with_apple` plugin from the pub.dev registry.
String idToken = await getIdToken();
final fullName = AppleFullPersonName(
familyName: 'Name',
givenName: 'Your',
);
// Use the `rawNonce` and `idToken` to get the credential
final credential = AppleAuthProvider.credentialWithIDToken(
idToken,
rawNonce,
fullName,
);
await FirebaseAuth.instance.signInWithCredential(credential);
Thu hồi mã xác thực Apple
Tính năng đăng nhập bằng Apple trên các nền tảng Apple trả về một mã uỷ quyền mà bạn có thể dùng để thu hồi mã xác thực Apple bằng API revokeTokenWithAuthorizationCode().
import 'package:firebase_auth/firebase_auth.dart';
Future<UserCredential> signInWithApple() async {
final appleProvider = AppleAuthProvider();
UserCredential userCredential = await FirebaseAuth.instance.signInWithPopup(appleProvider);
// Keep the authorization code returned from Apple platforms
String? authCode = userCredential.additionalUserInfo?.authorizationCode;
// Revoke Apple auth token
await FirebaseAuth.instance.revokeTokenWithAuthorizationCode(authCode!);
}
Apple Game Center (chỉ dành cho Apple)
Đảm bảo rằng nhà cung cấp dịch vụ đăng nhập "Game Center" đã được bật trong bảng điều khiển Firebase (chuyển đến thẻ Security > Authentication > Sign-in method tab). Hãy làm theo các hướng dẫn này để thiết lập dự án Firebase cho Game Center.
Bạn cần đăng nhập bằng Game Center trước khi có thể cấp và đăng nhập thông tin đăng nhập Firebase Game Center thông qua Firebase. Dưới đây là một số hướng dẫn về cách thực hiện việc đó.
iOS+
Future<void> _signInWithGameCenter() async {
final credential = GameCenterAuthProvider.credential();
await FirebaseAuth.instance
.signInWithCredential(credential);
}
Microsoft
iOS+
Trước khi bắt đầu định cấu hình tính năng Đăng nhập bằng Microsoft cho iOS và thêm các lược đồ URL tuỳ chỉnh vào Runner (bước 1).
Android
Trước khi bắt đầu, hãy định cấu hình tính năng Đăng nhập bằng Microsoft cho Android.
Đừng quên thêm dấu vân tay SHA-1 của ứng dụng.
Web
Trước khi bắt đầu, hãy định cấu hình tính năng Đăng nhập bằng Microsoft cho Web.
import 'package:firebase_auth/firebase_auth.dart';
Future<UserCredential> signInWithMicrosoft() async {
final microsoftProvider = MicrosoftAuthProvider();
if (kIsWeb) {
await FirebaseAuth.instance.signInWithPopup(microsoftProvider);
} else {
await FirebaseAuth.instance.signInWithProvider(microsoftProvider);
}
}
Đảm bảo rằng nhà cung cấp dịch vụ đăng nhập "Twitter" đã được bật trong bảng điều khiển Firebase với Khoá API và Mã thông báo bí mật cho API được thiết lập (chuyển đến thẻ Security > Authentication > Sign-in method tab).
Đả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 ứng dụng Twitter của bạn.
Bạn cũng có thể cần yêu cầu quyền truy cập API nâng cao tuỳ thuộc vào ứng dụng của mình.
iOS+
Bạn cần định cấu hình lược đồ URL tuỳ chỉnh như mô tả trong bước 1 của hướng dẫn dành cho iOS.
Android
Nếu bạn chưa làm việc này, hãy chỉ định dấu vân tay SHA-1 của ứng dụng:
Trong bảng điều khiển Firebase, hãy chuyển đến phần cài đặt
Settings > thẻ General.Di chuyển xuống thẻ Your apps (Ứng dụng của bạn), chọn ứng dụng Android rồi thêm dấu vân tay SHA-1 vào trường SHA certificate fingerprints (Dấu vân tay chứng chỉ SHA).
Hãy xem bài viết Xác thực ứng dụng của bạn để biết thông tin chi tiết về cách lấy dấu vân tay SHA của ứng dụng.
Web
Hoạt động ngay sau khi cài đặt.
import 'package:firebase_auth/firebase_auth.dart';
Future<void> _signInWithTwitter() async {
TwitterAuthProvider twitterProvider = TwitterAuthProvider();
if (kIsWeb) {
await FirebaseAuth.instance.signInWithPopup(twitterProvider);
} else {
await FirebaseAuth.instance.signInWithProvider(twitterProvider);
}
}
GitHub
Đảm bảo rằng bạn đã thiết lập Ứng dụng OAuth trong phần Cài đặt nhà phát triển GitHub và nhà cung cấp dịch vụ đăng nhập "GitHub" đã được bật trong bảng điều khiển Firebase (chuyển đến thẻ Security > Authentication > Sign-in method). Đảm bảo rằng Mã ứng dụng và Khoá bí mật được thiết lập, với URL gọi lại được thiết lập trong ứng dụng GitHub.
iOS+ và Android
Đối với các nền tảng gốc, bạn cần thêm google-services.json và GoogleService-Info.plist.
Đối với iOS, hãy thêm lược đồ URL tuỳ chỉnh như mô tả trong hướng dẫn dành cho iOS bước 1.
Future<UserCredential> signInWithGitHub() async {
// Create a new provider
GithubAuthProvider githubProvider = GithubAuthProvider();
return await FirebaseAuth.instance.signInWithProvider(githubProvider);
}
Web
Trên web, SDK GitHub hỗ trợ tự động xử lý quy trình xác thực bằng thông tin chi tiết về ứng dụng GitHub được cung cấp trong bảng điều khiển Firebase. Đảm bảo rằng URL gọi lại trong bảng điều khiển Firebaseđược thêm làm URL gọi lại trong ứng dụng GitHub của bạn trên bảng điều khiển dành cho nhà phát triển.
Ví dụ:
Tạo nhà cung cấp GitHub và cung cấp thông tin đăng nhập cho phương thức signInWithPopup. Thao tác này sẽ kích hoạt một cửa sổ mới xuất hiện, nhắc người dùng đăng nhập vào ứng dụng GitHub của bạn:
Future<UserCredential> signInWithGitHub() async {
// Create a new provider
GithubAuthProvider githubProvider = GithubAuthProvider();
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithPopup(githubProvider);
// Or use signInWithRedirect
// return await FirebaseAuth.instance.signInWithRedirect(githubProvider);
}
Yahoo
Đảm bảo rằng nhà cung cấp dịch vụ đăng nhập "Yahoo" đã được bật trong bảng điều khiển Firebase với Khoá API và Mã thông báo bí mật cho API được thiết lập (chuyển đến thẻ Security > Authentication > Sign-in method tab).
Ngoài ra, hãy đả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 URI chuyển hướng trong cấu hình Mạng nhà phát triển Yahoo của ứng dụng.
iOS+
Trước khi bắt đầu, hãy định cấu hình tính năng Đăng nhập bằng Yahoo cho iOS và thêm các lược đồ URL tuỳ chỉnh vào Runner (bước 1).
Android
Trước khi bắt đầu, hãy định cấu hình tính năng Đăng nhập bằng Yahoo cho Android.
Đừng quên thêm dấu vân tay SHA-1 của ứng dụng.
Web
Hoạt động ngay sau khi cài đặt.
import 'package:firebase_auth/firebase_auth.dart';
Future<UserCredential> signInWithYahoo() async {
final yahooProvider = YahooAuthProvider();
if (kIsWeb) {
await _auth.signInWithPopup(yahooProvider);
} else {
await _auth.signInWithProvider(yahooProvider);
}
}
Sử dụng mã truy cập OAuth
Bằng cách sử dụng AuthProvider, bạn có thể truy xuất mã truy cập được liên kết với nhà cung cấp bằng cách đưa ra yêu cầu sau.
final appleProvider = AppleAuthProvider();
final user = await FirebaseAuth.instance.signInWithProvider(appleProvider);
final accessToken = user.credential?.accessToken;
// You can send requests with the `accessToken`
Liên kết nhà cung cấp dịch vụ xác thực
Nếu muốn liên kết một nhà cung cấp với người dùng hiện tại, bạn có thể sử dụng phương thức sau:
await FirebaseAuth.instance.signInAnonymously();
final appleProvider = AppleAuthProvider();
if (kIsWeb) {
await FirebaseAuth.instance.currentUser?.linkWithPopup(appleProvider);
// You can also use `linkWithRedirect`
} else {
await FirebaseAuth.instance.currentUser?.linkWithProvider(appleProvider);
}
// You're anonymous user is now upgraded to be able to connect with Sign In With Apple
Xác thực lại bằng nhà cung cấp
Bạn có thể sử dụng cùng một mẫu với reauthenticateWithProvider để truy xuất thông tin đăng nhập mới cho các thao tác nhạy cảm yêu cầu đăng nhập gần đây.
final appleProvider = AppleAuthProvider();
if (kIsWeb) {
await FirebaseAuth.instance.currentUser?.reauthenticateWithPopup(appleProvider);
// Or you can reauthenticate with a redirection
// await FirebaseAuth.instance.currentUser?.reauthenticateWithRedirect(appleProvider);
} else {
await FirebaseAuth.instance.currentUser?.reauthenticateWithProvider(appleProvider);
}
// You can now perform sensitive operations