اصالت‌سنجی بااستفاده از Game Center

می‌توانید از Game Center برای ورود به سیستم بازیکنان در بازی‌های پلاتفرم Apple که در Firebase ساخته شده‌اند استفاده کنید. برای استفاده از «ورود به سیستم Game Center» با Firebase، ابتدا مطمئن شوید که بازیکن محلی با Game Center به سیستم وارد شده باشد، و سپس از شیء GameCenterAuthProvider برای تولید اطلاعات اعتباری Firebase استفاده کنید، که می‌توانید از آن برای اصالت‌سنجی با Firebase استفاده کنید.

قبل از شروع

از «مدیر بسته Swift» برای نصب و مدیریت وابستگی‌های Firebase استفاده کنید.

  1. در Xcode، با باز بودن پروژه برنامه، به File > Add Packages (فایل > افزودن بسته‌ها) پیمایش کنید.
  2. وقتی درخواست شد، مخزن کیت توسعه نرم‌افزار پلاتفرم‌های Firebase Apple را اضافه کنید:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. کتابخانه Firebase Authentication را انتخاب کنید.
  5. پرچم -ObjC را به بخش پرچم‌های پیونددهنده دیگر در تنظیمات ساخت هدف اضافه کنید.
  6. پس‌از اتمام، Xcode به‌طور خودکار شروع به حل و بارگیری وابستگی‌های شما در پس‌زمینه می‌کند.

سپس، چند مرحله پیکربندی را انجام دهید:

  1. مطمئن شوید برنامه Apple خود را در Firebase ثبت کنید. این یعنی باید شناسه دسته‌ای برنامه‌تان را در بخش ثبت‌نام همراه با اطلاعات اختیاری اضافی مثل شناسه App Store و شناسه تیم و غیره وارد کنید. این کار برای درستی‌سنجی ایمن مخاطب اطلاعات اعتباری Game Center کاربر قبل‌از تکمیل ورود به سیستم الزامی است.
  2. ‫Game Center را به‌عنوان ارائه‌دهنده ورود به سیستم برای پروژه Firebase خود فعال کنید:
    1. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.
    2. در زبانه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم Game Center را فعال کنید.

ادغام کردن «ورود به سیستم Game Center» در بازی

ابتدا، اگر بازی شما از Game Center استفاده نمی‌کند، دستورالعمل‌های موجود در ادغام Game Center در بازی شما و احراز هویت بازیکن محلی در دستگاه در سایت توسعه‌دهندگان Apple را دنبال کنید.

مطمئن شوید شناسه دسته‌ای که به iTunes Connect ارائه می‌کنید با شناسه دسته‌ای که هنگام متصل کردن برنامه به پروژه Firebase استفاده کرده‌اید مطابقت داشته باشد.

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

Swift

let localPlayer = GKLocalPlayer.localPlayer()
localPlayer.authenticateHandler = { (gcAuthViewController?, error) in
  if let gcAuthViewController = gcAuthViewController {
    // Pause any activities that require user interaction, then present the
    // gcAuthViewController to the player.
  } else if localPlayer.isAuthenticated {
    // Player is signed in to Game Center. Get Firebase credentials from the
    // player's Game Center credentials (see below).
  } else {
    // Error
  }
}

Objective-C

__weak GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
localPlayer.authenticateHandler = ^(UIViewController *gcAuthViewController,
                                    NSError *error) {
  if (gcAuthViewController != nil) {
    // Pause any activities that require user interaction, then present the
    // gcAuthViewController to the player.
  } else if (localPlayer.isAuthenticated) {
    // Player is signed in to Game Center. Get Firebase credentials from the
    // player's Game Center credentials (see below).
  } else {
    // Error
  }
};

اصالت‌سنجی با Firebase

پس‌از اینکه متوجه شدید بازیکن محلی با Game Center به سیستم وارد شده است، با ایجاد شیء AuthCredential با GameCenterAuthProvider.getCredential() و انتقال آن شیء به signIn(with:)، بازیکن را به سیستم بازی خود وارد کنید:

Swift

// Get Firebase credentials from the player's Game Center credentials
GameCenterAuthProvider.getCredential() { (credential, error) in
  if let error = error {
    return
  }
  // The credential can be used to sign in, or re-auth, or link or unlink.
  Auth.auth().signIn(with:credential) { (user, error) in
    if let error = error {
      return
    }
    // Player is signed in!
  }

Objective-C

// Get Firebase credentials from the player's Game Center credentials
[FIRGameCenterAuthProvider getCredentialWithCompletion:^(FIRAuthCredential *credential,
                                                         NSError *error) {
  // The credential can be used to sign in, or re-auth, or link or unlink.
  if (error == nil) {
    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRUser *user, NSError *error) {
      // If error is nil, player is signed in.
    }];
  }
}];

مراحل بعدی

پس‌از اینکه کاربر برای اولین‌بار به سیستم وارد شد، حساب کاربری جدیدی ایجاد می‌شود و به شناسه Game Center او پیوند داده می‌شود. این حساب جدید به‌عنوان بخشی از پروژه Firebase شما ذخیره می‌شود و می‌توان از آن برای شناسایی کاربر در همه برنامه‌های پروژه استفاده کرد.

در بازی‌تان، می‌توانید UID کاربر Firebase را از شیء User دریافت کنید:

Swift

let user = Auth.auth().currentUser
if let user = user {
  let playerName = user.displayName

  // The user's ID, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server,
  // if you have one. Use getToken(with:) instead.
  let uid = user.uid
}

Objective-C

FIRUser *user = [FIRAuth auth].currentUser;
if (user) {
  NSString *playerName = user.displayName;

  // The user's ID, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server,
  // if you have one. Use getTokenWithCompletion:completion: instead.
  NSString *uid = user.uid;
}

در «قوانین امنیتی» Firebase Realtime Database و Cloud Storage، می‌توانید شناسه کاربر یکتای کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن‌ها دسترسی داشته باشد استفاده کنید.

برای دریافت اطلاعات بازیکن Game Center کاربر یا دسترسی به خدمات Game Center، از APIهای ارائه‌شده توسط Game Kit استفاده کنید.

برای خارج کردن کاربر از سیستم Firebase، با Auth.signOut() تماس بگیرید:

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print ("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}