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

Xác thực mạng xã hội là 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 đường liên kết với một chiến dịch hiện có.

Cả nền tảng gốc và tính nă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 signInWithCredential hoặc phương thức linkWithCredential. Ngoài ra, trên các nền tảng web, bạn có thể kích hoạt quá trình xác thực thông qua một cửa sổ bật lên hoặc liên kết chuyển hướng.

Google

Hầu hết các cấu hình đều đượ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 máy của mình Khoá SHA1 đã đượ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 thuộc tính "Google" nhà cung cấp dịch vụ đăng nhập được bật 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, nhà cung cấp dịch vụ xác thực của họ sẽ tự động thay đổi thành Google, theo khái niệm Xác thực Firebase của nhà cung cấp đáng tin cậy. Bạn có thể tìm hiểu thêm về xem nội dung 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 nhà cung cấp dịch vụ xác thực của Google, cung cấp bất kỳ phạm vi quyền bổ sung nào 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 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ữ lại 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 thuộc tính "Play Games" nhà cung cấp dịch vụ đăng nhập được bật trên Bảng điều khiển của 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 này để định cấu hình Dịch vụ trò chơi của Play với ứ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);
}

Facebook

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 trang "Facebook" nhà cung cấp dịch vụ đăng nhập được bật trên Bảng điều khiển của Firebase. bằng cách đặt Mã ứng dụng Facebook và đặt 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 sẽ cần thực hiện theo các bước trong tài liệu về trình bổ trợ để đảm bảo rằng cả Android & Đã khởi chạy SDK Facebook dành cho iOS chính xác. 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 bất kỳ phạm vi quyền bổ sung nào mà bạn muốn có được từ người dùng.

Đảm bảo rằng bạn đã 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 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 các ứng dụng Runner của bạn đã có chế độ "Đăng nhập bằng Apple" chức năng.

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 của Apple

Bạn cũng có thể đăng nhập vào Apple trên các nền tảng iOS trở lên bằng phương pháp 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

Khi đăng nhập qua Apple trên các nền tảng của Apple, hệ thống sẽ trả về một mã uỷ quyền có thể sử dụng để thu hồi mã thông báo xác thực của Apple bằng cách sử dụng revokeTokenWithAuthorizationCode() API.

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 "Trung tâm trò chơi" nhà cung cấp dịch vụ đăng nhập được bật trên Bảng điều khiển của Firebase. Làm theo các hướng dẫn sau để thiết lập dự án Firebase của Trung tâm trò chơi.

Bạn sẽ cần đăng nhập bằng Trung tâm trò chơi trước khi có thể cấp thông tin đăng nhập vào Trung tâm trò chơi Firebase và đăng nhập qua Firebase. Sau đây là một số hướng dẫn về cách đạt được điều đó.

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ạn bắt đầu định cấu hình Đăng nhập Microsoft cho iOS và thêm lược đồ URL tuỳ chỉnh cho ứng dụng 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);
  }
}

Twitter

Đảm bảo "Twitter" nhà cung cấp dịch vụ đăng nhập được bật trên Bảng điều khiển của Firebase bằng một khoá API và tập hợp 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 ủy 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 theo 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 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 Ứng dụng OAuth trong phần Cài đặt nhà phát triển GitHub và rằng "GitHub" nhà cung cấp dịch vụ đăng nhập được bật trên Bảng điều khiển của Firebase có Mã ứng dụng khách và Bí mật đều được đặt, trong đó 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.jsonGoogleService-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 cung cấp tính năng 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 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 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 lệnh "Yahoo" nhà cung cấp dịch vụ đăng nhập được bật trên Bảng điều khiển của Firebase bằng một khoá API và tập hợp 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 của bạn.

iOS trở lên

Trước khi bạn 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 cho ứng dụng Runner (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.

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 cách sau: Phi tiêu chờ FirebaseAuth.instance.signInAnonymously();

last appleProvider = AppleAuthProvider();

if (kIsWeb) { đang chờ FirebaseAuth.instance.currentUser?.linkWithPopup(appleProvider);

// Bạn cũng có thể sử dụng linkWithRedirect } else { chờ 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ư mục mới thông tin đăng nhập 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