- Last Updated
Device Registration
Understanding
Device registration is a security feature that allows game access only from mobile devices the user has designated, or restricts access at login by designating/managing specific PCs.
| Item | Mobile | PC |
|---|---|---|
| Eligible users | Registered members only (guest accounts not allowed) | Registered members only / provided only for domestic accounts (by sign-up country) |
| Device identification method | Identified by the mobile device's unique identifiers (UDID, ADID) | Install a PC device-info collection program (collects manufacturer, product name, serial number, then stores them encrypted) |
| Device registration limit | Up to 10 devices per account per game (default max 5; request a change from the technical contact) |
Fixed at up to 5 per account |
| Authentication method | Secondary email or phone possession verification | Identity verification |
| Handling on withdrawal | On game cancellation, that game's registered-device info is deleted automatically | On STOVE account withdrawal, registration info is deleted automatically (across the whole account) ※ Individual game cancellation does not affect the designated-PC setting |
Application Methods
For mobile, you can choose the enforcement level of device registration by per-game policy. The device-registration screen is provided as a platform-common UI.
For PC, it's provided as a platform default feature. (No separate integration work is needed.)
| Platform | Setting | Purpose | Behavior |
|---|---|---|---|
| Mobile | Required setting | Security first |
|
| Optional setting | Usability-focused |
|
|
| PC | Provided as platform default |
|
Request enforcement-level changes for the mobile environment from the technical contact
ㅁ It's configured in STOVE Partners.
ㅁ To operate it as optional, separately request the 'optional-use setting' work from the technical contact.
Integration Guide
Prerequisites
| Item | Details | Notes |
|---|---|---|
| Request device-registration setup | Request the required/optional setting method from the technical contact | STOVE Partners |
| Apply the Mobile SDK | The device-registration popup is provided by the SDK by default. SDK application is required | See the SDK installation guide |
| Check the User Access Token | The token obtained via the SDK after user login is needed | Real-time lookup required |
| Check the API Access Token | An API Access Token for server-to-server communication is needed. Request it from the publishing technical contact | Request from the technical contact |
Basic Integration Structure
The device-registration feature operates via the platform-common UI provided by the STOVE Mobile SDK. The CP company must implement the areas below.
Areas to implement
ㅁ Show the device-registration popup: show the registration popup to users on unregistered devices according to the setting (required/optional).
ㅁ Handle incomplete registration: if the user cancels registration, re-prompt registration with a guidance UI instead of logging out.
ㅁ Enter device management: place a device-management button on the settings screen and call the device-management feature.
ㅁ Server bypass-prevention validation: when validating the token, also check device-registration status to block unregistered/bypass access.
ㅁ Registration-based benefits (optional): look up device-registration status and use it for in-game benefits, etc.
For the device-registration popup/dialog wording, refer to the examples below.
| Type | Wording examples (popup/dialog copy) |
|---|---|
| Basic guidance type | "Device registration is a required step." "Please complete device registration for smooth gameplay." |
| Security-emphasis type | "Device registration is required to protect your account." "You can use the game after completing device registration." |
| User-setting-based guidance type | "Device registration is required per the device-registration setting." "To keep using the service, please complete device registration." |
Development
Mobile SDK
Both showing the device-registration popup and the in-game device-management UI are handled automatically by the Auth/AuthUI modules. The game client only needs to call two entry points (AuthUI.Login, AuthUI.ManageDevices) and handle the follow-up flow based on the user's response in the result callback.
Areas handled automatically by the MobileSDK vs areas the game implements
ㅁ SDK-automatic: when to show the device-registration screen and its UI, the possession-verification (email/phone) flow, and the registered-device list screen
ㅁ Game-implemented: placing the "device management/registration" button on the in-game settings screen, deciding whether to show it, branching on the result callback, and the follow-up flow when device registration is incomplete (canceled)
Prerequisites
- Modules: you must apply the
AuthandAuthUImodules. For SDK installation, see SDK Download and Installation and Development Environment Setup. - Precondition: after
Auth.Initializecompletes, you must be using theAuthUI.Loginflow. The device-registration screen is shown automatically insideAuthUI.Login. For the login flow, see the Sign-in Guide. - Permissions/settings: no separate device permissions are needed. The device-registration policy (required/optional,
device_setup_exemption) is set by the technical contact in the SDK Config. (See Integration Guide → Prerequisites above) - Dependencies: the integrated login UI (
AuthUI.Login) + an in-game settings screen (where the device management/registration button is placed)
Development Flow
These are the two entry points the MobileSDK handles automatically. The game only needs to handle when to call each entry point and how to branch on the result.
- On sign-up/login — shown automatically in
AuthUI.Login- The game calls
AuthUI.Login()(same as the usual login flow) - The SDK checks the user's device-registration status and, if needed, shows the device-registration screen automatically
- Required-setting policy + unregistered user → forced display
- Optional-setting policy → shown only when an account with a registration history accesses from an unregistered device
- When the user completes registration, the callback returns
result.IsSuccessful→ proceed with the usual post-login handling - If the user closes the screen without completing registration, the callback returns
result.IsCanceled→ handle the follow-up flow per game policy- Recommended: show a guidance UI, then call
AuthUI.Loginagain (recalling makes the SDK show the device-registration screen again) - Logging out is not recommended due to the risk of user churn
- Recommended: show a guidance UI, then call
- The game calls
- In-game — call
AuthUI.ManageDevices- Place a device management / device registration button in an appropriate location such as the in-game settings screen
- Decide whether to show the button using two values of
Auth.AccessToken.User(see the table below) - On button click, call
AuthUI.ManageDevices()→ the SDK shows the device registration/management screen automatically - Branch on the callback result using the
Auth.AccessToken.User.VerifiedDevicevaluetrue: registered device → keep the game runningfalse: unregistered device → follow-up flow per policy, such as moving to the initial screen and re-logging in
Whether to show the button — the decision order matters
- First check
deviceRegistrationPolicy(whether the device-registration policy is in use) - Only if it's
true, determine registration completion using theverifiedDevicevalue
| Device-registration status | deviceRegistrationPolicy | verifiedDevice | UI handling | Meaning |
|---|---|---|---|---|
| Registered | true | true | Show the device-management button | The currently connected device is registered |
| Unregistered | true | false | Show the device-registration button | The currently connected device is unregistered |
| Feature off | false | Always true | N/A | The device-registration setting is off. A request to the technical contact is needed |
Troubleshooting
| Situation | Cause | Handling approach |
|---|---|---|
The AuthUI.Login callback returns result.IsCanceled | The user closed the device-registration screen without completing registration | Recommended to show a guidance UI, then call AuthUI.Login again. Logging out is not recommended due to the risk of user churn. |
A 46217 response occurs during token validation | A code returned by the server's /token/verify response. It's judged as an unregistered device or bypass access | Have the client prompt re-login so the SDK device-registration flow runs again. For detailed server handling, see the Server section above or Integration Guide → Server: Device-registration bypass-prevention validation. |
Registration fails when calling AuthUI.ManageDevices | The account's registered devices exceed the policy limit (default 5 / up to 10 per game / fixed 5 for PC) | Guide the user to delete some devices from the existing list and re-register. Request per-game registration-limit changes from the technical contact. |
| Cannot decide which users should see the device-management button | Referencing only verifiedDevice without checking deviceRegistrationPolicy | Always check deviceRegistrationPolicy = true first, then decide the button label (manage/register) using verifiedDevice. |
AuthUI.Login fails due to a temporary network error | result.IsServerError or a network error (com.stove.base.network domain) | Show the SDK's standard error UI with OperationUI.HandleResult, and provide a retry flow after the user confirms. |
| The device-registration screen doesn't appear on a guest account | Mobile device registration is a registered-members-only feature (guest accounts not supported) | Don't show device-registration guidance to guest users at all. It's shown automatically after they become a registered member. |
Sample Code
Examples of call/callback handling for the two entry points AuthUI.Login and AuthUI.ManageDevices. Provided per platform.
AuthUI.Login— handling the automatic display of the device-registration screen
AuthUI.Login is the same as the usual login call. Just add a result.IsCanceled branch in the callback to handle the follow-up flow when device registration is incomplete.
For the full AuthUI.Login flow, see the Sign-in Guide
The example below excerpts only the parts needed for device-registration handling.
public void Login()
{
AuthUI.Login((Result result, AccessToken accessToken) =>
{
if (result.IsSuccessful)
{
/** Handle login success ... (omitted) **/
}
else if (result.IsCanceled)
{
/** Device-registration screen closed (registration incomplete) → handle per game policy **/
/** Recommended: show a guidance UI, then call Login() again → re-show the device-registration screen **/
}
else
{
/** Other error handling ... (omitted) **/
}
});
}
AuthUI.ManageDevices— called on in-game button click
Call it when the "device management/registration" button is clicked on the in-game settings screen, etc. After the call, branch the follow-up flow using the Auth.AccessToken.User.VerifiedDevice value.
public void ManageDevices()
{
if (Auth.AccessToken == null) return;
AuthUI.ManageDevices((Result result) =>
{
if (Auth.AccessToken.User.VerifiedDevice)
{
/** Registered device → keep the game running **/
}
else
{
/** Unregistered device → prompt device registration (e.g., move to the initial screen and retry login) **/
}
});
}
Server
This is the area that calls POST /auth-secure/v1.0/my-device/{game_id}/check to look up whether the user's device is registered and whether secondary authentication methods (secondary email verification, phone possession verification) are registered. Use it for branching in-game benefit grants, checking secondary authentication methods, etc.
This is a separate API from bypass-prevention validation
Blocking bypass access on unregistered-device environments is handled by the 46217 response of the token-validation API (POST /member/v3.0/{game_id}/token/verify). (See Integration Guide → Server: Device-registration bypass-prevention validation above)
Prerequisites
- API Access Token issuance must come first. Use it as
Bearer {API Access Token}in the Authorization header. See the Authentication menu → Server guide for the issuance procedure. - The structure must receive the User Access Token from the client with each request. Don't cache it on the game server.
Development Flow
- The client passes the User Access Token to the game server.
- The game server checks the remaining validity of the API Access Token it holds and renews it if needed.
- Call
POST /auth-secure/v1.0/my-device/{game_id}/check.- Path: fill
{game_id}with the Game ID. - Headers:
Authorization: Bearer {API Access Token},caller-id: {service_id}_SERVER,Content-Type: application/json - Body:
{ "access_token": "{User Access Token}" }
- Path: fill
- Branch based on the response
code.code == 0→ determine device-registration status withvalue.device_registered.true: registration complete → normal entry or in-game benefit grantfalse: unregistered → guide the client's device-registration flow (the Mobile SDK handles it automatically)
code != 0→ see the troubleshooting table
Troubleshooting
These are handling approaches per response code. For the detailed response-code and message spec, see the API & SDK Reference menu.
| Response code | Situation | Handling approach |
|---|---|---|
| 40000 | Missing/malformed Authorization header / invalid or expired User Access Token / request body error | Check the header format and body, then retry. If the User Access Token has expired, prompt the client to re-login. |
| 40101 | The API Access Token is invalid (wrong Authorization header value) | Reissue the API Access Token and retry. |
| 40103 | API Access Token or User Access Token expired | If the API Access Token expired, renew it and retry; if the User Access Token expired, prompt the client to re-login. |
| 41002 | The game_id in the call path differs from the service_id of the API Access Token you hold | Issue and manage the API Access Token separately per environment and game. |
| 50000 | Unknown error | It may be a temporary error, so retry; if it persists, inquire through the technical contact. |
Sample Code
An example of calling device-registration and authentication-info lookup (POST /auth-secure/v1.0/my-device/{game_id}/check).
Replace the Base URL to match the environment (Live/Sandbox)
In production, instead of hardcoding, we recommend separating it into an environment variable (e.g., STOVE_API_BASE_URL) or a framework config file and injecting it per environment.
// Java 25 LTS — java.net.http.HttpClient + Jackson(ObjectMapper)
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.Map;
ObjectMapper mapper = new ObjectMapper();
String baseUrl = "https://api.onstove.com";
String serviceId = "STOVE_GAME";
String callerId = serviceId + "_SERVER";
try (HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build()) {
String body = mapper.writeValueAsString(Map.of(
"access_token", userAccessToken));
HttpRequest req = HttpRequest.newBuilder(
URI.create(baseUrl + "/auth-secure/v1.0/my-device/" + serviceId + "/check"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + apiAccessToken)
.header("caller-id", callerId)
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
JsonNode data = mapper.readTree(res.body());
if (data.path("code").asInt() != 0) {
// See the troubleshooting table (40000 / 40101 / 40103 / 41002, etc.)
throw new IllegalStateException("device check failed: " + data.path("code"));
}
JsonNode value = data.path("value");
boolean deviceRegistered = value.path("device_registered").asBoolean();
if (deviceRegistered) {
// Device registration complete — normal entry / grant benefits
} else {
// Device unregistered — guide the client's device-registration flow
}
}