هویت فدرال & ورود به سیستم اجتماعی

احراز هویت اجتماعی یک جریان احراز هویت چند مرحله‌ای است که به شما امکان می‌دهد یک کاربر را وارد یک حساب کاربری کنید یا او را به یک حساب کاربری موجود متصل کنید.

هم پلتفرم‌های بومی و هم وب از ایجاد یک اعتبارنامه پشتیبانی می‌کنند که می‌تواند به متدهای signInWithCredential یا linkWithCredential ارسال شود. به طور جایگزین، در پلتفرم‌های وب، می‌توانید فرآیند احراز هویت را از طریق یک پنجره بازشو یا تغییر مسیر آغاز کنید.

گوگل

بیشتر پیکربندی‌ها هنگام استفاده از ورود به سیستم گوگل با فایربیس از قبل تنظیم شده‌اند، با این حال باید مطمئن شوید که کلید SHA1 دستگاه شما برای استفاده با اندروید پیکربندی شده است. می‌توانید نحوه تولید کلید را در مستندات احراز هویت مشاهده کنید.

مطمئن شوید که ارائه دهنده ورود به سیستم "Google" در کنسول Firebase فعال شده است.

اگر کاربر شما پس از ثبت دستی حساب کاربری، با گوگل وارد سیستم شود، به دلیل مفهوم ارائه دهندگان معتبر احراز هویت Firebase، ارائه دهنده احراز هویت او به طور خودکار به گوگل تغییر خواهد کرد. می‌توانید اطلاعات بیشتر در مورد این موضوع را اینجا بیابید.

iOS+ و اندروید

در پلتفرم‌های native، برای راه‌اندازی جریان احراز هویت، به یک کتابخانه شخص ثالث نیاز است.

افزونه رسمی google_sign_in را نصب کنید.

پس از نصب، جریان ورود به سیستم را فعال کنید و یک اعتبارنامه جدید ایجاد کنید:

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

وب

در وب، Firebase SDK از مدیریت خودکار جریان احراز هویت با استفاده از پروژه Firebase شما پشتیبانی می‌کند. برای مثال:

یک ارائه‌دهنده‌ی مجوز گوگل ایجاد کنید و هرگونه محدوده‌ی مجوز اضافی که می‌خواهید از کاربر دریافت کنید را در آن قرار دهید:

GoogleAuthProvider googleProvider = GoogleAuthProvider();

googleProvider.addScope('https://www.googleapis.com/auth/contacts.readonly');
googleProvider.setCustomParameters({
  'login_hint': 'user@example.com'
});

اعتبارنامه را به متد signInWithPopup ارائه دهید. این کار باعث می‌شود یک پنجره جدید ظاهر شود و از کاربر بخواهد به پروژه شما وارد شود. همچنین می‌توانید از signInWithRedirect برای نگه داشتن فرآیند احراز هویت در همان پنجره استفاده کنید.

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

بازی‌های گوگل پلی (فقط اندروید)

مطمئن شوید که ارائه دهنده ورود به سیستم "Play Games" در کنسول Firebase فعال شده است. برای تنظیم پروژه Play Games Firebase این دستورالعمل‌ها را دنبال کنید.

برای پیکربندی سرویس‌های Play Games با برنامه Firebase خود، این دستورالعمل‌ها را دنبال کنید.

اندروید

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

فیسبوک

قبل از شروع ، برنامه توسعه‌دهنده فیس‌بوک خود را راه‌اندازی کنید و مراحل راه‌اندازی را برای فعال کردن ورود به سیستم فیس‌بوک دنبال کنید.

مطمئن شوید که ارائه‌دهنده‌ی ورود به سیستم «فیس‌بوک» در کنسول فایربیس فعال است و شناسه‌ی برنامه‌ی فیس‌بوک و رمز عبور آن تنظیم شده‌اند.

iOS+ و اندروید

در پلتفرم‌های بومی، یک کتابخانه شخص ثالث برای نصب SDK فیس‌بوک و راه‌اندازی جریان احراز هویت مورد نیاز است.

افزونه flutter_facebook_auth را نصب کنید.

برای اطمینان از اینکه SDK های فیسبوک اندروید و iOS به درستی مقداردهی اولیه شده‌اند، باید مراحل موجود در مستندات افزونه را دنبال کنید. پس از اتمام، جریان ورود به سیستم را فعال کنید، یک اعتبارنامه فیسبوک ایجاد کنید و کاربر را وارد سیستم کنید:

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

وب

در وب، Firebase SDK از مدیریت خودکار جریان احراز هویت با استفاده از جزئیات برنامه فیس‌بوک ارائه شده در کنسول Firebase پشتیبانی می‌کند. برای مثال:

یک ارائه‌دهنده فیس‌بوک ایجاد کنید و هرگونه محدوده مجوز اضافی که می‌خواهید از کاربر دریافت کنید را در آن قرار دهید.

مطمئن شوید که URI مربوط به OAuth redirect از کنسول Firebase به عنوان یک URI معتبر برای OAuth Redirect در برنامه فیسبوک شما اضافه شده است.

FacebookAuthProvider facebookProvider = FacebookAuthProvider();

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

اعتبارنامه را به متد signInWithPopup ارائه دهید. این کار باعث می‌شود یک پنجره جدید ظاهر شود و از کاربر بخواهد به برنامه فیس‌بوک شما وارد شود:

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

اپل

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

فقط ورود به سیستم عامل اپل

ورود به سیستم اپل در پلتفرم‌های 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);

توکن‌های احراز هویت اپل را لغو کنید

ورود به سیستم اپل در پلتفرم‌های اپل، یک کد مجوز برمی‌گرداند که می‌تواند برای لغو توکن احراز هویت اپل با استفاده از 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!);
}

مرکز بازی اپل (فقط اپل)

مطمئن شوید که ارائه دهنده ورود به سیستم "Game Center" در کنسول Firebase فعال شده است. برای تنظیم پروژه Game Center Firebase این دستورالعمل‌ها را دنبال کنید.

قبل از اینکه بتوانید اعتبارنامه Firebase Game Center را صادر کنید و از طریق Firebase وارد سیستم شوید، باید با Game Center وارد شوید. در اینجا چند دستورالعمل در مورد چگونگی دستیابی به این امر آورده شده است .

آی‌او‌اس+

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

مایکروسافت

آی‌او‌اس+

قبل از شروع پیکربندی Microsoft Login برای iOS و اضافه کردن طرح‌های URL سفارشی به Runner خود (مرحله 1) .

اندروید

قبل از شروع پیکربندی Microsoft Login برای اندروید .

فراموش نکنید که اثر انگشت SHA-1 برنامه خود را اضافه کنید.

وب

قبل از شروع پیکربندی Microsoft Login for 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" در کنسول Firebase با تنظیم کلید API و راز API فعال شده است. مطمئن شوید که URI تغییر مسیر OAuth Firebase شما (مثلاً my-app-12345.firebaseapp.com/__/auth/handler) به عنوان URL فراخوانی مجوز شما در صفحه تنظیمات برنامه در پیکربندی برنامه Twitter شما تنظیم شده است.

همچنین بسته به برنامه‌تان، ممکن است نیاز به درخواست دسترسی API سطح بالا داشته باشید.

آی‌او‌اس+

شما باید طرح URL سفارشی خود را همانطور که در مرحله 1 راهنمای iOS توضیح داده شده است، پیکربندی کنید.

اندروید

اگر هنوز اثر انگشت SHA-1 برنامه خود را مشخص نکرده‌اید، این کار را از صفحه تنظیمات کنسول Firebase انجام دهید. برای جزئیات بیشتر در مورد نحوه دریافت اثر انگشت SHA-1 برنامه خود، به بخش احراز هویت کلاینت خود مراجعه کنید.

وب

خارج از جعبه کار می‌کند.

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

گیت‌هاب

مطمئن شوید که یک برنامه OAuth را از تنظیمات توسعه‌دهنده GitHub خود راه‌اندازی کرده‌اید و ارائه‌دهنده ورود به سیستم "GitHub" در کنسول Firebase با تنظیم شناسه کلاینت و راز و همچنین تنظیم URL پاسخ به تماس در برنامه GitHub فعال شده است.

iOS+ و اندروید

برای پلتفرم‌های بومی، باید google-services.json و GoogleService-Info.plist را اضافه کنید.

برای iOS، طرح URL سفارشی را همانطور که در مرحله 1 راهنمای iOS توضیح داده شده است، اضافه کنید.

Future<UserCredential> signInWithGitHub() async {
  // Create a new provider
  GithubAuthProvider githubProvider = GithubAuthProvider();

  return await FirebaseAuth.instance.signInWithProvider(githubProvider);
}

وب

در وب، GitHub SDK از مدیریت خودکار جریان احراز هویت با استفاده از جزئیات برنامه GitHub ارائه شده در کنسول Firebase پشتیبانی می‌کند. اطمینان حاصل کنید که URL برگشتی در کنسول Firebase به عنوان URL برگشتی در برنامه GitHub شما در کنسول توسعه‌دهنده اضافه شده است.

برای مثال:

یک ارائه‌دهنده‌ی گیت‌هاب ایجاد کنید و اعتبارنامه را به متد signInWithPopup ارائه دهید. این کار باعث می‌شود یک پنجره‌ی جدید ظاهر شود و از کاربر بخواهد به برنامه‌ی گیت‌هاب شما وارد شود:

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" در کنسول Firebase با تنظیم کلید API و راز API فعال شده است. همچنین مطمئن شوید که URI تغییر مسیر OAuth مربوط به Firebase شما (مثلاً my-app-12345.firebaseapp.com/__/auth/handler) به عنوان URI تغییر مسیر در پیکربندی شبکه‌ی توسعه‌دهندگان یاهو برنامه‌ی شما تنظیم شده است.

آی‌او‌اس+

قبل از شروع، Yahoo Login را برای iOS پیکربندی کنید و طرح‌های URL سفارشی را به Runner خود اضافه کنید (مرحله 1) .

اندروید

قبل از شروع، ورود یاهو را برای اندروید پیکربندی کنید .

فراموش نکنید که اثر انگشت SHA-1 برنامه خود را اضافه کنید.

وب

خارج از جعبه کار می‌کند.

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

استفاده از توکن دسترسی OAuth

با استفاده از یک AuthProvider، می‌توانید با ارسال درخواست زیر، توکن دسترسی مرتبط با ارائه‌دهنده را بازیابی کنید.

final appleProvider = AppleAuthProvider();

final user = await FirebaseAuth.instance.signInWithProvider(appleProvider);
final accessToken = user.credential?.accessToken;

// You can send requests with the `accessToken`

اتصال یک ارائه‌دهنده احراز هویت

اگر می‌خواهید یک ارائه‌دهنده را به یک کاربر فعلی پیوند دهید، می‌توانید از روش زیر استفاده کنید:

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

احراز هویت مجدد با ارائه دهنده

همین الگو را می‌توان با reauthenticateWithProvider استفاده کرد که می‌تواند برای بازیابی اعتبارنامه‌های جدید برای عملیات حساسی که نیاز به ورود اخیر دارند، استفاده شود.

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