Android SDK V2 Authentication
V2 Android supports two usage styles:
OegSdkfor drop-in UI and legacy-style integrationOEGAuthfor custom UI and direct auth APIs
Option A: Drop-in login UI with OegSdk
This is the path used by the Android sample app.
OegSdk.showLogin(object : AuthenticationCallBack {
override fun onLoginResult(result: WorkResult<AuthenticationInfo>, provider: String?) {
if (result.isSuccess()) {
println("Login success: ${result.data?.uuid}")
} else {
println(result.error?.message)
}
}
override fun onRegisterResult(result: WorkResult<AuthenticationInfo>) = Unit
override fun onChangePassResult(result: WorkResult<Boolean>) = Unit
})
OegSdk.INSTANCE.showLogin(new AuthenticationCallBack() {
@Override
public void onLoginResult(WorkResult<AuthenticationInfo> result, String provider) {
if (result.isSuccess()) {
System.out.println("Login success: " + result.data().getUuid());
} else {
System.out.println(result.error().getMessage());
}
}
@Override
public void onRegisterResult(WorkResult<AuthenticationInfo> result) {}
@Override
public void onChangePassResult(WorkResult<Boolean> result) {}
});
After login:
val authInfo = OegSdk.getAuthenticationInfo()
val isLoggedIn = OegSdk.isLoggedIn()
AuthenticationInfo authInfo = OegSdk.INSTANCE.getAuthenticationInfo();
boolean isLoggedIn = OegSdk.INSTANCE.isLoggedIn();
Logout:
OegSdk.logout()
OegSdk.INSTANCE.logout();
Option B: Direct API with OEGAuth
Initialize with the builder first, then call the facade methods directly:
OEGAuth.login("username", "password") { result ->
when (result) {
is AuthResult.Success -> {
println("Token: ${result.user.token}")
}
is AuthResult.Error -> {
println("Error: ${result.message}")
}
}
}
OEGAuth.INSTANCE.login("username", "password", result -> {
if (result instanceof AuthResult.Success) {
System.out.println("Token: " + ((AuthResult.Success) result).getUser().getToken());
} else if (result instanceof AuthResult.Error) {
System.out.println("Error: " + ((AuthResult.Error) result).getMessage());
}
});
Guest login:
OEGAuth.playNow { result -> /* ... */ }
OEGAuth.INSTANCE.playNow(result -> { /* ... */ });
Other commonly used methods:
OEGAuth.register(...)OEGAuth.socialLogin(...)OEGAuth.fetchUserInfo(...)OEGAuth.updateProfile(...)OEGAuth.changePassword(...)OEGAuth.forgotPassword(...)
Social login notes
Google
V2 uses Credential Manager with a web client ID configured in oeg_config.json (sns.google_web_client_id). No google-services.json required.
Dependencies (already in SDK):
androidx.credentials:credentialsandroidx.credentials:credentials-play-services-authcom.google.android.libraries.identity.googleid
Facebook
Requires:
facebook_app_idfacebook_client_tokenfb_login_protocol_scheme- The Facebook manifest entries shown on the installation page
TikTok
See the dedicated TikTok Login guide for full setup instructions including TikTok Developer Portal configuration, SDK dependency, manifest setup, and how the auth flow works.
Session state
For custom integrations, these fields are available from OEGAuth:
OEGAuth.currentUserOEGAuth.isLoggedInOEGAuth.token
User data
After a successful login, AuthResult.Success contains an AuthUser object. You can also access it anytime via OEGAuth.getCurrentUser().
val user = OEGAuth.getCurrentUser()
// Identity
val userId = user?.userId // String — numeric user ID from OEG platform
val uuid = user?.uuid // String — unique UUID, stable across sessions
val username = user?.username // String? — null for guest accounts
val token = user?.token // String — JWT bearer token
// Login method — useful for analytics/tracking
val loginType = user?.loginType // LoginType enum (see below)
// Profile
val displayName = user?.displayName
val email = user?.email
val phone = user?.phone
val avatar = user?.avatar
// Account flags
val isGuest = user?.isPlayNow // true for Play Now / guest accounts
AuthUser user = OEGAuth.INSTANCE.getCurrentUser();
if (user != null) {
// Identity
String userId = user.getUserId(); // numeric user ID from OEG platform
String uuid = user.getUuid(); // unique UUID, stable across sessions
String username = user.getUsername(); // null for guest accounts
String token = user.getToken(); // JWT bearer token
// Login method
LoginType loginType = user.getLoginType();
// Profile
String displayName = user.getDisplayName();
String email = user.getEmail();
String phone = user.getPhone();
String avatar = user.getAvatar();
// Account flags
boolean isGuest = user.isPlayNow(); // true for Play Now / guest accounts
}
LoginType
when (user?.loginType) {
LoginType.PASSWORD -> // username + password
LoginType.PLAY_NOW -> // anonymous guest
LoginType.GOOGLE -> // Google Sign-In
LoginType.FACEBOOK -> // Facebook Login
LoginType.TIKTOK -> // TikTok Login
LoginType.APPLE -> // Apple Sign-In (iOS only)
LoginType.UNKNOWN -> // restored from storage — no fresh login this session
null -> // not logged in
}
if (user != null) {
switch (user.getLoginType()) {
case PASSWORD: /* username + password */ break;
case PLAY_NOW: /* anonymous guest */ break;
case GOOGLE: /* Google Sign-In */ break;
case FACEBOOK: /* Facebook Login */ break;
case TIKTOK: /* TikTok Login */ break;
case APPLE: /* Apple Sign-In (iOS only) */ break;
case UNKNOWN: /* restored from storage — no fresh login this session */ break;
}
}
Device info
val device = OEGAuth.getDeviceInfo()
val osId = device.osId // 1 = Android
val deviceId = device.deviceId // persistent device identifier
val sdkId = device.sdkId
val packageName = device.packageName
val gameVersion = device.gameVersion
val gameId = device.gameId
DeviceInfo device = OEGAuth.INSTANCE.getDeviceInfo();
int osId = device.getOsId(); // 1 = Android
String deviceId = device.getDeviceId(); // persistent device identifier
String sdkId = device.getSdkId();
String packageName = device.getPackageName();
String gameVersion = device.getGameVersion();
int gameId = device.getGameId();
Set Game Role
After the player enters the game and selects a server/character, call setGameRole() to provide role context for analytics tracking:
import vn.oeg.sdk.v2.core.auth.OEGAuthCore
OEGAuthCore.setGameRole(
serverId = "server_01",
serverName = "Server 1", // optional
roleId = "character_123",
roleName = "DragonSlayer", // optional
level = 50 // optional
)
import vn.oeg.sdk.v2.core.auth.OEGAuthCore;
// serverId, serverName (null = omit), roleId, roleName (null = omit), level (0 = default)
OEGAuthCore.INSTANCE.setGameRole("server_01", "Server 1", "character_123", "DragonSlayer", 50);
When to call:
- After successful login when the player enters the game
- When the player switches servers or characters
- After character creation
What it does:
- Enriches analytics events (especially
sdk_rechargeIAP events) with player context - Provides server and character information for tracking
- Automatically cleared on logout
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
serverId | String | Yes | Game server identifier |
serverName | String | No | Human-readable server name |
roleId | String | Yes | Character/role identifier |
roleName | String | No | Character/role display name |
level | Int | No | Character level |
Example with minimal data:
OEGAuthCore.setGameRole(
serverId = "s1",
roleId = "char_456"
)
OEGAuthCore.INSTANCE.setGameRole("s1", null, "char_456", null, 0);
Note: This data is stored in-memory only and is automatically cleared when the user logs out. If not set, analytics events will use fallback data from IAP flows when available.
Logout
OEGAuth.logout()
OEGAuth.INSTANCE.logout();
This clears the current auth session, social state, and game role data through the v2 auth stack.
An optional callback fires immediately after local state is cleared (before the fire-and-forget API call completes):
OEGAuth.logout { success ->
// success is always true — fires after local session is cleared
// Navigate to your game's login screen here if needed
}
OEGAuth.INSTANCE.logout(success -> {
// success is always true — fires after local session is cleared
return null;
});
Bắt sự kiện Logout tự động
Khác với iOS (dùng NotificationCenter), Android không phát broadcast khi logout xảy ra. Thay vào đó, SDK xử lý từng tình huống như sau:
| Nguyên nhân | SDK xử lý thế nào | Game cần làm gì |
|---|---|---|
| User bấm nút Đăng xuất trong Dashboard | SDK clear session, đóng Dashboard | Không cần — UI tự đóng |
| Session hết hạn / token lỗi (401) | SDK clear session, tự mở lại OEGLoginActivity | Không cần — SDK điều hướng tự động |
| Bảo trì kick out | SDK clear session, hiển thị popup bảo trì | Dùng onMaintenanceKickOut nếu cần lưu game state trước khi bị văng |
Nếu game dùng Option B (Direct API) và cần biết khi nào session hết hạn, hãy lắng nghe trạng thái đăng nhập sau khi OEGLoginActivity trả về:
// Kiểm tra sau khi SDK login screen đóng lại
val isLoggedIn = OEGAuth.currentUser != null
if (!isLoggedIn) {
// User đã bị logout — điều hướng về màn hình chính của game
}
Lưu ý: Nếu game dùng Option A (Drop-in UI) với
OegSdk.showLogin(), tất cả các luồng logout đều được SDK quản lý hoàn toàn — game không cần xử lý thêm.
Real-time Maintenance Guard
The V2 SDK automatically monitors the server maintenance schedule and handles it without any required integration on your side:
- Login Block: If maintenance is active, users are prevented from logging in and are shown an alert.
- In-Game Countdown: If a maintenance window approaches during an active gameplay session, a non-intrusive countdown banner overlays the screen.
- Automated Kick Out: When the countdown completes, the SDK safely logs the user out and displays the maintenance popup.
- Whitelist Bypass: If a user account is marked as a tester (whitelisted) in the Alogame CMS, the SDK will bypass all maintenance blocks completely for that account.
Advanced Maintenance Configuration
If you are using the core OEGAuth.Builder for a custom integration, you can optionally configure the polling interval or intercept the kick-out sequence:
OEGAuth.Builder(applicationContext)
// ... basic config ...
.maintainPollingInterval(60) // Polling interval in seconds (default 60, min 30, 0 disables polling)
.onMaintenanceKickOut { info ->
// Fired immediately before the maintenance popup is shown.
// Use this callback to save current game state.
}
.build()
new OEGAuth.Builder(getApplicationContext())
// ... basic config ...
.maintainPollingInterval(60) // Polling interval in seconds (default 60, min 30, 0 disables polling)
.onMaintenanceKickOut(info -> {
// Fired immediately before the maintenance popup is shown.
// Use this callback to save current game state.
})
.build();