Xác thực qua 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 họ 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, sau đó có thể được truyề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 lệnh chuyển hướng.
Hầu hết 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 để 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 bạn đã bật trì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 đă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 thay đổi thành Google, do khái niệm về nhà cung cấp đáng tin cậy của Firebase Authentication. 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 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, Firebase SDK 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 một trì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 lấy 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ể 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 bạn đã bật trình cung cấp dịch vụ đăng nhập "Play Games" trên Bảng điều khiển Firebase. Hãy làm theo các hướng dẫn này để thiết lập dự án Firebase cho Play Games.
Làm theo hướng dẫn này để định cấu hình Dịch vụ trò chơi của Play bằng ứng dụng Firebase của bạn.
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 bạn đã bật nhà cung cấp dịch vụ đăng nhập "Facebook" trên Bảng điều khiển Firebase, đồng thời đã đặt Mã ứng dụng và Khoá bí mật của Facebook.
iOS+ và Android
Trên các nền tảng gốc, bạn cần có một thư viện của bên thứ ba để cài đặt Facebook SDK và kích hoạt quy trình xác thực.
Cài đặt trình bổ trợ flutter_facebook_auth.
Bạn sẽ 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 trên bảng điều khiển Firebase. Ví dụ:
Tạo một nhà cung cấp Facebook, cung cấp mọi phạm vi quyền bổ sung mà bạn muốn lấy từ người dùng.
Đảm bảo rằng URI chuyển hướng OAuth từ bảng điều khiển của Firebase được thêm dưới dạng 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ó khả 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ể sử dụng phương thức sau để đăng nhập bằng Apple trên các nền tảng iOS+:
// 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ã thông báo xác thực của Apple
Tính năng đăng nhập bằng Apple trên các nền tảng của Apple sẽ trả về một mã uỷ quyền mà bạ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!);
}
Apple Game Center (chỉ dành cho Apple)
Đảm bảo bạn đã bật trình cung cấp dịch vụ đăng nhập "Game Center" trên Bảng điều khiển của Firebase. 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ể phát hành và đăng nhập thông qua Firebase bằng thông tin đăng nhập Game Center của Firebase. Sau đâ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, hãy đị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 Trình chạy (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 trên Firebase Console với Khoá API và Khoá bí mật API đã được thiết lập. Đảm bảo bạn đã đặt URI chuyển hướng OAuth của Firebase (ví dụ: my-app-12345.firebaseapp.com/__/auth/handler) làm URL gọi lại Uỷ quyền trong trang cài đặt ứ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 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 về iOS.
Android
Nếu bạn chưa chỉ định vân tay số SHA-1 của ứng dụng, hãy chỉ định trên trang Cài đặt của bảng điều khiển Firebase. Hãy 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 dấu vân tay SHA-1 của ứng dụng.
Web
Hoạt động ngay khi mở hộp.
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 trong phần GitHub Developer Settings (Chế độ cài đặt dành cho nhà phát triển trên GitHub) và đã bật nhà cung cấp dịch vụ đăng nhập "GitHub" trên Firebase Console (Bảng điều khiển Firebase) với Mã ứng dụng và Khoá bí mật đã được thiết lập, đồng thờ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 giản đồ URL tuỳ chỉnh như mô tả trong bước 1 của hướng dẫn về iOS.
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 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 Firebase. Đảm bảo rằng URL gọi lại trong bảng điều khiển của 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 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 rằng nhà cung cấp dịch vụ đăng nhập "Yahoo" được bật trên Bảng điều khiển Firebase với Khoá API và Khoá bí mật API đã được đặt. 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 Yahoo Developer Network của ứng dụng.
iOS+
Trước khi bắt đầu, hãy định cấu hình Yahoo Login cho iOS và thêm các lược đồ URL tuỳ chỉnh vào Trình chạy (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 khi mở hộp.
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 mộ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 với nhà cung cấp
Bạn có thể sử dụng cùng một mẫu với reauthenticateWithProvider. Mẫu này có thể dùng để truy xuất thông tin đăng nhập mới cho các thao tác nhạy cảm đòi hỏi phải đă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