Skip to content
스토브
마지막 업데이트

실제 적용 흐름이 궁금하신가요?

이용 시나리오 / 로그인하기

로그인(이용자 흐름)

이해하기


스토브 로그인은 이용자가 스토브 계정으로 게임이나 웹 서비스에 진입하는 표준 절차예요. 이메일·게스트·3rd party(Google, Facebook, Apple 등) 등 다양한 인증 수단을 지원해요. 출시 플랫폼(Mobile/PC/Web)에 따라 SDK 통합 UI를 쓰거나, 게임에서 직접 UI를 구성하는 방식으로 연동할 수 있어요.

로그인 동선

게임이 출시되는 플랫폼에 따라 로그인 동선과 사용하는 도구가 달라요. 자사 게임의 출시 형태에 맞춰 필요한 영역만 연동하면 돼요.

플랫폼 연동 도구 로그인 UI 구성 방식 대표 진입 시나리오
Mobile Mobile SDK 통합 UI(AuthUI) / 직접 구성(Auth DATA API) 앱 실행 → 계정 로그인 → 게임 진입
PC PC SDK + 스토브 PC 클라이언트 런처 로그인 정보를 SDK가 자동 수신 런처 로그인 후 게임 실행 → 자동 로그인
Web 스토브 Web 인증 (GNB / 로그인 URL) 반응형 GNB UI 또는 스토브 로그인 페이지 공식 홈페이지·이벤트 페이지에서 계정 로그인

플랫폼 연동 시 참고
ㆍ 멀티 플랫폼 게임은 Mobile + PC + Web 등 필요한 플랫폼을 함께 연동해요.
ㆍ 플랫폼이 달라도 스토브 회원 식별자는 동일하게 유지되므로, 계정이 끊김 없이 이어져요.

로그인 흐름

기존 회원은 로그인하고, 신규 이용자는 회원가입 또는 게스트로 게임에 진입해요.
플랫폼(Mobile/PC/Web)과 무관하게 로그인 과정은 아래 3단계로 정리할 수 있어요.

단계 작업 설명
1 SDK 또는 웹 모듈 초기화 스토브 서비스 사용을 위한 초기 정보 획득
2 로그인 수행 계정으로 로그인하고 User Access Token 발급. 필요 시 약관 동의 처리
3 게임 진입 준비 서버·월드 선택 후 캐릭터 정보 저장. 쿠폰·팝업·빌링·푸시 등에서 식별에 사용

로그인 방식

STOVE SDK는 두 가지 로그인 방식을 지원해요. Mobile SDK 기준 표현이지만, 동일한 개념을 플랫폼별로 적용해요.

방식 설명
통합 로그인 UI (Auth.UI) 통합 UI로 인증을 손쉽게 구현. 인증 수단 추가·제외가 자유로움
직접 로그인 구현 (DATA API) DATA API로 원하는 인증을 직접 구현. Provider별 로그인으로 토큰 획득

방식 선택 기준
ㆍ 빠른 출시·표준 UI 사용이 우선이면 통합 로그인 UI를 권장해요.
ㆍ 게임 고유 UI/UX가 필요하면 직접 로그인(DATA API) 방식을 선택해요.

Provider 타입

Provider는 인증 채널이에요. 게임이 노출할 채널을 선택해 등록해요. (Mobile SDK 기준)

Provider Android iOS Unity Unreal
Email (스토브) O O O O
Guest O O O O
Google O O O O
Facebook O O O O
Apple O O O O
Steam O O
LINE O O O O
Naver O O O O
Twitter O O O O

PC·Web 채널 참고
ㆍ PC는 스토브 PC 클라이언트의 로그인 채널을, Web은 스토브 로그인 페이지의 채널을 사용해요.
ㆍ PC·Web 채널은 플랫폼 정책에 따라 달라질 수 있으니 담당 기술PM에게 확인해 주세요.

Provider 노출 순서

모바일 SDK 로그인 화면에서는 설정한 Provider 순서대로 노출돼요.

  • Email은 필수이며 목록 첫 번째로 노출돼야 해요.
  • 멀티플랫폼(PC 지원) 게임은 스토브에서 제공하는 모든 Provider를 노출해야 하며, 개별 선택이 불가해요.
  • 권역별 권장 노출 순서는 이용 시나리오 > 로그인하기에서 확인할 수 있어요.

로그인 부가 기능

기본 로그인 외에 스토브 로그인에서 함께 제공하는 부가 기능이에요.

기능 제공 플랫폼 설명
GPG 로그인
(Google Play Games)
Mobile SDK (Android) Google Play Games 계정과 스토브 계정을 1:1 연결
자동 로그인 Mobile SDK, PC SDK 유효한 토큰이 있으면 입력 없이 자동 로그인

주의 사항

로그인 연동 전 꼭 확인하세요
ㆍ 로그인 후 서버에서 토큰 유효성 검증이 꼭 필요해요. 검증 흐름은 인증 가이드를 참고해 주세요.
캐릭터 설정은 필수예요. 미설정 시 백오피스 연동 기능(쿠폰·팝업·빌링·푸시 등)이 동작하지 않아요.

연동 가이드


플랫폼별 사전 준비

자사 게임의 출시 형태에 따라 필요한 플랫폼의 사전 준비만 진행하면 돼요.

플랫폼 필요 항목
Mobile ㆍ Mobile SDK 적용
ㆍ App ID·Client ID 설정
ㆍ 패키지/번들 ID 등록
ㆍ 3rd party Provider별 사전 설정
PC ㆍ PC SDK(PCSDK3) 적용
ㆍ App ID·Client ID 설정
ㆍ 로그인은 스토브 PC 클라이언트가 처리(별도 Provider 설정 불필요)
Web ㆍ 도메인이 xxx.game.onstove.com인 경우 사용 가능
ㆍ 도메인 연결·유입경로 코드는 기술PM이 처리
ㆍ 외부 인프라는 SSL 인증서 필요
Server ㆍ 토큰 검증용 API Access Token 발급(인증 가이드 참고)
ㆍ SSO 사용 시 방화벽 설정 필요

3rd party Provider 사전 설정은 출시 전 완료해야 해요
ㆍ 사용할 모든 Provider의 콘솔 설정·키 발급·앱 설정이 끝나야 로그인 화면에 노출돼요.
ㆍ 누락 시 검증 일정이 지연될 수 있어요.

아래는 3rd party Provider별 콘솔 설정·키 발급·앱 설정 요약이에요. 사용할 Provider 항목만 펼쳐서 확인하세요. STOVE Maven 저장소 등록과 SDK 모듈 버전은 개발 환경 설정을 따르고, 여기서는 Provider별 키·설정만 다뤄요. 콘솔 키 값(Client ID·Secret·Channel ID 등)은 퍼블리싱 기술 담당자(기술PM)를 통해 발급·전달받아요.

Googlegoogle_web_client_id · GoogleClientID · URL Scheme

Android는 google_web_client_id(웹 로그인 지원 시 client secret 포함), iOS는 GoogleClientID와 URL Scheme가 필요해요.

키 발급

  • Google Cloud Console사용자 인증 정보에서 '웹 애플리케이션' 유형 클라이언트 ID(google_web_client_id) 획득. Android에서 구글 웹 로그인을 지원하면 client secret도 함께 획득
  • iOS용 GoogleClientID와 URL Scheme 획득
  • 자사 패키지명으로 등록된 인증 정보가 있어야 정상 로그인돼요

승인된 Redirect URI (웹 로그인 호출 시)

게임에서 웹 로그인을 호출하는 케이스가 아니면 필수는 아니에요.

사용자 인증 정보OAuth 2.0 클라이언트 ID유형 '웹 애플리케이션' → 승인된 리디렉션 URI를 환경별로 등록해요.

text
Sandbox : https://m-member.gate8.com/google/redirect
Live    : https://m-member.onstove.com/google/redirect

Android

xml
<!-- strings.xml -->
<resources>
    <string name="google_web_client_id" translatable="false">{your-web-client-id}.apps.googleusercontent.com</string>
    <!-- 구글 웹 로그인 지원 시 -->
    <string name="google_web_client_secret" translatable="false">{your-web-client-secret}</string>
</resources>
xml
<!-- AndroidManifest.xml -->
<application>
    <meta-data
        android:name="com.stove.auth.google.web_client_id"
        android:value="@string/google_web_client_id" />

    <!-- 이하 구글 웹 로그인 지원 시에만 추가 -->
    <meta-data
        android:name="com.stove.auth.google.web_client_secret"
        android:value="@string/google_web_client_secret" />
    <activity
        android:name="com.stove.auth.google.CustomTabActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="stove-${applicationId}" />
        </intent-filter>
    </activity>
    <!-- Android 11+ 웹 로그인 지원 시 -->
    <queries>
        <intent>
            <action android:name="android.support.customtabs.action.CustomTabsService" />
        </intent>
    </queries>
</application>

iOS

xml
<!-- Info.plist -->
<key>GoogleClientID</key>
<string>{your-google-client-id}</string>
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>{your-google-url-scheme}</string>
    </array>
  </dict>
</array>

iOS Google SignIn framework 버전
ㆍ 구글 모듈 2.4.0은 Google SignIn v5.0.2, 2.4.1 이상은 v6.2.2에 대응해요.
ㆍ framework는 external-frameworks 저장소에서 해당 버전을 다운로드해요.

Unity

  • StoveEdit Settings → Inspector에서 'Use Auth-Google' 체크
  • (Android) WebClientIdgoogle_web_client_id 입력 (웹 로그인 지원 시 secret도 입력)
  • (iOS) ClientId·ClientSchemeGoogleClientID·URL Scheme 입력

Unreal

[StoveSDK] → [StoveSDK_APL.xml]에서 meta-data를 설정해요.

xml
<!-- google login -->
<addElements tag="application">
    <meta-data
        android:name="com.stove.auth.google.web_client_id"
        android:value="{your-google-client-id}" />
    <!-- 웹 로그인 지원 시 -->
    <meta-data
        android:name="com.stove.auth.google.web_client_secret"
        android:value="{your-google-client-secret}" />
</addElements>

iOS는 프로젝트 세팅iOSExtra PList DataAdditional Plist Data에 위 Info.plist 값을 병합해요.

Facebookfacebook_app_id · facebook_client_token

Facebook 앱의 facebook_app_idfacebook_client_token이 필요해요.

client_token은 필수예요
ㆍ Android auth-facebook 2.5.0 이상, iOS AuthFacebook 2.4.1 이상부터 client_token 설정이 필수예요.

키 발급

  • Facebook for Developers → 자신의 앱 선택
  • facebook_app_id: 페이지 좌측 상단 '앱 ID'에서 확인
  • facebook_client_token: 설정고급 설정보안클라이언트 토큰에서 확인

Android

xml
<!-- strings.xml -->
<resources>
    <string name="facebook_app_id" translatable="false">{your-app-id}</string>
    <string name="fb_login_protocol_scheme" translatable="false">fb{your-app-id}</string>
    <string name="facebook_client_token" translatable="false">{your-client-token}</string>
</resources>
xml
<!-- AndroidManifest.xml -->
<application>
    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id" />
    <meta-data
        android:name="com.facebook.sdk.ClientToken"
        android:value="@string/facebook_client_token" />
    <activity
        android:name="com.facebook.CustomTabActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="@string/fb_login_protocol_scheme" />
        </intent-filter>
    </activity>
</application>

iOS

xml
<!-- Info.plist -->
<key>FacebookAppID</key>
<string>{your-app-id}</string>
<key>FacebookDisplayName</key>
<string>{your-app-name}</string>
<key>FacebookClientToken</key>
<string>{your-app-client-token}</string>
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>fb{your-app-id}</string>
    </array>
  </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-share-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
</array>

Unity

  • StoveEdit Settings → Inspector에서 'Use Auth-Facebook' 체크
  • AppIdfacebook_app_id 입력

Unreal

[StoveSDK] → [StoveSDK_APL.xml]에서 meta-data를 설정해요.

xml
<!-- facebook login -->
<addElements tag="application">
    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="fb{facebook_app_id}" />
    <meta-data
        android:name="com.facebook.sdk.ClientToken"
        android:value="facebook_client_token" />
</addElements>

iOS는 프로젝트 세팅iOSExtra PList DataAdditional Plist Data에 위 Info.plist 값을 병합해요.

AppleServices ID · Capabilities

Sign In with Apple은 앱스토어 출시 필수예요
ㆍ iOS 앱스토어 출시를 위해 필수로 적용해야 하는 3rd party 인증이에요. iOS 13 이상부터 지원하며, Android는 버전과 무관하게 사용할 수 있어요.

Android — Services ID 발급 및 설정

식별자에 .appleid 접미사 필수
ㆍ Service ID를 도메인 형태 식별자로 생성할 때 반드시 .appleid를 접미사로 붙여 등록해요. (예: com.stove.mvp.google.appleid)

  • Redirect URL을 환경별로 등록해요.
text
m-member.gate8.com
m-member.onstove.com

https://m-member.gate8.com/appleid/redirect
https://m-member.onstove.com/appleid/redirect

여러 패키지에서 같은 Service ID 사용 시
com.stove.auth.apple.service.id를 설정하면 여러 패키지에서 같은 Service ID를 공유할 수 있어요. 이때 접미사 .appleid를 제외한 값을 meta-data value로 사용해요. 미설정 시 앱 패키지명을 Service ID로 사용해요.

xml
<!-- strings.xml : .appleid 접미사를 제거한 값 사용 -->
<resources>
    <string name="apple_service_id" translatable="false">com.stove.mvp.google</string>
</resources>
xml
<!-- AndroidManifest.xml -->
<application>
    <meta-data
        android:name="com.stove.auth.apple.service.id"
        android:value="@string/apple_service_id" />
</application>

iOS — Capabilities 설정

  • Apple Developer에서 대상 App ID에 Sign In with Apple Capability 추가
  • Xcode → 대상 target의 Signing & Capabilities에서 Sign In with Apple 추가
  • 인증 후 추가 데이터가 필요하면 로그인 전에 Scopes를 추가해요.
objectivec
SGSAppleProvider *appleProvider = [[SGSAppleProvider alloc] init];
[appleProvider addScopes:@[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail]];

Unreal

Android는 [StoveSDK] → [StoveSDK_APL.xml]에 meta-data를 설정해요.

xml
<addElements tag="application">
    <meta-data
        android:name="com.stove.auth.apple.service.id"
        android:value="{your-apple-service-id}" />
</addElements>

iOS는 Capabilities 항목이 설정 메뉴에 노출되지 않으므로 config 파일을 직접 수정해요. Config/DefaultEngine.ini[/Script/IOSRuntimeSettings.IOSRuntimeSettings] 항목에 bEnableSignInWithAppleSupport=True를 추가하면 빌드 시 Capabilities가 자동 입력돼요.

Steam키 발급 불필요

Steam은 별도 콘솔·키 발급이 없어요
ㆍ 별도의 개발자 콘솔을 사용하지 않아 키 발급·설정이 불필요해요.
Auth / AuthUI 2.8.4 이상이 필수예요.
ㆍ Steam Provider는 Android · iOS 네이티브에서 동작하며, Unity · Unreal 로그인 화면에서는 지원하지 않아요.

Android

모듈 의존성만 추가하면 돼요.

groovy
dependencies {
    // ...
    implementation 'com.stove:auth-steam:2.9.0'
}

iOS

Podfile에 모듈을 추가해요.

ruby
target '{ProjectTargetName}' do
  # ...
  pod 'SGSAuthSteam', '2.9.0'
end
LINEline_channel_id

LINE 채널의 line_channel_id가 필요해요.

키 발급 및 콘솔 설정

  • LINE Developers → 자신의 앱에서 Channel ID 확인
  • LINE Login 탭에서 Android packageName 및 iOS URL Scheme(Bundle ID) 등록

LINE 프로젝트 등록은 기술PM에게 문의해요
ㆍ LINE 프로젝트 등록 후 Channel ID를 전달받아요.

Android

xml
<!-- strings.xml -->
<resources>
    <string name="line_channel_id" translatable="false">{your-channel-id}</string>
</resources>
xml
<!-- AndroidManifest.xml -->
<application>
    <meta-data
        android:name="com.stove.auth.line.channel_id"
        android:value="@string/line_channel_id" />
</application>

iOS

xml
<!-- Info.plist -->
<key>LINE_CHANNEL_ID</key>
<string>{your-line-channel-id}</string>
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    </array>
  </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>lineauth2</string>
</array>

Unity

  • StoveEdit Settings → Inspector에서 'Use Auth-LINE' 체크
  • channelId에 전달받은 Channel ID 입력

Unreal

[StoveSDK] → [StoveSDK_APL.xml]에서 meta-data를 설정해요.

xml
<!-- LINE login -->
<addElements tag="application">
    <meta-data
        android:name="com.stove.auth.line.channel_id"
        android:value="@string/line_channel_id" />
</addElements>

iOS는 프로젝트 세팅iOSExtra PList DataAdditional Plist Data에 위 Info.plist 값을 병합해요.

Naverclient_id · client_secret · client_name

Naver 앱의 naver_client_id·naver_client_secret·naver_client_name이 필요해요. naver_client_name은 로그인 시 표시되는 앱 이름이에요.

키 발급 및 콘솔 설정

  • Naver Developers → 자신의 앱에서 애플리케이션 정보 확인
  • API 설정에서 Android 앱 패키지 이름과 iOS URL Scheme 등록

네이버 키 발급은 기술PM에게 문의해요
NaverClientID·NaverClientName·NaverClientSecret을 전달받아요.

iOS URL Scheme 형식
naver 접두사를 붙인 iOS Bundle ID를 소문자로 입력해요. (형식: naver + iOS Bundle ID)
ㆍ 예: Bundle ID가 com.stove.mvp.iosqa이면 → navercom.stove.mvp.iosqa

Android

xml
<!-- strings.xml -->
<resources>
    <string name="naver_client_id" translatable="false">{your-client-id}</string>
    <string name="naver_client_secret" translatable="false">{your-client-secret}</string>
    <string name="naver_client_name" translatable="false">{your-app-name}</string>
</resources>
xml
<!-- AndroidManifest.xml -->
<application>
    <meta-data
        android:name="com.stove.auth.naver.client_id"
        android:value="@string/naver_client_id" />
    <meta-data
        android:name="com.stove.auth.naver.client_secret"
        android:value="@string/naver_client_secret" />
    <meta-data
        android:name="com.stove.auth.naver.client_name"
        android:value="@string/naver_client_name" />
</application>

iOS

xml
<!-- Info.plist : SGSAuthNaver v2.8.2 이상 -->
<key>NidClientID</key>
<string>{your-naver-client-id}</string>
<key>NidAppName</key>
<string>{your-naver-client-name}</string>
<key>NidClientSecret</key>
<string>{your-naver-client-secret}</string>
<key>NidUrlScheme</key>
<string>naver{iOS Bundle ID 소문자}</string>
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>naver{iOS Bundle ID 소문자}</string>
    </array>
  </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>naversearchapp</string>
    <string>naversearchthirdlogin</string>
</array>

v2.8.1 → v2.8.2 업데이트 시 Key 변경
NaverClientIDNidClientID, NaverClientNameNidAppName, NaverClientSecretNidClientSecret으로 변경됐어요.
NidUrlScheme Key가 추가됐어요. 값에는 CFBundleURLTypesCFBundleURLSchemes에 입력한 Naver URL Scheme을 넣어요.
ㆍ v2.8.1 이하는 기존 NaverClientID 계열 Key를 사용해요.

Unity

  • StoveEdit Settings → Inspector에서 'Use Auth-Naver' 체크
  • ClientId·ClientSecret·ClientName에 전달받은 값 입력

Unreal

[StoveSDK] → [StoveSDK_APL.xml]에서 meta-data를 설정해요.

xml
<!-- Naver login -->
<addElements tag="application">
    <meta-data
        android:name="com.stove.auth.naver.client_id"
        android:value="naver_client_id" />
    <meta-data
        android:name="com.stove.auth.naver.client_secret"
        android:value="naver_client_secret" />
    <meta-data
        android:name="com.stove.auth.naver.client_name"
        android:value="naver_client_name" />
</addElements>

iOS는 프로젝트 세팅iOSExtra PList DataAdditional Plist Data에 위 Info.plist 값을 병합해요.

전체 로그인 흐름

플랫폼(Mobile/PC/Web)이 달라도 로그인이 진행되는 순서는 동일해요. 각 단계를 구현하는 구체적인 방법(SDK 함수·UI 구성 등)만 플랫폼에 따라 달라요.

개발하기


통합 로그인 (권장 흐름)

STOVE SDK의 통합 로그인 UI를 사용해 인증을 구현하는 방법이에요. 통합 로그인 핵심 흐름은 Auth.initializesetProviderAuthUI.loginUser.setGameProfile 4단계 순서로 진행돼요.

1. 초기화 (Auth.initialize)

서비스 이용에 필요한 초기 정보를 획득하는 단계예요. 초기화가 완료되어야 이후 로그인·결제·쿠폰 등 SDK 기능을 사용할 수 있어요.

  • 서비스 설정값(service_id, market_game_id) 획득
  • 앱 업데이트 필요 여부 확인
  • 게임 점검 여부 확인

앱 업데이트·게임 점검은 자동 처리돼요
Auth.initialize 응답으로 받은 ResultOperationUI.handleResult(activity, result, listener)에 그대로 전달하면 SDK가 점검(MaintenanceError 30003) / 앱 업데이트(AppUpdateError 30004) 화면을 자동으로 노출해요. 콜백 안에서 게임 진입 흐름을 이어가세요. 아래 앱 업데이트 및 게임 점검 처리 단락의 코드 예시를 참고하세요.

csharp
public void AuthInitialize()
{
    Auth.Initialize(result =>
    {
        if (result.IsSuccessful)
        {
            //초기화 성공
            /** 초기화 성공 및 앱 선택 업데이트 처리 **/
            OperationUI.HandleResult(result, (Result operationResult) =>
            {
                //IAP 초기화 | GameConfig 조회 | ...(중략)...
                /** ex) Touch To Screen 화면 노출 (=게임 시작이 준비되어 로그인 가능한 상태) **/
                //사용자가 화면을 터치
                if (Auth.AccessToken != null)
                {
                    /** AccessToken 있음 → 게스트 & 정회원 관계 없이 자동로그인으로 처리 **/
                    Login();
                }
                else
                {
                    /** AccessToken 없음 → 사용자 로그인 방식을 선택할 수 있도록 화면 제공 (`게스트 시작 & 로그인`) **/
                    //사용자가 `게스트 시작`을 선택한 경우 → `StartNewGuest()` 호출
                    //`로그인`을 선택한 경우 → `Login()` 호출
                }
            });

        }
        else if (result.Domain.Equals(Auth.Domain))
        {
            if (result.ErrorCode == AuthConfigurationError)
            {
                //설정 오류
                //set meta-data 'com.stove.environment' in AndroidManifest.xml
                //"check constants server :client_id and service_id are null or empty"
            }
            else
            {
                //ErrorCode == 30003 점검
                //ErrorCode == 30004 강제 업데이트
                /** 점검 및 앱 강제 업데이트 팝업 처리 **/
                OperationUI.HandleResult(result, (Result operationResult) =>
                {
                });
            }
        }
        else
        {
            //네트워크 또는 기타 서버 에러
            OperationUI.HandleResult(result, (Result operationResult) =>
            {
            });
        }
    });
}

kotlin
fun initialize(activity: Activity) {
    Auth.initialize(activity.applicationContext) { result ->
        when {
            result.isSuccessful() -> {
                //Init succeed. Handle optional app update
                OperationUI.handleResult(activity, result) {
                    //Do login.
                }
            }
            result.domain == Auth.Domain -> {
                when (result.errorCode) {
                    Auth.AuthConfigurationError -> {
                        //set meta-data 'com.stove.environment' in AndroidManifest.xml
                        //"check constants server :client_id and service_id are null or empty"
                    }
                    else -> {
                        //Handle required app update & maintenance
                        OperationUI.handleResult(activity, result) {

                        }
                    }
                }
            }
            else -> {
                //NetworkError
                //User notify & retry initialize
                OperationUI.handleResult(activity, result) {
                    initialize(activity)
                }
            }
        }
    }
}

ErrorCodes

명확한 조치가 있는 케이스

  • 30001 AuthConfigurationError: 파트너스 키(client_id·service_id) 누락이에요. 초기화 호출 전 파트너스 발급 키가 올바르게 적용돼 있는지 확인하세요.
  • 30003 MaintenanceError / 30004 AppUpdateError: 점검·앱 업데이트 정상 응답이에요. OperationUI.handleResult에 결과를 그대로 전달해 SDK 자동 안내 UI를 노출하세요. (직접 처리하지 마세요)
DomainErrorCodeDescription
com.stove.success0Success
com.stove.auth30001AuthConfigurationError : Check constants server : client_id and service_id are null or empty
com.stove.auth30003MaintenanceError
com.stove.auth30004AppUpdateError
com.stove.base.network10001NoConnectionError
com.stove.base.network10002TimeoutError



앱 업데이트 및 게임 점검 처리

초기화 결과가 '앱 업데이트' 또는 '게임 점검' 이라면, 이용자에게 UI를 노출해서 안내해요.

OperationUI.handleResult가 점검·업데이트 팝업을 자동으로 처리해줘요.


csharp
public void HandleResult(Result result)
{
    OperationUI.HandleResult(result, (Result handleResult) =>
    {

    });
}



2. Provider 설정 (setProvider)

AuthUI.login을 호출하기 전에 게임이 지원할 인증 채널(Provider)을 등록해요. 등록한 순서 그대로 로그인 화면에 노출돼요.


인증 채널 추가 (파트너스 사전 설정)

로그인 화면에 노출할 Provider별로 파트너스 콘솔에 인증 정보를 미리 등록해 두세요. 각 채널 설정 가이드는 아래 링크를 참고하세요.

  • 플랫폼 별 사전 준비
  • Provider 목록을 추가한 순서대로 로그인 화면에 노출돼요.
  • 로그인 화면의 이메일은 Provider를 추가하지 않아도 기본 설정이에요 (단, 로그인 화면 B타입에서는 이메일 Provider 필수).
  • 연결하기 화면에서 '이메일 Provider'를 설정하지 않으면 노출되지 않아요.

setProviders 코드 적용

AuthUI.setProviders로 게임에서 지원할 Provider를 등록해요. 전달한 배열의 순서가 곧 화면 노출 순서예요. AuthUI.login 호출 전에 반드시 실행하세요.


csharp
public void SetProviders()
{
    List<Provider> providers = new List<Provider>
    {
        new EmailProvider(),
        new StoveAppProvider(),
        new GuestProvider(),
        new GoogleProvider(),
        new FacebookProvider(),
        new AppleProvider(),
        new SteamProvider(),
        new LineProvider(),
        new NaverProvider(),
        new TwitterProvider()
    };
    AuthUI.Providers = providers;
}



3. 통합 로그인 (AuthUI.login)

AuthUI.login 안에서 SDK가 자동 처리하는 흐름
통합 로그인 호출 한 번으로 아래가 함께 진행돼요. 통합 UI를 쓰면 별도 호출이 필요 없어요.

기능자동 노출 시점별도 호출이 필요한 케이스
기기 등록·관리신규 디바이스 등록이 필요한 시점에 자동 노출인게임 설정 화면에서 기기 관리 UI를 직접 띄울 때
본인인증법적/정책상 인증이 필요한 시점에 자동 노출결제·민감 기능 진입 전 재인증을 강제할 때

직접 호출 코드는 기기 등록, 본인인증 문서를 참고하세요.


AuthUI.login을 호출하면 로그인 흐름도에 따라 자동으로 동작해요.

로그인 화면을 노출하거나 AccessToken을 갱신하고, 이용자에게 보여줄 약관이 있으면 약관 처리까지 이어져요.

  • AuthUI.login 한 번의 호출로 로그인 UI 노출 및 AccessToken 갱신이 모두 처리돼요.
  • '스토브 APP으로 로그인'은 스토브 APP이 설치된 단말에서만 노출돼요.

csharp
public void Login()
{
    AuthUI.Login((Result result, AccessToken accessToken) =>
    {
        if (result.IsSuccessful)
        {
            if (result.UserInfo != null && result.UserInfo.TryGetValue("userAction", out string userAction))
            {
                if (!string.IsNullOrEmpty(userAction) && userAction.Equals("sanction"))
                {
                    /** ex) 로그아웃 or 재시작 등 게임 시나리오에 맞게 적용 **/
                }
            }
        }
        else
        {
            if (result.IsServerError)
            {
                OperationUI.HandleResult(result, (Result operationResult) =>
                {
                    if (result.ErrorCode == 44008 || result.ErrorCode == 45006) { Auth.Logout(); }
                    if (result.ErrorCode == 44010) { Auth.Logout(); }
                });
            }
            else if(result.IsCanceled) {
                if (Auth.AccessToken != null) {
                    //자동 또는 수동 로그인 재시도
                    Login();
                }
                else {
                    Login();
                }
            }
            else
            {
                OperationUI.HandleResult(result, (Result operationResult) => { });
            }
        }
    });
}

kotlin
fun login(activity: Activity) {
    AuthUI.login(activity) { result, accessToken ->
        when {
            result.isSuccessful() -> {
                //제재된 사용자 확인 (=게임에서 직접 처리하는 경우)
                if(result.userInfo == AuthUI.Sanctioned) {
                    // 로그아웃 or 재시작 등 게임 시나리오에 맞게 적용
                    return@login
                }

                //로그인 이후 화면으로 이동
                val token = accessToken!!.token //AccessToken
                val user = accessToken.user
                val memberNumber: Long = user.memberNumber
                val verifiedIdentity: Boolean = user.verifiedIdentity
                val nationality: String = user.nationality
                val isGuest: Boolean = user.isGuest()
                val providers = user.providerUsers
                for (provider in providers) {
                    val type: Int = provider.type //1:StoveEmail, 2:Facebook, 3:Twitter, 6:Naver, 9:Google, 12:Apple, 13:Line, 15:Steam
                    val userId: String = provider.userId
                    val email: String? = provider.email
                    val verifiedEmail: Boolean? = provider.verifiedEmail
                }
            }
            result.isCanceled() -> {
                //사용자 취소, 로그인 화면 유지
            }
            result.isServerError() -> {
                OperationUI.handleResult(activity, result) { }
            }
            else -> {
                OperationUI.handleResult(activity, result) { }
            }
        }
    }
}

ErrorCodes

명확한 조치가 있는 케이스

  • 30001 AuthConfigurationError: client_id·service_id가 null/빈 값이에요. SDK 초기화 호출 전에 파트너스에서 발급받은 키가 올바르게 설정됐는지 확인하세요.
  • 44010 Invalid refresh token: 저장된 refresh token이 만료/무효예요. 토큰을 폐기하고 로그인 화면으로 유도해 신규 발급받으세요.
  • 44009 Password has been changed: 비밀번호 변경 이후 기존 토큰이 무효예요. 토큰을 폐기하고 재로그인 흐름으로 유도하세요.
  • 30302 ServerError (단말기 시간 변경): 이용자가 디바이스 시간을 임의로 변경한 케이스예요. 시간 설정을 자동으로 되돌리도록 안내하세요.
DomainErrorCodeDescription
com.stove.success0Success
com.stove.auth30001AuthConfigurationError : Check constants server : client_id and service_id are null or empty
com.stove.server43000ID or PW is incorrect.
com.stove.server43104Game restrict member
com.stove.server10125Error : It works only on normal devices. If this error persists, please contact Customer Service.
com.stove.server49500blocked IP address
com.stove.server41002Invalid game id
com.stove.server44001Withdrawal request member
com.stove.server44002Withdrawal member
com.stove.server44008Already Stove Account Link.
com.stove.server44010Invalid refresh token
com.stove.server41001Invalid client id
com.stove.server44000Sleep member
com.stove.server44009Password has been changed. Please login again.
com.stove.server30302ServerError — 이용자가 단말기 시간을 임의로 변경해서 플레이하는 경우 발생
com.stove.base.network10001NoConnectionError
com.stove.base.network10002TimeoutError



4. 캐릭터 설정 (setGameProfile)

로그인 완료 이후 이용자의 캐릭터 및 월드 정보를 입력해요. 입력된 정보는 각 기능(쿠폰/팝업/빌링/푸시)에서 월드·캐릭터별로 구분해 사용돼요. 게임 프로필의 유효성은 SDK가 별도로 검사하지 않으므로 입력 시 null 체크를 꼭 해주세요.

캐릭터 설정 작업은 필수예요
캐릭터 설정 작업을 하지 않으면 스토브 백오피스를 통해 설정한 기능(쿠폰/팝업/빌링/푸시)을 정상적으로 사용할 수 없어요.

사전 준비:

  • 스토브 IAP·쿠폰 서비스를 사용하려면 파트너스에 World 정보가 사전 등록되어 있어야 해요.
  • 월드 미지원 게임이라도 default로 최소 1개 world 지정이 필요해요.

월드 지원 게임

csharp
private void SetGameProfile()
{
    string CharacterNumber = "setYourCharacterNumber";
    string WorldId = "setYourWorld";
    AccessToken accessToken = Auth.AccessToken;
    if(accessToken == null) { return; }
    accessToken.User.GameProfile = new GameProfile(CharacterNumber, WorldId);
}

kotlin
private fun setGameProfile() {
    val characterNumber = "setYourCharacterNumber"
    val worldId = "setYourWorld"
    // characterNumber, world 값의 유효성 체크(null)를 꼭 해주세요.
    Auth.accessToken?.user?.gameProfile = GameProfile(characterNumber, worldId)
}

월드 미지원 게임

월드를 지원하지 않는 게임이라도 characterNumber만 설정하면 돼요. world 인자는 null로 전달해요. 단, 파트너스에는 default world가 1개 이상 등록되어 있어야 해요.


csharp
private void SetGameProfile()
{
    string CharacterNumber = "setYourCharacterNumber";
    AccessToken accessToken = Auth.AccessToken;
    if (accessToken == null) { return; }
    accessToken.User.GameProfile = new GameProfile(CharacterNumber);
}

SDK 토큰 관리

SDK는 AccessToken 만료 시간의 80%에 도달하면 자동 갱신을 진행해요. 자동 갱신은 프로세스가 실행 중일 때만 동작하니, AccessToken은 항상 조회해서 사용해야 해요.

csharp
public void GetToken()
{
    string token = Auth.AccessToken.Token;
}

GPG 로그인 구현

Google Play Games Service(GPG) 오픈을 준비하는 게임에서 PGS ID와 스토브 계정 간 1:1 계정 연결을 구현할 때 사용해요. SDK는 Fetch(연결된 계정 조회) / Load(불러오기) / Link(계정 연결) 3개 API를 제공해요.

PGS ID ↔ 스토브 계정 1:1 정책
최초 연결 후 다른 스토브 계정으로 접속하면 기존 계정 정보를 덮어쓰는(override) 방식으로 동작해요.
정회원 전환 등 스토브 계정 변경이 일어나면 GPG 연결을 반드시 다시 호출하세요.


사전 준비

API Console / 파트너스 작업

  • 콘솔 권한 신청: 서비스 환경별 패키지명(Android)을 퍼블리싱 기술 담당자에게 전달해 구글 측 Allowlist 신청 (1~2D 소요)
  • Private Key 생성: 구글 클라우드 콘솔에서 발급. 생성 매뉴얼 PDF
  • 스토브 파트너스 등록: [파트너스] > [Launching] > [서비스 연동] > [모바일 마켓 정보] > [플레이스토어 마켓 앱] > [Private Key File 업로드]

SDK 모듈 적용

  • play-services-games-v2 라이브러리: 2023/09/18부로 공식 릴리즈된 모듈. EAP 수동 적용은 더 이상 필요 없어요. Google 공식 다운로드
  • AUTH-GooglePlayGames 모듈: STOVE SDK 측 GPG 연결 모듈. 최신 라이브 버전 사용 필수

프로젝트 ID 설정 (Android)

  1. Google Play Console에서 자신의 앱 선택
  2. Play 게임서비스 > 설정 및 관리 > 설정에서 프로젝트 ID 확인
  3. 아래 파일들에 적용
groovy
repositories {
    google()
    jcenter()
    maven {
        url "https://externalnexus.iam0.com/repository/mvp"
        // Android Gradle Plugin 7.0 이상 사용 시 아래 옵션 추가
        allowInsecureProtocol = true
    }
    mavenCentral()
}

dependencies {
    implementation 'com.stove:auth-googleplaygames:2.8.1'
}

프로젝트 ID 설정 (Unity / Unreal)

  • Unity: Stove > Edit SettingsUse Auth-GooglePlayGames 체크 → Projectid에 google_playgames_projectid 입력
  • Unreal: 프로젝트 셋팅 > Android > GooglePlayServices > 게임 앱 ID 입력

개발 흐름

  1. PGS SignIn 및 recallSessionID 획득 (CP사 구현 영역): Google Play Games v2 SignIn 처리 후 PGS 고유 식별자인 recallSessionID를 획득해요. 각 언어별 획득 방법은 Google 공식 가이드를 참고하세요.
  2. SDK 초기화 + Provider 설정: 기존 통합 로그인 흐름과 동일하게 Auth.initialize, AuthUI.setProviders를 호출해요.
  3. 자동 로그인 분기:
    • Auth.AccessToken 있음 → 기존 자동 로그인 흐름 진행 (별도 GPG 처리 불필요)
    • Auth.AccessToken 없음 → GPGProvider(recallSessionID).fetch()로 연결된 스토브 계정 조회
  4. 조회 결과 분기:
    • 연결 계정 없음 → 게스트 시작 또는 통합 로그인 화면으로 진입
    • 연결 계정 있음 + 게임 직접 UI → GPGProvider(recallSessionID, account) 생성 → Auth.Login(provider)
    • 연결 계정 있음 + SDK 제공 UI → GPGProvider.load()Auth.login(loadedProvider)
  5. 계정 연결 (Link): 로그인 완료 후 적절한 시점(예: 로비 진입, 계정 설정 복귀)에 AccessToken.User.Link(GPGProvider)로 PGS ID와 스토브 계정을 연결해요. 정회원 전환 시 반드시 재호출.

전체 연결 시퀀스

PGS SignIn → recallSessionID 획득 → 연결된 계정 조회·로그인·연결 흐름 전체를 표현한 다이어그램이에요.

※1 연결은 1:1 정책으로 연결된 계정 목록은 최대 1개
※2 게임에서 이용자에게 최적화된 UI를 직접 구성할 경우에만 해당


Fetch — 연결된 계정 조회

recallSessionID로 스토브 서버에서 해당 PGS ID와 연결된 스토브 계정 목록을 조회해요.


csharp
public void googlePlayGamesFetch(string sessionId)
{
    GPGProvider provider = new GPGProvider(sessionId); // recallSessionId
    provider.Fetch((Result result, List<Dictionary<string, object>> accounts) =>
    {
        if (result.IsSuccessful)
        {
            // accounts : 계정 목록
        }
    });
}

Load — 연결된 계정 불러오기

Fetch 결과로 받은 계정 정보를 SDK 제공 UI에서 이용자에게 선택받은 뒤, 해당 계정으로 자동 로그인할 수 있도록 Provider를 준비해요. 반환된 loadedProviderAuth.login에 전달하세요.


csharp
public void googlePlayGamesLoad(string sessionId, Dictionary<string, object> account)
{
    /** account → Fetch의 결과로 얻은 계정 목록에서 획득 **/
    GPGProvider provider = new GPGProvider(sessionId); // recallSessionId
    provider.Load(account, (Result result, GPGProvider loadedProvider) =>
    {
        if (loadedProvider != null) {
            Auth.Login(loadedProvider, (Result loginResult, AccessToken accessToken) => {
                if (loginResult.IsSuccessful) {
                    // 로그인 성공
                } else if (loginResult.IsServerError) {
                    OperationUI.HandleResult(loginResult, (Result operationResult) =>
                    {
                        // 게스트 자동 로그인 불가 케이스
                        if (loginResult.ErrorCode == 44008 || loginResult.ErrorCode == 45006) {
                            Auth.Logout();
                        }
                    });
                }
            });
        }
    });
}

Link — 계정 연결

로그인 완료 후 적절한 시점에 PGS ID와 현재 스토브 계정을 연결해요. 정회원 전환이 일어나면 반드시 다시 호출해야 연결이 유지돼요.


csharp
public void googlePlayGamesLink(string sessionId)
{
    GPGProvider provider = new GPGProvider(sessionId); // recallSessionId

    AccessToken accessToken = Auth.AccessToken;
    if (accessToken == null) { return; }
    accessToken.User.Link(provider, (Result result) =>
    {
        if (result.IsSuccessful)
        {
            // Google Play Games 연결 성공
        }
    });
}

트러블슈팅

상황원인해결 방법
정회원 전환 후 GPG 연결이 풀려요PGS ID ↔ 스토브 계정은 1:1 정책이에요. 스토브 계정이 정회원으로 바뀌면 기존 PGS 연결도 함께 갱신돼야 정상 동작해요.정회원 전환 완료 직후 AccessToken.User.Link(GPGProvider(recallSessionID))를 다시 호출하세요.
ErrorCode 44008 발생 — 게스트 유지 옵션 사용 시다른 디바이스에서 정회원 전환이 일어나면 기존 기기에 백업해 둔 게스트 토큰이 만료돼요.백업된 게스트 토큰을 삭제하고 Auth.logout을 호출해 로그인 흐름을 다시 진입시키세요.
Fetch 결과가 빈 목록으로 와요PGS ID에 연결된 스토브 계정이 아직 없는 정상 상태일 수 있어요. (Allowlist 미승인이거나 Private Key 미등록인 경우 통신 자체가 실패할 수 있음)신규 이용자라면 게스트 시작 또는 통합 로그인 화면으로 자연스럽게 진입시키세요. 통신 실패가 의심되면 파트너스 Private Key 등록과 콘솔 Allowlist 승인 여부를 확인하세요.

Google Console API 설정

Google Play에 출시된 앱의 IAP(인앱 구매) 정보를 스토브 파트너스 빌링에 등록하는 방법이에요. STOVE SDK V2의 IAP 인증은 Google의 OAuth 클라이언트 방식을 사용하므로, Google Android Publisher API 연결이 필수예요.

Google Play Console 작업은 소유자(마스터) 계정으로 진행하세요.
다른 권한 계정으로 진행하면 일부 메뉴 접근이 막혀 작업이 중단될 수 있어요.

작업 흐름은 다음 4단계예요.

  1. Google Play Console API 액세스 권한 연결
  2. Google Cloud 프로젝트 생성 및 API·OAuth 설정
  3. OAuth 2.0 Playground에서 Refresh Token 획득
  4. 스토브 파트너스 빌링 설정에 발급 정보 입력

1. Google Play Console API 액세스 권한 얻기

Google Play에 등록된 앱과 IAP 결제 검증을 위해 Google Android Publisher API에 연결해요.

  1. Google Play Console > 설정 > API 액세스로 이동해요.
  2. 기존 Cloud 프로젝트를 선택하거나, Google Cloud Console에서 미리 생성한 프로젝트를 연결해요.
  3. 연결이 정상적으로 완료되면 설정 페이지에 연결된 Google Cloud 프로젝트프로젝트의 API 목록이 표시돼요.

연결된 프로젝트 상태가 화면에 나타나지 않으면 Google Cloud와의 연결을 먼저 확인하세요. 설정 후에도 문제가 지속되면 Google 공식 가이드를 참고하세요.


2. Google Cloud 프로젝트 생성

실제 서비스 앱과 연결된 프로젝트(서비스 프로젝트)에서만 진행하세요.
테스트 프로젝트에서 작업하면 라이브 빌링 검증이 동작하지 않아요.


2-1) 프로젝트 만들기

  1. Google Cloud Console에 접속해요. 로그인 계정은 Google Play Console 개발자 계정 소유자여야 해요.
  2. IAM 및 관리자 > 프로젝트 만들기를 선택해요.
  3. 프로젝트 이름과 위치를 입력해 프로젝트를 생성해요.

2-2) 프로젝트에서 사용할 API 추가 (Play Android Developer API)

  1. 생성한 프로젝트를 선택한 뒤 API 및 서비스 > 라이브러리로 이동해요.
  2. **Play Android Developer API**를 검색해 선택하고, 제품 세부정보에서 사용으로 설정해요.

Play Console의 API 액세스에 연결된 프로젝트와 동일한 프로젝트에서 활성화해야 해요.
IAP 검증을 위해 Google Play Android Developer API가 반드시 활성화(enable)되어 있어야 해요.


2-3) OAuth 동의 화면 설정 및 OAuth 클라이언트 ID 만들기

  1. API 및 서비스 대시보드에서 연동할 프로젝트를 선택해요.
  2. 사용자 인증 정보 메뉴에서 사용자 인증 정보 만들기 > **OAuth 클라이언트 ID**를 선택해요.
  1. 신규 OAuth 클라이언트의 기본 정보를 입력해요.
    • 애플리케이션 유형: 웹 애플리케이션
    • 클라이언트 이름: IAP 용도 식별이 가능한 명칭
    • 승인된 자바스크립트 원본: 비워둠
    • 승인된 리다이렉션 URI: + URI 추가 클릭 후 https://developers.google.com/oauthplayground 입력
  1. 생성이 완료되면 안내 팝업에서 두 가지 값을 확인해 보관하세요. (이후 파트너스 입력 + Refresh Token 발급에 사용)
    • 클라이언트 ID (OAuth Client ID)
    • 클라이언트 보안 비밀번호 (OAuth Client Secret)

값은 OAuth 클라이언트 정보 화면 또는 다운로드한 클라이언트 JSON에서도 확인할 수 있어요.

자세한 OAuth 설정 방법은 Google OAuth2 가이드를 참고하세요.


3. Refresh Token 생성 (OAuth 2.0 Playground)

  1. Google OAuth 2.0 Playground로 이동해요.
  2. 화면 우측 상단의 톱니바퀴 버튼을 눌러 OAuth 2.0 Configuration 패널을 열고, Use your own OAuth credentials 체크박스를 선택해요.
  3. 앞 단계에서 발급받은 OAuth Client IDOAuth Client Secret을 각각 입력해요.
  4. 좌측 Step 1 영역에서 Google Play Android Developer API를 선택하거나, 하단 범위 입력란에 직접 https://www.googleapis.com/auth/androidpublisher를 입력해요.
  5. 좌측 하단 Authorize APIs 버튼을 클릭해요.
  1. 인증 완료 후 화면이 Step 2로 전환되면 Exchange authorization code for tokens 버튼을 클릭해요. 응답 영역에서 Refresh token 값을 확인할 수 있어요.

4. 스토브 파트너스 빌링 설정에 정보 입력

위 단계에서 발급받은 다음 3개 값을 스토브 파트너스의 마켓 별 IAP 정보에 입력해요.

  • OAuth Client ID

  • OAuth Client Secret

  • Refresh Token

자주 묻는 질문



Q1. 통합 로그인 UI와 직접 로그인(DATA API) 중 어떤 방식을 선택해야 하나요?
A. 빠르고 간편하게 인증을 구현하려면 통합 로그인 UI(Auth.UI) 방식을 권장해요.
게임에서 직접 로그인 화면을 구성하거나 특정 Provider만 선택적으로 사용해야 하는 경우 직접 로그인(DATA API) 방식을 사용하면 돼요.
Q2. 멀티 플랫폼(Mobile + PC + Web) 게임에서 로그인은 어떻게 구성하나요?
A. 각 플랫폼별로 로그인 모듈을 따로 연동해요.
Mobile은 Mobile SDK, PC는 PC SDK + STOVE PC 클라이언트, Web은 GNB 또는 로그인 URL 방식을 사용해요.
스토브 회원 식별자(member_no 또는 guid)는 플랫폼과 무관하게 동일하므로 계정 연속성이 유지되고, 게임 서버는 어느 환경의 토큰이든 동일한 검증 API로 처리할 수 있어요.
Q3. 캐릭터 설정(GameProfile)은 언제 해야 하나요?
A. 로그인 완료 후 게임 로비 진입 전에 반드시 캐릭터 설정을 완료해야 해요.
설정하지 않으면 쿠폰, 팝업, 빌링, 푸시 등 스토브 백오피스를 통해 설정한 기능이 정상 동작하지 않아요.
SDK를 초기화하거나 정리한 후 다시 초기화하는 경우에도 setGameProfile API를 호출해 게임의 월드 및 캐릭터 정보를 재설정해야 해요.
Q4. accessToken은 어떻게 관리해야 하나요?
A. SDK에서는 accessToken의 만료 시간이 80%에 도달했을 때 자동 갱신을 진행해요.
자동 갱신은 프로세스가 실행되고 있을 때만 동작하므로, accessToken은 항상 조회해서 사용해야 해요.
로그인 이후 서버에 인증 요청 시에도 반드시 서버 사이드에서 토큰 유효성을 검증해야 해요.
Q5. 게스트 로그인은 어떻게 정회원으로 전환하나요?
A. 게스트 계정은 AuthUI.link(통합 UI) 또는 Auth.accessToken?.user?.link(DATA API)를 호출해 정회원 계정으로 연결할 수 있어요.
게스트 계정인 경우에만 호출을 권장하며, 게스트 계정이 아닌 경우 '채널 연결하기'가 노출돼요.
Q6. 로그인 화면에서 Provider 노출 순서는 어떻게 바꾸나요?
A. AuthUI.setProviders() 호출 시 전달하는 Provider 목록의 순서대로 로그인 화면에 노출돼요.
Provider 목록은 추가한 순서에 따라 화면이 달라질 수 있으며, 로그인 화면의 이메일은 Provider를 추가하지 않아도 기본으로 설정돼요.
단, 로그인 화면 B타입에서는 이메일 Provider가 필수예요.
Q7. iOS에서 Apple 로그인을 추가하려면 어떻게 해야 하나요?
A. Sign in with Apple은 iOS 13 이상부터 지원하며 앱 스토어 출시를 위해 필수 적용해야 하는 3rd party 인증이에요.
Apple Developer에서 Services IDs 생성, Redirect URL 설정, Xcode에서 Sign in with Apple Capability를 추가해야 해요.
Unreal의 경우 Config/DefaultEngine.ini 파일에 bEnableSignInWithAppleSupport=True를 추가하면 자동으로 Capabilities가 설정돼요.
Q8. Google IAP 연동을 위해 Refresh Token은 어떻게 발급하나요?
A. Google Developers OAuth 2.0 Playground에서 발급할 수 있어요.
OAuth 2.0 Configuration에서 "Use your own OAuth credentials"를 체크한 후 OAuth Client ID와 Client Secret을 입력하고,
Play Android Developer API 범위를 선택하여 Authorize API를 클릭해요.
Step 2에서 "Exchange authorization code for tokens" 버튼을 클릭하면 Refresh Token을 얻을 수 있어요.
발급된 정보는 스토브 파트너스 > 빌링 설정 정보에 입력해요.
Q9. GPG에 연결된 계정이 없으면 어떻게 처리해야 하나요?
A. GPG에 연결된 계정이 없는 경우 게스트 시작 또는 통합 로그인이 보이는 초기화면으로 전환해 수동 로그인을 진행해요.
GPG 로그인 연결은 1:1 정책이 적용되며, 연결된 계정 목록은 최대 1개예요.
Data API를 이용해 게임에서 직접 화면을 구성하는 경우, 계정 연결 여부에 따라 분기 처리가 필요해요.
Q10. SSO 임시 key(state)의 유효 시간은 얼마나 되나요?
A. 임시 key(=state)의 유효 시간은 10분이며, 1회성으로만 사용 가능해요.
웹 토큰 전환 페이지(/auth/token-exchange)에서 리다이렉트 완료 시 임시 키 값의 유효성은 즉시 만료되므로 재사용할 수 없어요.
SSO 연동이 필요할 때마다 임시 key 발급 API를 통해 새로 발급받아야 해요.
Q11. SSO 연동 시 redirect_url에 제한이 있나요?
A. redirect_urlxxxx.onstove.com 도메인으로 사용할 수 있는 페이지로만 제한돼요.
SSO 타깃 페이지는 연동 전 퍼블리싱 기술 담당자에게 반드시 확인받아야 해요.
또한 게임서버와 스토브 API 서버 간 통신이기 때문에 인프라 방화벽 설정도 사전에 완료되어 있어야 해요.



직접 문의하고 싶으신가요? stove.developers@smilegate.com