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à 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.

Google

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);
}

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 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);
  }
}

Twitter

Đả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.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 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