Sign in with Google 계정 인증 (v1 호환)
- 구글 로그인 웹 인증 방식 입니다. google v1 방식 과 호환 가능 합니다.
- iOS, 안드로이드 통합 사용 가능 합니다.
- 플레이나누 SDK 5.0.0.6 이상 버전을 권장합니다. (브라우저 캐시 문제 해결)
- 최소 요구 버전: 5.0.0.3
호출 정보
Sign_in_with_Google(clientId)
호출 상세 정보
| 파라미터 | 설명 | 타입 |
|---|---|---|
| clientId | OAuth 웹 클라이언트 ID | String |
소스 코드
using System;
using System.Threading.Tasks;
using Google;
using PlayNANOO;
public class PlayNANOOExample : MonoBehaviour
{
Plugin plugin;
private string clientId = "웹클라이언트 ID를 입력합니다.";
void Start()
{
plugin = Plugin.GetInstance();
// Android: DeepLink 콜백 등록
Application.deepLinkActivated += OnDeepLink;
}
// Android용 DeepLink 콜백
private void OnDeepLink(string url)
{
string token = ExtractIdToken(url);
if (!string.IsNullOrEmpty(token))
{
SendTokenToServer(token);
}
else
{
Debug.LogError("[GoogleOAuth] No id_token found in deep link!");
}
}
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;
}
//인증 진행 메소드.
public void Sign_in_with_Google()
{
plugin.AccountManagerV20240401.SignInWithGoogle(clientId);
}
//인증 완료 시 토큰 받는 메소드.
private void SendTokenToServer(string token)
{
//toten 값으로 SocialChange 또는 SocialSignIn 진행.
//SocialChange(token, Configure.PN_ACCOUNT_GOOGLE);
// or
//SocialSignIn(token, Configure.PN_ACCOUNT_GOOGLE);
}
//계정 전환 예시. SocialChange
public void SocialChange(string token, string accountType)
{
//비회원 연동 - 회원 전환 참조.
plugin.AccountManagerV20240401.SocialChange(accessToken, accountType, (status, errorCode, jsonString, values) => {
}
}
//구글 계정 등록 예시. SocialSignIn
public void SocialSignIn(string token, string accountType)
{
plugin.AccountManagerV20240401.SocialSignIn(token, accountType, (status, errorCode, jsonString, values) =>
{
if (status == Configure.PN_API_STATE_SUCCESS)
{
Debug.Log(values["access_token"].ToString());
Debug.Log(values["refresh_token"].ToString());
Debug.Log(values["uuid"].ToString());
Debug.Log(values["openID"].ToString());
Debug.Log(values["nickname"].ToString());
Debug.Log(values["linkedID"].ToString());
Debug.Log(values["linkedType"].ToString());
Debug.Log(values["country"].ToString());
Debug.Log(values["purchaseCount"].ToString());
Debug.Log(values["purchaseTotalPrice"].ToString());
Debug.Log(values["purchaseCurrencyCode"].ToString());
Debug.Log(values["purchaseVoidedCount"].ToString());
Debug.Log(values["purchaseVoidedTotalPrice"].ToString());
Debug.Log(values["purchaseVoidedCurrencyCode"].ToString());
Debug.Log(values["country"].ToString());
Debug.Log(values["timezone"].ToString());
Debug.Log(values["offset"].ToString());
Debug.Log(values["joinPeriod"].ToString());
}
else
{
if (values != null)
{
if (values["ErrorCode"].ToString() == "30007")
{
Debug.Log(values["WithdrawalKey"].ToString());
}
else if (values["ErrorCode"].ToString() == "70002")
{
Debug.Log(values["BlockKey"].ToString());
}
else
{
Debug.Log("Fail");
}
}
else
{
Debug.Log("Fail");
}
}
});
}
}
호출 방법
Sign_in_with_Google() 를 호출 하면 웹 접속으로 로그인할 구글 계정 선택창이 뜹니다
계정 선택 후 인증이 완료 되면 자동으로 폰으로 이동 되고
SendTokenToServer(string token) 를 통해 token 값이 넘어 옵니다
해당 토큰 값으로 구글 계정 연동의 계정 등록(SocialSignIn) 또는 회원 전환(SocialChange) 를 진행 하시면 됩니다.
- 비회원 연동 후 구글 계정 전환 이면 회원 전환 진행
- 비회원 연동 없이 처음 부터 구글 로그인 진행 이면 계정 등록 진행
플랫폼별 콜백 처리
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;
}
통신 결과
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"Token" : {
"AccessToken" : "String",
"RefreshToken" : "String"
},
"Player" : {
"UserUniqueID" : "String",
"OpenID" : "String",
"Nickname" : "String",
"LinkedID" : "String",
"LinkedType" : "String",
"PurchaseCount" : "Integer",
"PurchaseTotalPrice" : "Double",
"PurchaseCurrencyCode" : "String",
"PurchaseVoidedCount" : "Integer",
"PurchaseVoidedTotalPrice" : "Double",
"PurchaseVoidedCurrencyCode" : "String",
"Country" : "String",
"Timezone" : "String",
"Offset" : "Integer",
"JoinPeriod" : "Integer"
}
}
통신 결과 상세 정보
| 데이터키 | 설명 | 타입 |
|---|---|---|
| Token.AccessToken | 플레이어 접속 토큰 | string |
| Token.RefreshToken | 플레이어 갱신 토큰 | string |
| Player.UserUniqueID | 플레이어 고유 식별 아이디 | string |
| Player.OpenID | 플레이어 고유 식별 오픈 아이디 | string |
| Player.Nickname | 플레이어 닉네임 | string |
| Player.LinkedID | 플레이어 연결 식별 아이디 | string |
| Player.LinkedType | 플레이어 연결 타입 | string |
| Player.PurchaseCount | 플레이어 결제 횟수 | integer |
| Player.PurchaseTotalPrice | 플레이어 결제 누적 금액 | double |
| Player.PurchaseCurrencyCode | 플레이어 결제 화폐 | string |
| Player.PurchaseVoidedCount | 플레이어 결제 환불 횟수 | integer |
| Player.PurchaseVoidedTotalPrice | 플레이어 결제 환불 누적 금액 | double |
| Player.PurchaseVoidedCurrencyCode | 플레이어 결제 환불 화폐 | string |
| Player.Country | 플레이어 국가 코드 | string |
| Player.Timezone | 플레이어 국가 타임존 | string |
| Player.Offset | 플레이어 타임존 시간차이 (UTC 기준) | integer |
| Player.JoinPeriod | 플레이어 가입 기간 | integer |
| WithdrawalKey | 탈퇴 계정 조회 키 | string |
에러 정보
플레이어 정보가 존재하지 않을 경우.
ErrorCode : 30000
ErrorMessage : NotFoundAccountException
플레이어 정보가 다른 디바이스에서 사용 중인 경우
ErrorCode : 30006
ErrorMessage : DuplicatedDeviceException
플레이어가 탈퇴를 신청한 경우 ErrorCode : 30007 ErrorMessage : WithDrawalException
Google 로그인 시 403 오류가 발생하는 경우 (Android) ErrorMessage : disallowed_useragent WebView(내장 브라우저)에서 Google OAuth가 차단되었습니다. Chrome 브라우저 설치 여부와 기본 브라우저 설정을 확인하세요. 자세한 내용은 환경 설정 - Android 403 오류 항목을 참고하세요.