Game Center를 사용하여 인증

Game Center를 사용하여 Firebase 기반으로 개발된 Apple 플랫폼 게임에 플레이어가 로그인하도록 할 수 있습니다. Game Center를 사용하여 Firebase에 로그인하려면 우선 로컬 플레이어가 Game Center에 로그인했는지 확인한 다음 GameCenterAuthProvider 객체를 사용하여 Firebase 사용자 인증 정보를 생성합니다. 이 인증 정보를 사용하여 Firebase에 인증할 수 있습니다.

시작하기 전에

Swift Package Manager를 사용해 Firebase 종속 항목을 설치하고 관리하세요.

  1. 앱 프로젝트를 연 상태로 Xcode에서 File(파일) > Add Packages(패키지 추가)로 이동합니다.
  2. 메시지가 표시되면 Firebase Apple 플랫폼 SDK 저장소를 추가합니다.
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Firebase 인증 라이브러리를 선택합니다.
  5. 완료되면 Xcode가 백그라운드에서 자동으로 종속 항목을 확인하고 다운로드하기 시작합니다.

그런 다음 몇 가지 구성 단계를 따릅니다.

  1. Firebase로 Apple 앱을 등록해야 합니다. 즉, 앱의 번들 ID를 App Store ID 및 팀 ID 등과 같은 선택적인 추가 정보와 함께 등록 섹션에 입력합니다. 이 정보는 로그인을 완료하기 전에 Game Center 사용자 인증 정보의 잠재고객을 안전하게 확인하는 데 필요합니다.
  2. Game Center를 Firebase 프로젝트의 로그인 제공업체로 사용 설정합니다.
    1. Firebase Console에서 인증 섹션을 엽니다.
    2. 로그인 방법 탭에서 Game Center 로그인 제공업체를 사용 설정합니다.

게임에 Game Center 로그인 통합

먼저, 게임에서 아직 Game Center를 사용하지 않는다면 Apple 개발자 사이트의 Incorporating Game Center into Your Game(Game Center를 게임에 통합)Authenticating a Local Player on the Device(기기에서 로컬 플레이어 인증) 안내를 따르세요.

iTunes Connect에 제공하는 번들 ID가 Firebase 프로젝트에 앱을 연결할 때 사용한 번들 ID와 일치하는지 확인합니다.

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로 로그인했음을 확인한 후 GameCenterAuthProvider.getCredential()AuthCredential 객체를 만들고 이 객체를 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 ID에 연결됩니다. 이 신규 계정은 Firebase 프로젝트에 저장되며 프로젝트의 모든 앱에서 사용자 본인 확인에 사용할 수 있습니다.

게임에서 User 객체로부터 사용자의 Firebase UID를 가져올 수 있습니다.

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 실시간 데이터베이스와 Cloud Storage 보안 규칙의 auth 변수에서 로그인한 사용자의 고유 사용자 ID를 가져온 후 이 ID를 사용해 사용자가 액세스할 수 있는 데이터를 관리할 수 있습니다.

사용자의 Game Center 플레이어 정보를 가져오거나 Game Center 서비스에 액세스하려면 Game Kit에서 제공하는 API를 사용하세요.

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