본문 바로가기
게임/Unity

[Unity 이론] Google + Firebase 로그인

by 신인용 2020. 2. 27.
반응형

Google + Firebase 로그인

 

 

 

 

Firebase에서 Google 회원가입 및 로그인을 하는 방법을 알아보겠습니다.

Google Play Services와 Firebase를 연동시킨다고 생각하면 되겠습니다.

 

 

이번 글에서 할 것은

 

1. GooglePlayGamesPlugin 패키지 Import하기

 => GooglePlayGames의 Services를 이용할 수 있습니다.

2. Unity에서 keystore 생성하고, SHA-1 인증서 지문 얻기

 => Firebase같은 API제공업체에선 SHA-1 인증서 지문을 요청하고, 앱을 제공업체에 등록할 때 사용합니다.

3. Google Play Console에서 게임 등록하고, 게임 서비스 추가하고, OAuth 클라이언트 ID 얻기

 => Google Play Games의 Services를 이용합니다.

 

여기까지는 Google Login만 진행. (Google Play Games만 이용)

---------------------------------------------------------------

여기서부터 Firebase 연동 시작.

 

4. Firebase Unity SDK 에서 FirebaseAuth 패키지 Import하기

 => Firebase의 인증기능을 이용할 수 있습니다.

5. Firebase 프로젝트를 생성하고, json파일을 가져오기

 => json파일에는 Firebase 프로젝트에 대한 정보가 담겨 있습니다.

6. 회원가입 및 로그인 소스코드 작성

 

 

 

 

 

 

 

 

 

 

 

참고로 Build Settings에서 Platform은 Android 상태여야 하고,

저의 유니티 패키지명은 com.unityfirebase.lab 입니다.

 

 

 

 

 

 

 

1. GooglePlayGamesPlugin 패키지 Import하기

 

Github에서 GooglePlayGamesPlugin 패키지를 다운받습니다.

https://github.com/playgameservices/play-games-plugin-for-unity

 

 

 

위 패키지를 Unity로 Import해줍니다.

 

 

 

 

 

 

 

2. Unity에서 keystore 생성하고, SHA-1 인증서 지문 추출하기

 

참고) keystore에 대한 자세한 설명

https://developer.android.com/studio/publish/app-signing?hl=ko#certificates-keystores

 

 

 

 

File - Build Setrrings - Player Settings - Player - Publishing Settings - Keystore Manager ... 에서 keystore를 생성합니다.

 

1. keystore

Keystore...: keystore의 생성, 위치지정 등을 할 수 있습니다.

Password: 키 저장소에 사용할 보안 암호를 생성하고 확인합니다.

Confirm password: 암호 확인.

 

2. key

Alias: 키를 식별할 수 있는 이름을 입력합니다. (저는 fireauth 입니다.)

Password: 키에 사용할 보안 암호를 생성하고 확인합니다.

Confirm password: 암호 확인.

Validity (years): 키가 유효하게 유지되는 기간(년)을 설정합니다. 키가 최소 25년 동안 유효하게 유지되어야 앱 수명 동안 같은 키로 앱 업데이트에 서명할 수 있습니다. 보통 50년 정도면 적당합니다.

Certificate(나머지 아래 부분): 인증서에 사용할 본인 관련 정보를 입력합니다. 이 정보는 앱에 표시되지 않지만 Apk의 일부로 인증서에 포함됩니다. 이 부분은 생략가능합니다.

 

 

 

 

 

keystore를 만든 후,

cmd 창에서 keystore가 있는 폴더 경로로 이동 후,

keytool -list -v -keystore [keystore이름]

을 입력하면 SHA-1 인증서 지문을 얻을 수 있습니다.

Firebase나 GooglePlayGames같은 API제공업체에선 SHA-1 인증서 지문을 요청하고, 앱을 제공업체에 등록할 때 사용합니다.

이 인증서 지문은 Firebase나 API 콘솔 등 여러 곳에 이용될 것입니다.

 

 

 

 

 

 

 

 

 

3. Google Play Console에서 게임 등록하고, 게임 서비스 추가하고, OAuth Client ID 얻기

 

참고) OAuth란?

Open Authorization, Open Authentication

OAuth 인증은 API를 제공하는 서버에서 진행하고, 유저가 인증되었다는 Access Token을 발급합니다. 이 Token으로 앱은 API 서비스를 안전하고 쉽게 사용할 수 있습니다.

보안 Up! 효율 Up!

 

 

 

3.1 게임 등록 및 앱서명, 업로드 인증서 지문 얻기

 

Google Play Console에서 모든 애플리케이션에서 애플리케이션을 만들어줍니다.

 

 

 

앱 버전 - 비공개 트랙에서 관리로 들어갑니다.

 

 

 

맨 위에는 앱 파일인 aab 또는 apk 파일을 넣어주고,

출시명은 0.1로 해주고(업데이트 시 올려줌).

이번 버전의 새로운 업데이트 사항을 적어주는 곳입니다.

그리고 저장...!

 

 

 

 

 

앱 버전을 완료하고, 앱 서명에 가보면 "앱 서명 인증서"와 "업로드 인증서"가 있습니다.

간단하게 설명하자면 이렇습니다.

앱 서명 인증서: 앱을 정식 출시하면 사용

업로드 인증서: 앱이 테스트 단계일 때 사용

 

 

 

지금은 테스트 단계이니, 업로드 인증서의 SHA-1 인증서 지문을 가지고 놀면 됩니다.

이 업로드 인증서의 지문은 앞서 Unity에서 생성했던 keystore 인증서의 지문과 동일합니다.

 

 

 

 

 

 

 

  바로 Firebase 와 연동하고 싶다면 여기서 4번으로 넘어갑니다.

 

 

3.2 게임 서비스 추가 및 앱 OAuth 클라이언트 ID 얻기

 

 

게임 서비스에서 새 게임 추가를 눌러줍니다.

 

 

만약 https://console.developers.google.com/ 개발자 콘솔에서 내 앱이 API를 이용하고 있다면 이미 사용하고 있습니다를 해주시면 됩니다. ( 예를 들어 이미 파이어베이스를 이 앱에 이용하고 있다던가 )

 

 

 

연결된 앱 - Android 앱을 연결시켜 줍니다.

 

 

 

패키지 이름을 입력합니다.

 

 

 

지금 앱 승인을 클릭하면 서명 인증서 지문(SHA-1)을 입력하는 칸이 나옵니다.

이전에 keystore에서부터 얻은 SHA-1 인증서 지문을 입력하거나,

앱 서명 페이지에 업로드 인증서 SHA-1 인증서 지문을 입력해도 됩니다. 똑같은 값입니다.

 

 

 

그러면 앱에 대한 OAuth2 클라이언트 ID를 얻을 수 있습니다.

 

 

 

 

 

 

3.3 API 콘솔 설정하기 (웹 OAuth 클라이언트 ID 만들기)

 

게임 서비스로 돌아와, 게임 세부정보 페이지 아래에 보면 

"API 콘솔 프로젝트"가 있습니다.

여기서 파란 글씨를 클릭해주면 API 콘솔창으로 넘어가게 됩니다.

 

 

 

 

 

 

API 콘솔창에서, 사용자 인증 정보 - 사용자 인증 정보 만들기 - OAuth 클라이언트 ID를 선택합니다.

 

 

 

 

3-2에서 안드로이드 앱에 대한 클라이언트 ID는 만들었으니, 웹 클라이언트 ID를 만들겠습니다.

웹 애플리케이션을 선택하고 생성을 클릭합니다.

 

 

 

 

이제 웹 클라이언트, 앱 클라이언트가 만들어졌습니다.

그리고 유니티에 적용하기 위해 웹 클라이언트 ID를 복사해서...

(웹 클라이언트 ID를 가져가는 이유는 Token을 가져다 주는 건 웹 상에서 이루어지기 때문입니다.)

 

 

 

 

Window - Google Play Games - Setup - Android Setup... 에 들어오면 위와 같은 창이 뜨는데

Client ID에 입력해줍니다.

 

 

 

 

그리고 Android Resources를 입력해줘야하는데 (위 사진의 큰 빈칸) 이것은 이벤트, 업적, 리더보드 중에서 리소스를 받아와야 하기 때문에 셋 중 아무거나 생성해줍니다.

저는 리더보드를 생성하겠습니다.

 

 

 

 

이름 적고 저장합니다.

 

 

 

리소스 받기를 클릭한 후,

 

 

빨간 네모 박스 영역을 복사하고,

 

 

 

붙여넣기 해줍니다. 그리고 Setup ~

 

 

 

 

성공했다는 팝업이 뜨면 완료입니다!

 

 

 

 

 

3.4 Google Login 소스코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
 
public class FirebaseGoogleAuth : MonoBehaviour
{
    public Text email;
 
    void Start()
    {
        PlayGamesPlatform.InitializeInstance(
new PlayGamesClientConfiguration.Builder().Build());
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
// Google Play Games 활성화
    }
 
 
    public void TryGoogleLogin()
    {
        if (!Social.localUser.authenticated) // 로그인 되어 있지 않다면
        {
            Social.localUser.Authenticate(success => // 로그인 시도
            {
                if (success) // 성공하면
                {
                    email.text = Social.localUser.userName; 
                }
                else // 실패하면
                {
                    email.text = "Fail...";
                }
            });
        }
    }
 
 
    public void TryGoogleLogout()
    {
        if (Social.localUser.authenticated) // 로그인 되어 있다면
        {
            PlayGamesPlatform.Instance.SignOut(); // 로그아웃
            email.text = "Logout";
        }
    }
}
 
cs

 

 

TryGoogleLogin
TryGoogleLogout

 

 

 

 

 

 

 

여기까지 Google Login을 마쳤고,

=======================================

 

이제부터 Firebase와 연동시키겠습니다.

 

 

 

 

시작하기 전에,

삭제 할 것이 두가지 있는데,

구글 플레이 콘솔에 만들어 두었던 게임 서비스를 삭제해줍니다.

API 콘솔창에 있던 Inyong World 프로젝트를 삭제해줍니다.

(Firebase와 연동하려면 이것저것 설정하는 것이 다르기 때문에, 처음부터 다시 시작할 것입니다.)

 

 

 

 

 

 

 

4. Firebase Unity SDK 에서 FirebaseAuth 패키지 Import하기

 

이 곳에서 Firebase Unity SDK를 다운받습니다.

https://firebase.google.com/docs/unity/setup?hl=ko

 

 

 

 

 

SDK 파일을 다운 받으면, 여러 개의 패키지가 존재하는데

이 중에서 FirebaseAuth 패키지를 Unity로 Import합니다.

 

 

 

 

 

 

 

5. Firebase 프로젝트를 생성하고, json파일을 가져오기

 

Firebase에서 프로젝트를 추가합니다.

 

 

 

 

Android 앱을 추가합니다.

 

 

 

 

 

앱의 패키지 이름을 입력해주고,

앱 닉네임 입력해주고,

세 번째 디버그 서명 인증서 SHA-1엔 업로드 인증서의 SHA-1을 입력해줍니다.

 

 

 

 

여기서 json 파일을 다운받을 순 있지만, 아직 Google Login에 대한 정보가 들어있지 않아 다음 단계에서 다운받습니다.

 

 

 

 

3단계는 안드로이드 개발자에게 필요한 것이라, 저는 건너뛰겠습니다.

4단계도 건너뜁니다.

 

 

 

 

 

 

만든 Firebase 프로젝트에서, Authentication - 로그인 방법에 들어가면, Google 로그인이 비활성화 되어있습니다.

 

 

 

 

 

 

웹 SDK를 펼치면

웹 클라이언트 ID와 보안 비밀번호가 나오는데, 이것은 API 콘솔 창에서 확인가능합니다.

 

 

 

 

 

Firebase API 창에서 웹 클라이언트를 클릭합니다.

 

그러면 ID와 비밀번호를 확인할 수 있습니다.

 

 

 

 

이제 구글 로그인이 활성화 되었습니다.

 

 

 

 

 

 

 

 

 

구글 플레이 콘솔로 돌아옵니다.

 

게임 서비스를 추가하는데, 이번엔 Firebase API가 만들어져 있기 때문에

게임에서 이미 Google API를 사용하고 있습니다. 를 선택하고

Firebase API 프로젝트인 Inyong World를 선택해줍니다.

 

 

 

 

 

 

 

그리고 이전과 동일하게,

연결된 앱 - Android - 패키지 이름 입력 -> 클라이언트 ID에 연결!

 

 

 

 

 

이제 웹에 연결시키겠습니다!

 

다른 앱 연결에서 웹을 추가합니다.

 

 

 

실행 URL에 파이어베이스 URL을 입력해줘야 하는데

이 URL은 파이어베이스에서 가져옵니다.

 

 

 

 

 

Firebase - Authentication - 로그인 방법 - 승인된 도메인에서 확인할 수 있습니다.

 

 

 

 

 

 

선택을 하면 완료입니다.

 

 

 

이제 웹도 연결되었습니다.

 

 

 

 

 

 

 

 

 

리더보드 아무거나 하나 생성 - 리소스 받기!

 

 

 

API 콘솔 창에서 웹 클라이언트 ID 받기!

 

 

 

Window - Google Play Games - Setup - Android Setup... 에

리소스 입력!

Client ID 입력!

그리고 SetUp!

 

완료 창 두개 뜨면 완료~

 

 

 

 

 

 

 

그리고 파이어베이스에서 Json 파일을 다운 받아줍니다.

프로젝트 설정 - google-services.json을 다운받고

Assets - Plugins - Android - Firebase 폴더에 넣어줍니다.

 

 

 

 

 

 

 

5.1 소스코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using Firebase.Auth;
 
public class FirebaseGoogleAuth : MonoBehaviour
{
    private FirebaseAuth auth;
 
    void Start()
    {
        PlayGamesPlatform.InitializeInstance(new PlayGamesClientConfiguration.Builder()
            .RequestIdToken()
            .RequestEmail()
            .Build());
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
        // 구글 플레이 게임 활성화
 
        auth = FirebaseAuth.DefaultInstance; // Firebase 액세스
    }
 
 
    public void TryGoogleLogin()
    {
        if (!Social.localUser.authenticated) // 로그인 되어 있지 않다면
        {
            Social.localUser.Authenticate(success => // 로그인 시도
            {
                if (success) // 성공하면
                {
                    Debug.Log("Success");
                    StartCoroutine(TryFirebaseLogin()); // Firebase Login 시도
                }
                else // 실패하면
                {
                    Debug.Log("Fail");
                }
            });
        }
    }
 
 
    public void TryGoogleLogout()
    {
        if (Social.localUser.authenticated) // 로그인 되어 있다면
        {
            PlayGamesPlatform.Instance.SignOut(); // Google 로그아웃
            auth.SignOut(); // Firebase 로그아웃
        }
    }
 
 
    IEnumerator TryFirebaseLogin()
    {
        while (string.IsNullOrEmpty(((PlayGamesLocalUser)Social.localUser).GetIdToken()))
            yield return null;
        string idToken = ((PlayGamesLocalUser)Social.localUser).GetIdToken();
 
 
        Credential credential = GoogleAuthProvider.GetCredential(idToken, null);
        auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
            if (task.IsCanceled)
            {
                Debug.LogError("SignInWithCredentialAsync was canceled.");
                return;
            }
            if (task.IsFaulted)
            {
                Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
                return;
            }
 
            Debug.Log("Success!");
        });
    }
}
 
cs

 

파이어베이스에 계정이 등록되는 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

반응형

댓글