콘솔로 이동

Android에서 Google Play 게임 서비스를 사용하여 인증하기

Google Play 게임 서비스를 사용하여 Firebase를 기반으로 개발된 Android 게임에 플레이어가 로그인하도록 할 수 있습니다. Firebase를 통해 Google Play 게임 서비스 로그인을 사용하려면 우선 Google Play 게임에 플레이어를 로그인 처리하면서 OAuth 2.0 인증 코드를 요청합니다. 그런 다음 PlayGamesAuthProvider에 인증 코드를 전달하여 Firebase 사용자 인증 정보를 생성합니다. 이 인증 정보를 사용하여 Firebase에 인증할 수 있습니다.

시작하기 전에

Android 프로젝트 설정

  1. 아직 추가하지 않았다면 Android 프로젝트에 Firebase를 추가합니다.
  2. 다음과 같이 모듈(앱 수준) Gradle 파일(일반적으로 app/build.gradle)에 Firebase 인증 Android 라이브러리 및 Google Play 서비스 종속 항목을 추가합니다.

    implementation 'com.google.firebase:firebase-auth:16.2.1'
    implementation 'com.google.android.gms:play-services-auth:16.0.1'
    

Firebase 프로젝트 설정

  1. Firebase 콘솔의 설정 페이지에서 게임의 SHA-1 지문을 설정합니다.

    keytool 명령어로 키의 SHA-1 지문을 가져올 수 있습니다.

    keytool -exportcert -list -v \
        -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTORE

  2. Google Play 게임을 로그인 제공업체로 사용 설정합니다.

    1. 프로젝트의 웹 서버 클라이언트 ID와 클라이언트 보안 비밀을 찾습니다. 웹 서버 클라이언트 ID는 Google Play 인증 서버에 대해 Firebase 프로젝트를 식별합니다.

      이 값을 확인하는 방법은 다음과 같습니다.

      1. Google API 콘솔 사용자 인증 정보 페이지에서 Firebase 프로젝트를 엽니다.
      2. OAuth 2.0 클라이언트 ID 섹션에서 웹 클라이언트(Google 서비스에서 자동 생성) 세부정보 페이지를 엽니다. 이 페이지에 웹 서버 클라이언트 ID와 보안 비밀이 표시됩니다.
    2. Firebase Console에서 인증 섹션을 엽니다.

    3. 로그인 방법 탭에서 Play 게임 로그인 제공업체를 사용 설정합니다. API 콘솔에서 가져온 프로젝트의 웹 서버 클라이언트 ID와 클라이언트 보안 비밀을 지정해야 합니다.

  1. Google Play Console을 열고 게임 서비스를 클릭합니다.
  2. 새 게임 추가를 클릭합니다. 새 게임 대화상자에서 게임에서 이미 Google API를 사용하고 있습니다를 클릭하고 목록에서 Firebase 프로젝트의 이름을 클릭합니다. 게임 카테고리를 선택한 다음 계속을 클릭하여 게임 세부정보 페이지로 이동합니다.
  3. 게임 세부정보 페이지의 끝에서 모든 필수 API가 사용 설정되어 있는지 확인합니다.
  4. 그런 다음 연결된 앱 페이지를 열고 Android를 클릭합니다. 게임의 패키지 이름을 지정하고 저장 후 계속을 클릭합니다. 콘솔에 Android 클라이언트 ID가 표시됩니다. 이 값은 무시해도 됩니다.
  5. Play 스토어에 게임을 출시하기 전에 테스트 페이지에서 게임에 로그인해야 하는 사용자의 이메일 주소를 허용 목록에 추가합니다.

게임에 Play 게임 로그인 통합

먼저 앱에 Play 게임 로그인을 통합합니다. 자세한 안내는 Android 게임에 로그인을 참조하세요.

통합 코드에서 GoogleSignInOptions 객체를 작성할 때 DEFAULT_GAMES_SIGN_IN 구성을 사용하고 requestServerAuthCode를 호출합니다.

자바
Android

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
        .requestServerAuthCode(getString(R.string.default_web_client_id))
        .build();

Kotlin
Android

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
        .requestServerAuthCode(getString(R.string.default_web_client_id))
        .build()

requestServerAuthCode 메소드에 웹 서버 클라이언트 ID를 전달해야 합니다. 이 ID는 Firebase 콘솔에서 Play 게임 로그인을 사용 설정할 때 제공한 ID입니다.

Firebase로 인증하기

앱에 Play 게임 로그인을 추가한 후에는 플레이어가 Play 게임으로 로그인할 때 확인되는 Google 계정 사용자 인증 정보를 사용하도록 Firebase를 설정해야 합니다.

  1. 우선 로그인 활동의 onCreate 메소드에서 FirebaseAuth 객체의 공유 인스턴스를 가져옵니다.

자바
Android

private FirebaseAuth mAuth;// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();

Kotlin
Android

private lateinit var auth: FirebaseAuth// ...
// Initialize Firebase Auth
auth = FirebaseAuth.getInstance()
  1. 활동을 초기화할 때 플레이어가 이미 Firebase로 로그인했는지 확인합니다.

자바
Android

@Override
public void onStart() {
    super.onStart();
    // Check if user is signed in (non-null) and update UI accordingly.
    FirebaseUser currentUser = mAuth.getCurrentUser();
    updateUI(currentUser);
}

Kotlin
Android

public override fun onStart() {
    super.onStart()
    // Check if user is signed in (non-null) and update UI accordingly.
    val currentUser = auth.currentUser
    updateUI(currentUser)
}
If the player isn't signed in, present the player with your game's
signed-out experience, including the option to sign in.
  1. 플레이어가 자동 또는 수동으로 Play 게임에 로그인한 후 GoogleSignInAccount 객체에서 인증 코드를 가져와서 Firebase 사용자 인증 정보로 교환하고 이 인증 정보로 Firebase에 인증합니다.

자바
Android

// Call this both in the silent sign-in task's OnCompleteListener and in the
// Activity's onActivityResult handler.
private void firebaseAuthWithPlayGames(GoogleSignInAccount acct) {
    Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.getId());

    final FirebaseAuth auth = FirebaseAuth.getInstance();
    AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());
    auth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");
                        FirebaseUser user = auth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }

                    // ...
                }
            });
}

Kotlin
Android

// Call this both in the silent sign-in task's OnCompleteListener and in the
// Activity's onActivityResult handler.
private fun firebaseAuthWithPlayGames(acct: GoogleSignInAccount) {
    Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.id!!)

    val auth = FirebaseAuth.getInstance()
    val credential = PlayGamesAuthProvider.getCredential(acct.serverAuthCode!!)
    auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success")
                    val user = auth.currentUser
                    updateUI(user)
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    Toast.makeText(baseContext, "Authentication failed.",
                            Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }

                // ...
            }
}

signInWithCredential에 대한 호출이 성공하면 getCurrentUser 메소드로 사용자의 계정 데이터를 가져올 수 있습니다.

다음 단계

사용자가 처음으로 로그인하면 신규 사용자 계정이 생성되어 사용자의 Play 게임 ID에 연결됩니다. 이 신규 계정은 Firebase 프로젝트의 일부로서 저장되며 프로젝트의 모든 앱에서 사용자 본인 확인에 사용할 수 있습니다.

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

자바
Android

FirebaseUser user = mAuth.getCurrentUser();
String playerName = user.getDisplayName();

// 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 FirebaseUser.getIdToken() instead.
String uid = user.getUid();

Kotlin
Android

val user = auth.currentUser
user?.let {
    val 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 FirebaseUser.getIdToken() instead.
    val uid = user.uid
}

Firebase 실시간 데이터베이스 및 Cloud Storage 보안 규칙에서 auth 변수로부터 로그인한 사용자의 고유 사용자 ID를 가져온 후 이 ID를 통해 사용자의 데이터 액세스를 관리할 수 있습니다.

사용자의 Play 게임 플레이어 정보를 가져오거나 Play 게임 서비스에 액세스하려면 Google Play Games SDK에서 제공하는 API를 사용하세요.

사용자를 로그아웃시키려면 FirebaseAuth.signOut()을 호출합니다.

자바
Android

FirebaseAuth.getInstance().signOut();

Kotlin
Android

FirebaseAuth.getInstance().signOut()