Xác thực 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à nền tảng hỗ trợ web đều hỗ trợ việc tạo thông tin đăng nhập, sau đó thông tin này có thể được truyền đến 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 lệnh chuyển hướng.
Hầu hết các cấu hình đã được thiết lập khi 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 để 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 bạn đã bật nhà cung cấp dịch vụ đăng nhập "Google" trên Bảng điều khiển của Firebase.
Nếu người dùng của bạn đăng nhập bằng Google, thì sau khi đã đăng ký tài khoản theo cách thủ công, trình cung cấp dịch vụ xác thực của họ sẽ tự động thay đổi sang Google, theo khái niệm Xác thực Firebase của các nhà cung cấp đáng tin cậy. 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, 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().signIn();
// Obtain the auth details from the request
final GoogleSignInAuthentication? googleAuth = await googleUser?.authentication;
// Create a new credential
final credential = GoogleAuthProvider.credential(
accessToken: googleAuth?.accessToken,
idToken: googleAuth?.idToken,
);
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithCredential(credential);
}
Web
Trên web, Firebase SDK hỗ trợ tính năng tự động xử lý quy trình xác thực bằng cách sử dụng dự án Firebase của bạn. Ví dụ:
Tạo trình cung cấp dịch vụ xác thực của Google, cung cấp mọi phạm vi cấp quyền bổ sung mà bạn muốn có được 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 và nhắc người dùng đăng nhập vào dự án của bạn. Ngoài ra, bạn có thể dùng signInWithRedirect
để duy trì 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
Bạn có thể xác thực người dùng trong trò chơi Android của mình bằng tính năng Đăng nhập vào Play Games.
Android
Làm theo hướng dẫn để thiết lập Google trên Android, sau đó định cấu hình Dịch vụ trò chơi của Play với thông tin ứng dụng Firebase của bạn.
Các thao tác sau sẽ kích hoạt quy trình đăng nhập, tạo thông tin đăng nhập mới rồi đăng nhập cho người dùng:
final googleUser = await GoogleSignIn(
signInOption: SignInOption.games,
).signIn();
final googleAuth = await googleUser?.authentication;
if (googleAuth != null) {
// Create a new credential
final credential = GoogleAuthProvider.credential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
// Once signed in, return the UserCredential
await _auth.signInWithCredential(credential);
}
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 Facebook.
Đảm bảo bạn đã bật trình cung cấp dịch vụ đăng nhập "Facebook" trên Bảng điều khiển Firebase với tập hợp Mã ứng dụng Facebook và Khoá bí mật.
iOS+ và Android
Trên các nền tảng gốc, cần có thư viện của bên thứ ba để vừa cài đặt SDK Facebook vừa kích hoạt luồng 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 rồi đăng nhập 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, Firebase SDK hỗ trợ tính năng tự động xử lý quy trình xác thực bằng cách sử dụng thông tin chi tiết về ứng dụng Facebook được cung cấp trên bảng điều khiển của Firebase. Ví dụ:
Tạo một nhà cung cấp Facebook, cung cấp mọi phạm vi cấp quyền bổ sung mà bạn muốn có được từ người dùng.
Đảm bảo thêm URI chuyển hướng OAuth từ bảng điều khiển của Firebase dưới dạng URI chuyển hướng OAuth hợp lệ trong Ứng dụng Facebook.
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:
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ở lên
Trước khi bắt đầu, hãy định cấu hình tính năng Đăng nhập bằng Apple rồi 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 rồi 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 rồi 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);
}
}
Thu hồi mã thông báo xác thực của Apple
Tính năng đăng nhập của Apple trên các nền tảng của Apple sẽ trả về một mã uỷ quyền có thể dùng để thu hồi mã thông báo xác thực của 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!);
}
Microsoft
iOS trở lên
Trước khi bạn bắt đầu định cấu hình Đăng nhập Microsoft cho iOS và thêm các giao thức URL tuỳ chỉnh vào Runner (bước 1).
Android
Trước khi bạn bắt đầu định cấu hình tính năng Đăng nhập của Microsoft cho Android.
Đừng quên thêm vân tay SHA-1 của ứng dụng.
Web
Trước khi bạn bắt đầu định cấu hình tính năng Đăng nhập 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 bạn đã bật nhà cung cấp dịch vụ đăng nhập "Twitter" trên Bảng điều khiển của Firebase bằng cách đặt Khoá API và Khoá bí mật API. Đảm bảo 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.
Bạn cũng có thể cần yêu cầu quyền truy cập API cấp cao tuỳ thuộc vào ứng dụng của bạn.
iOS trở lên
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 iOS.
Android
Nếu bạn chưa chỉ định vân tay số SHA-1 của ứng dụng, hãy thực hiện việc này trên trang Cài đặt của bảng điều khiển của Firebase. Tham khảo 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 vân tay SHA-1 của ứng dụng.
Web
Hoạt động ngay từ đầu.
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 một Ứng dụng OAuth từ phần Cài đặt nhà phát triển GitHub và bật trình cung cấp đăng nhập "GitHub" trên Bảng điều khiển Firebase với Mã ứng dụng khách và Khoá bí mật, với URL gọi lại đã được đặt 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 tùy 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ính năng tự động xử lý quy trình xác thực bằng cách sử dụng thông tin chi tiết về ứng dụng GitHub được cung cấp trên bảng điều khiển của Firebase. Đảm bảo rằng bạn thêm URL gọi lại trong bảng điều khiển của Firebase dưới dạng URL gọi lại trong ứng dụng GitHub trên bảng điều khiển dành cho nhà phát triển.
Ví dụ:
Tạo một trì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 bạn đã bật nhà cung cấp dịch vụ đăng nhập "Yahoo" trên Bảng điều khiển Firebase bằng Khoá API và Khoá bí mật API. Ngoài ra, hãy đảm bảo 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ở lên
Trước khi bắt đầu, hãy định cấu hình Đăng nhập Yahoo cho iOS và thêm lược đồ URL tùy chỉnh vào Runner của bạn (bước 1).
Android
Trước khi bạn bắt đầu, hãy định cấu hình tính năng Đăng nhập Yahoo cho Android.
Đừng quên thêm vân tay SHA-1 của ứng dụng.
Web
Hoạt động ngay từ đầu.
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
Khi sử dụng AuthProvider, bạn có thể truy xuất mã truy cập liên kết với nhà cung cấp bằng cách đưa ra yêu cầu sau đây.
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: ```dart await FirebaseAuth.instance.signInAnonymously();
last appleProvider = AppleAuthProvider();
if (kIsWeb) { await FirebaseAuth.instance.currentUser?.linkWithPopup(appleProvider);
// Bạn cũng có thể sử dụng linkWithRedirect
} else {
await FirebaseAuth.instance.currentUser?.linkWithProvider(appleProvider);
}
// Bạn là người dùng ẩn danh hiện đã được nâng cấp để có thể kết nối bằng tính năng Đăng nhập bằng Apple ```
Xác thực lại với nhà cung cấp
Bạn có thể dùng cùng một mẫu với reauthenticateWithProvider
để truy xuất thông tin xác thực mới cho các hoạt động 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