Sign in with Google
OAuth 2.0 기반의 구글 로그인 웹 인증 방식입니다. iOS, 안드로이드 통합 사용 가능합니다.
동작 방식
Android:
- 외부 브라우저(또는 Chrome Custom Tabs)에서 구글 계정 선택
- Deep Link로 id_token 수신
- 토큰으로 계정 등록(SocialSignIn) 또는 회원 전환(SocialChange) API 호출
iOS:
- ASWebAuthenticationSession으로 앱 내 인증 세션 표시
OnGoogleAuthCallback메소드로 id_token 수신- 토큰으로 계정 등록(SocialSignIn) 또는 회원 전환(SocialChange) API 호출
Unity 구현
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class GoogleSignin : MonoBehaviour
{
private string HOST_PLAYNANOO_OAUTH2REDIRECT = "https://www.playnanoo.com/oauth2redirect.html";
private string OAUTH2REDIRECT_SCOPE = "openid email profile";
private string clientId = "Your Google Client Id";
void Start()
{
Application.deepLinkActivated += OnDeepLink;
}
private void OnDeepLink(string url)
{
string token = ExtractIdToken(url);
if (!string.IsNullOrEmpty(token))
{
SendTokenToServer(token);
}
}
private string ExtractIdToken(string url)
{
// query parameter(?) 또는 fragment(#)에서 id_token 추출
string paramString = null;
if (url.Contains("?"))
{
paramString = url.Split('?')[1];
}
else if (url.Contains("#"))
{
paramString = url.Split('#')[1];
}
if (string.IsNullOrEmpty(paramString)) return null;
string[] parts = paramString.Split('&');
foreach (var p in parts)
{
if (p.StartsWith("id_token="))
return p.Substring("id_token=".Length);
}
return null;
}
public void Sign_in_with_Google()
{
string nonce = Guid.NewGuid().ToString("N");
string authUrl = "https://accounts.google.com/o/oauth2/v2/auth"
+ "?client_id=" + clientId
+ "&redirect_uri=" + HOST_PLAYNANOO_OAUTH2REDIRECT
+ "&response_type=id_token"
+ "&scope=" + Uri.EscapeDataString(OAUTH2REDIRECT_SCOPE)
+ "&nonce=" + nonce
+ "&prompt=select_account"
+ "&login_hint="; // 빈 값으로 자동 로그인 방지
// 외부 브라우저에서 열기 (403 disallowed_useragent 방지)
OpenURLInExternalBrowser(authUrl);
}
private void OpenURLInExternalBrowser(string url)
{
if (Application.platform == RuntimePlatform.Android)
{
try
{
using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
using (AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", "android.intent.action.VIEW"))
using (AndroidJavaClass uri = new AndroidJavaClass("android.net.Uri"))
{
intent.Call<AndroidJavaObject>("setData", uri.CallStatic<AndroidJavaObject>("parse", url));
intent.Call<AndroidJavaObject>("addFlags", 0x10000000); // FLAG_ACTIVITY_NEW_TASK
intent.Call<AndroidJavaObject>("addCategory", "android.intent.category.BROWSABLE");
try
{
intent.Call<AndroidJavaObject>("setPackage", "com.android.chrome");
currentActivity.Call("startActivity", intent);
}
catch
{
intent.Call<AndroidJavaObject>("setPackage", null);
currentActivity.Call("startActivity", intent);
}
}
}
catch
{
Application.OpenURL(url);
}
}
else
{
Application.OpenURL(url);
}
}
//인증 완료 시 토큰 받는 메소드.
private void SendTokenToServer(string token)
{
//toten 값으로 SocialChange 또는 SocialSignIn 진행.
//SocialChange(token, PN_ACCOUNT_GOOGLE);
// or
//SocialSignIn(token, PN_ACCOUNT_GOOGLE);
}
//계정 전환 예시. SocialChange
public void SocialChange(string token, string accountType)
{
}
public void SocialSignIn(string token, string accountType)
{
}
}
OAuth 2.0 파라미터
| 파라미터 | 값 | 설명 |
|---|---|---|
| client_id | Google Cloud Console에서 발급 | OAuth 웹 클라이언트 ID |
| redirect_uri | https://www.playnanoo.com/oauth2redirect.html | 인증 후 리다이렉트 URL |
| response_type | id_token | OpenID Connect ID 토큰 요청 |
| scope | openid email profile | 요청할 사용자 정보 범위 |
| nonce | Guid.NewGuid() | 재생 공격 방지용 랜덤 문자열 |
| prompt | select_account | 계정 선택 강제 표시 |
환경 설정 필수
Sign in with Google을 사용하기 전에 구글 환경 설정 문서를 참조하여 다음 설정을 완료해야 합니다:
- Google Cloud Console에서 OAuth 2.0 클라이언트 ID 발급
- Android/iOS Deep Link 설정
- 리다이렉트 URI 등록
사용 방법
1. 구글 로그인 시작
Sign_in_with_Google();
외부 브라우저가 열리고 사용자가 구글 계정을 선택합니다.
2. 토큰으로 계정 연동
인증 완료 후 SendTokenToServer 메소드에서 받은 id_token으로 PlayNANOO API를 호출합니다:
신규 로그인 (SocialSignIn)
public void SocialSignIn(string token, string accountType)
{
// 구글 계정으로 처음 로그인
//accountType : PN_ACCOUNT_GOOGLE
}
회원 전환 (SocialChange)
public void SocialChange(string token, string accountType)
{
// 비회원에서 구글 회원으로 전환
//accountType : PN_ACCOUNT_GOOGLE
}
참조
- 계정 타입 값:
PN_ACCOUNT_GOOGLE = "GOOGLE"- 자세한 정보는 기타 > 계정 타입 정보 참조 - 회원 전환: 비회원 연동 > 회원 전환 문서 참조
플랫폼별 콜백 처리
Android
- DeepLink 방식으로 콜백을 받습니다.
Application.deepLinkActivated이벤트에 콜백 메소드를 등록합니다.- Chrome Custom Tabs 라이브러리가 포함된 경우 앱 내 오버레이 형태로 브라우저가 열립니다.
- 라이브러리가 없으면 외부 Chrome 브라우저로 열리며, 인증 완료 후 딥링크로 앱 복귀합니다.
iOS
- ASWebAuthenticationSession을 사용하여 앱 내에서 인증 세션이 열립니다.
SetGoogleAuthCallback으로 콜백을 등록하면 인증 완료 시 호출됩니다.
void Start()
{
Plugin plugin = Plugin.GetInstance();
// iOS Google OAuth 콜백 등록
plugin.SetGoogleAuthCallback((result) =>
{
if (result.StartsWith("error:"))
{
Debug.LogError("[GoogleOAuth] iOS Auth Error: " + result);
return;
}
// result는 콜백 URL 전체 (예: {game_id}://#id_token=xxx&...)
// ※ mygame:// scheme은 deprecated 되었습니다. PlayNANOO 콘솔에 등록된 Game ID를 scheme으로 사용합니다.
string token = ExtractIdToken(result);
if (!string.IsNullOrEmpty(token))
{
// 토큰으로 SocialSignIn 또는 SocialChange 호출
}
});
}
private string ExtractIdToken(string url)
{
if (!url.Contains("#")) return null;
string fragment = url.Split('#')[1];
string[] parts = fragment.Split('&');
foreach (var p in parts)
{
if (p.StartsWith("id_token="))
return p.Substring("id_token=".Length);
}
return null;
}