Danh tính liên kết và đăng nhập bằng mạng xã hội

Xác thực bằng mạng xã hội là một luồng xác thực gồm 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 xác thực, sau đó có thể truyền thông tin đó đế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.

Google

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 Authentications. Bạn có thể tìm hiểu thêm về vấn đề này tại đây.

iOS trở lên 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 xác thực 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, 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 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 nhận đượ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 xác thực 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ữ cho quá 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 hướng dẫn này để thiết lập dự án Firebase của Play Games.

Làm theo hướng dẫn định cấu hình Dịch vụ trò chơi của Play 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);
}

Facebook

Trước khi bắt đầu, hãy thiết lập Ứng dụng dành cho 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 đăng nhập "Facebook" trên Bảng điều khiển Firebase. với mã nhận dạng ứng dụng và mã xác thực của Facebook.

iOS trở lên 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 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 trên Facebook và đă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, SDK Firebase 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 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 nhận được 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.

FacebookAuthProvider facebookProvider = FacebookAuthProvider();

facebookProvider.addScope('email');
facebookProvider.setCustomParameters({
  'display': 'popup',
});

Cung cấp thông tin xác thực 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ở lên

Trước khi bắt đầu, hãy định cấu hình tính năng Đăng nhập bằng Applebật Apple làm nhà cung cấp dịch vụ đăng nhập.

Tiếp theo, hãy đảm bảo rằng ứng dụng Runner của bạn có chức 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 Applebậ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 Applebậ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 vào 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ã 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 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 Firebase. Hãy làm theo 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 tin xác thực Firebase Game Center thông qua Firebase. Sau đây là một số hướng dẫn về cách thực hiện việc đó.

iOS trở lên

Future<void> _signInWithGameCenter() async {
  final credential = GameCenterAuthProvider.credential();
  await FirebaseAuth.instance
      .signInWithCredential(credential);
}

Microsoft

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 Microsoft cho iOS và thêm 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 vân tay số SHA-1 của ứng dụng.

Web

Trước khi bắt đầu, hãy thiết lập 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);
  }
}

Twitter

Đảm bảo bạn đã bật nhà cung cấp đăng nhập "Twitter" trên Bảng điều khiển Firebase bằng cách đặt Khoá API và Mã xác thực API. Đảm bảo bạn đặt URI chuyển hướng OAuth 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 của ứng dụng trên cấu hình của ứ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 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 dành cho 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 Firebase. Hãy tham khảo phần 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 số 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 trong phần Cài đặt dành cho nhà phát triển GitHub và đã bật trình cung cấp dịch vụ đăng nhập "GitHub" trên Bảng điều khiển Firebase với Mã ứng dụng và Mã xác thực đã được đặt, cùng với URL gọi lại được đặt trong ứng dụng GitHub.

iOS trở lên và Android

Đối với các nền tảng gốc, bạn cần thêm google-services.jsonGoogleService-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 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 Firebase được thêm vào dưới dạng 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 xác thực 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 đăng nhập "Yahoo" trên Bảng điều khiển Firebase bằng cách đặt Khoá API và Mã xác thực API. Ngoài ra, hãy đảm bảo rằng URI chuyển hướng OAuth 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 tính năng Đăng nhập bằng Yahoo cho iOS và thêm 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 vân tay số 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

Bằng cách sử dụng AuthProvider, bạn có thể truy xuất mã thông báo truy cập được liên kết với trì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 với 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 để truy xuất thông tin xác thực 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