## Game > Gamebase > Unity Developer's Guide > Authentication
Gamebase supports Guest logins by default.
In many games, login is implemented on a title page.
The logic described in the above can be implemented in the following order.
Try login with the most recently logged-in IdP. If a token is expired or its authentication fails, return failure. Note that a login for the IdP should be implemented.
keyname | a use | Value Type |
---|---|---|
GamebaseAuthProviderCredential.SHOW_LOADING_ANIMATION | Display the loading animation until the end of the API call Only for Android |
bool default: true |
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID
static void LoginForLastLoggedInProvider(GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
static void LoginForLastLoggedInProvider(Dictionary<string, object> additionalInfo, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
Example
public void LoginForLastLoggedInProvider()
{
Gamebase.LoginForLastLoggedInProvider((authToken, error) =>
{
if (Gamebase.IsSuccess(error))
{
Debug.Log("Login succeeded.");
}
else
{
// Check the error code and handle the error appropriately.
Debug.Log(string.Format("Login failed. error is {0}", error));
if (error.code == (int)GamebaseErrorCode.SOCKET_ERROR || error.code == (int)GamebaseErrorCode.SOCKET_RESPONSE_TIMEOUT)
{
Debug.Log(string.Format("Retry LoginForLastLoggedInProvider or notify an error message to the user.: {0}", error.message));
}
else if (error.code == GamebaseErrorCode.BANNED_MEMBER)
{
GamebaseResponse.Auth.BanInfo banInfo = GamebaseResponse.Auth.BanInfo.From(error);
if (banInfo != null)
{
}
}
else
{
Debug.Log("Try to login using a specifec IdP");
Gamebase.Login("ProviderName", (authToken, error) => {});
}
}
});
}
Gamebase supports Guest logins.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID ■ UNITY_STANDALONE ■ UNITY_WEBGL ■ UNITY_EDITOR
static void Login(string providerName, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
Example
public void Login()
{
Gamebase.Login(GamebaseAuthProvider.GUEST, (authToken, error) =>
{
if (Gamebase.IsSuccess(error))
{
string userId = authToken.member.userId;
Debug.Log(string.Format("Login succeeded. Gamebase userId is {0}", userId));
}
else
{
// Check the error code and handle the error appropriately.
Debug.Log(string.Format("Login failed. error is {0}", error));
if (error.code == (int)GamebaseErrorCode.SOCKET_ERROR || error.code == (int)GamebaseErrorCode.SOCKET_RESPONSE_TIMEOUT)
{
Debug.Log(string.Format("Retry Login or notify an error message to the user.: {0}", error.message));
}
else if (error.code == GamebaseErrorCode.BANNED_MEMBER)
{
GamebaseResponse.Auth.BanInfo banInfo = GamebaseResponse.Auth.BanInfo.From(error);
if (banInfo != null)
{
}
}
}
});
}
Following is a login example with a specific IdP. For more information on IdP types that can be used to log in, refer to the GamebaseAuthProvider class.
[Notes]
Some IdPs require additional information when logging in. The static void Login(string providerName, Dictionary additionalInfo, and GamebaseCallback.GamebaseDelegate callback) APIs are provided to configure these additional information. Enter the required information into the additionalInfo parameter in the form of the dictionary.
If additionalInfo has a value, use that value. If null, use the value registered in NHN Cloud Console.
[Note]
LINE IdP allows users to set LINE service regions from Gamebase SDK 2.43.0. The regions can be set in AdditionalInfo.
[Caution]
In Standalone, login is supported through WebViewAdapter. It does not block events entered via UI when WebView is open.
To log in using Standalone WebViewAdapter, the CallbackURL below must be configured on the IdP Developer website. - https://id-gamebase.toast.com/oauth/callback
keyname | a use | Value Type |
---|---|---|
GamebaseAuthProviderCredential.SHOW_LOADING_ANIMATION | Display the loading animation until the end of the API call Only for Android |
bool default: true |
GamebaseAuthProviderCredential.LINE_CHANNEL_REGION | Set LINE Service Region | "japan" "thailand" "taiwan" "indonesia" |
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID ■ UNITY_STANDALONE
static void Login(string providerName, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
static void Login(string providerName, Dictionary<string, object> additionalInfo, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
Example
public void Login()
{
Gamebase.Login(GamebaseAuthProvider.FACEBOOK, (authToken, error) =>
{
if (Gamebase.IsSuccess(error))
{
string userId = authToken.member.userId;
Debug.Log(string.Format("Login succeeded. Gamebase userId is {0}", userId));
}
else
{
// Check the error code and handle the error appropriately.
Debug.Log(string.Format("Login failed. error is {0}", error));
if (error.code == (int)GamebaseErrorCode.SOCKET_ERROR || error.code == (int)GamebaseErrorCode.SOCKET_RESPONSE_TIMEOUT)
{
Debug.Log(string.Format("Retry Login or notify an error message to the user.: {0}", error.message));
}
else if (error.code == GamebaseErrorCode.BANNED_MEMBER)
{
GamebaseResponse.Auth.BanInfo banInfo = GamebaseResponse.Auth.BanInfo.From(error);
if (banInfo != null)
{
}
}
}
});
}
public void LoginWithAdditionalInfo()
{
var additionalInfo = new Dictionary<string, object>
{
{ "key", "value" }
};
Gamebase.Login(GamebaseAuthProvider.FACEBOOK, additionalInfo, (authToken, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
string userId = authToken.member.userId;
Debug.Log(string.Format("Login succeeded. Gamebase userId is {0}", userId));
}
else
{
// Check the error code and handle the error appropriately.
Debug.Log(string.Format("Login failed. error is {0}", error));
if (error.code == (int)GamebaseErrorCode.SOCKET_ERROR || error.code == (int)GamebaseErrorCode.SOCKET_RESPONSE_TIMEOUT)
{
Debug.Log(string.Format("Retry Login or notify an error message to the user.: {0}", error.message));
}
else if (error.code == GamebaseErrorCode.BANNED_MEMBER)
{
GamebaseResponse.Auth.BanInfo banInfo = GamebaseResponse.Auth.BanInfo.From(error);
if (banInfo != null)
{
}
}
}
});
}
This game interface allows authentication to be made with SDK provided by IdP, before login to Gamebase with provided access token.
[Caution]
If you are logging into Google on standalone and WebGL platforms, you must enter GamebaseAuthProviderCredential.REDIRECT_URI. If not entered,
redirect_uri_mismatch
error occurs.For REDIRECT_URI, enter a value added to the approved redirection URI from Google Cloud Console > API & Services > Credentials > Web Client (URI to get AuthCode from Google sign-in page)
If REDIRECT_URI not entered, the default value is applied. - Standalone: http://localhost:8080/ - WebGL: http://localhost/
Keyname | Usage | Value Type |
---|---|---|
GamebaseAuthProviderCredential.PROVIDER_NAME | Set IdP type | GamebaseAuthProvider.GOOGLE GamebaseAuthProvider.GPGS_V2 GamebaseAuthProvider.GAMECENTER GamebaseAuthProvider.FACEBOOK GamebaseAuthProvider.NAVER GamebaseAuthProvider.TWITTER GamebaseAuthProvider.LINE GamebaseAuthProvider.HANGAME GamebaseAuthProvider.APPLEID GamebaseAuthProvider.WEIBO GamebaseAuthProvider.KAKAOGAME GamebaseAuthProvider.PAYCO |
GamebaseAuthProviderCredential.ACCESS_TOKEN | Set authentication information (access token) received after login IdP. Not applied for Google authentication. |
|
GamebaseAuthProviderCredential.AUTHORIZATION_CODE | Enter One Time Authorization Code (OTAC) which can be obtained after Google login. | |
GamebaseAuthProviderCredential.GAMEBASE_ACCESS_TOKEN | Used when logging in with Gamebase Access Token instead of IdP authentication information | |
GamebaseAuthProviderCredential.IGNORE_ALREADY_LOGGED_IN | While logged in to Gamebase, allow login attempts with other account without logging out | bool |
GamebaseAuthProviderCredential.SHOW_LOADING_ANIMATION | Display the loading animation until the end of the API call Only for Android |
bool default: true |
GamebaseAuthProviderCredential.LINE_CHANNEL_REGION | Set LINE Service Region | See Login with IdP |
GamebaseAuthProviderCredential.REDIRECT_URI | Add the redirect_uri registered in Google Cloud Console > Authorized Redirect URI Standalone default: http://localhost:8080/ WebGL default: http://localhost/ Limited to Google sign-in on standalone and WebGL platforms |
[Note]
May require when original functions of external services (such as Facebook) are in need within a game.
[Caution]
Development items external SDK requires to support need to be implemented by using external SDK's API, which Gamebase does not support.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID ■ UNITY_STANDALONE ■ UNITY_WEBGL ■ UNITY_EDITOR
UnityEditor supports Facebook login only.
static void Login(Dictionary<string, object> credentialInfo, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
Example
public void LoginWithCredential()
{
var credentialInfo = new Dictionary<string, object>();
// facebook
credentialInfo.Add(GamebaseAuthProviderCredential.PROVIDER_NAME, GamebaseAuthProvider.FACEBOOK);
credentialInfo.Add(GamebaseAuthProviderCredential.ACCESS_TOKEN, "facebook access token");
// google
// credentialInfo.Add(GamebaseAuthProviderCredential.PROVIDER_NAME, GamebaseAuthProvider.GOOGLE);
// credentialInfo.Add(GamebaseAuthProviderCredential.AUTHORIZATION_CODE, "google auchorization code");
Gamebase.Login(credentialInfo, (authToken, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
string userId = authToken.member.userId;
Debug.Log(string.Format("Login succeeded. Gamebase userId is {0}", userId));
}
else
{
// Check the error code and handle the error appropriately.
Debug.Log(string.Format("Login failed. error is {0}", error));
if (error.code == (int)GamebaseErrorCode.SOCKET_ERROR || error.code == (int)GamebaseErrorCode.SOCKET_RESPONSE_TIMEOUT)
{
Debug.Log(string.Format("Retry Login or notify an error message to the user.: {0}", error.message));
}
else if (error.code == GamebaseErrorCode.BANNED_MEMBER)
{
GamebaseResponse.Auth.BanInfo banInfo = GamebaseResponse.Auth.BanInfo.From(error);
if (banInfo != null)
{
}
}
}
});
}
Try to log out from logged-in IdP. In many cases, the logout button is located on the game configuration screen.
Even if a logout is successful, a game user's data remain.
When it is successful, as authentication records with a corresponding IdP are removed, ID and passwords will be required for the next log-in process.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID ■ UNITY_STANDALONE ■ UNITY_WEBGL ■ UNITY_EDITOR
static void Logout(GamebaseCallback.ErrorDelegate callback)
Example
public void Logout()
{
Gamebase.Logout((error) =>
{
if (Gamebase.IsSuccess(error))
{
Debug.Log("Logout succeeded.");
}
else
{
Debug.Log(string.Format("Logout failed. error is {0}", error));
}
});
}
Attempts account withdrawal while logged in.
[Caution]
If multiple IdPs are linked, all IdP linkages will be unlinked and the user data in Gamebase will be deleted.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID ■ UNITY_STANDALONE ■ UNITY_WEBGL ■ UNITY_EDITOR
static void Withdraw(GamebaseCallback.ErrorDelegate callback)
Example
public void Withdraw()
{
Gamebase.Withdraw((error) =>
{
if (Gamebase.IsSuccess(error))
{
Debug.Log("Withdraw succeeded.");
}
else
{
Debug.Log(string.Format("Withdraw failed. error is {0}", error));
}
});
}
Mapping refers to connecting or disconnecting an existing login account to/from another IdP account.
In many games, one account may have many integrated (mapped) IdPs.
By using Gamebase Mapping API, other IdP accounts can be integrated or removed to/from another existing IdP account.
As such, one Gamebase UserID can be integrated with many IdP accounts.
In short, a login to a mapped IdP account will be made available with a same user ID at all times.
Note, however, that each IdP can have only one account to map.
Below shows an example.
Mapping API includes Add Mapping API and Remove Mapping API.
Implement mapping in the following order.
Mapping means to add an IdP account integration to a current account, so login is a prerequisite. First, call a login API and log in.
Call Gamebase.AddMapping() to try mapping.
Try mapping to another IdP while logged-in to a specific IdP.
If an IdP account to map has already been integrated to another account,
return the AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER (3302) error.
Even if a mapping is successful, 'currently logged-in IdP' does not change. For example, after a user logs in a Google account and has successfully mapped with a Facebook account, the user's 'currently logged-in IdP' does not change from Google to Facebook. It still stays with Google account. Mapping simply adds IdP integration.
keyname | a use | Value Type |
---|---|---|
GamebaseAuthProviderCredential.SHOW_LOADING_ANIMATION | Display the loading animation until the end of the API call Only for Android Only for Android |
bool default: true |
GamebaseAuthProviderCredential.LINE_CHANNEL_REGION | Set LINE service region | See Login with IdP |
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID
static void AddMapping(string providerName, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
Example
public void AddMapping(string providerName)
{
Gamebase.AddMapping(providerName, (authToken, error) =>
{
if (Gamebase.IsSuccess(error))
{
Debug.Log("AddMapping succeeded.");
}
else
{
Debug.Log(string.Format("AddMapping failed. error is {0}", error));
}
});
}
This game interface allows authentication to be made with SDK provided by IdP, before applying Gamebase AddMapping with provided access token.
keyname | Usage | Value Type |
---|---|---|
GamebaseAuthProviderCredential.PROVIDER_NAME | Set IdP type | google, gpgs_v2, facebook, payco, iosgamecenter, naver, twitter, line, appleid |
GamebaseAuthProviderCredential.ACCESS_TOKEN | Set authentication information (access token) received after login IdP | |
GamebaseAuthProviderCredential.AUTHORIZATION_CODE | Enter One Time Authorization Code (OTAC) which can be obtained after Google login. | |
GamebaseAuthProviderCredential.SHOW_LOADING_ANIMATION | Display the loading animation until the end of the API call Only for Android |
bool default: true |
GamebaseAuthProviderCredential.LINE_CHANNEL_REGION | Set LINE service region | See Login with IdP |
[Note]
May require when original functions of external services (such as Facebook) are in need within a game.
[Caution]
Development items external SDK requires to support need to be implemented by using external SDK's API, which Gamebase does not support.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID
static void AddMapping(Dictionary<string, object> credentialInfo, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
Example
public void AddMappingWithCredential()
{
var credentialInfo = new Dictionary<string, object>();
// facebook
credentialInfo.Add(GamebaseAuthProviderCredential.PROVIDER_NAME, GamebaseAuthProvider.FACEBOOK);
credentialInfo.Add(GamebaseAuthProviderCredential.ACCESS_TOKEN, "facebook access token");
// google
// credentialInfo.Add(GamebaseAuthProviderCredential.PROVIDER_NAME, GamebaseAuthProvider.GOOGLE);
// credentialInfo.Add(GamebaseAuthProviderCredential.AUTHORIZATION_CODE, "google auchorization code");
Gamebase.AddMapping(credentialInfo, (authToken, error) =>
{
if (Gamebase.IsSuccess(error))
{
Debug.Log("AddMapping succeeded.");
}
else
{
Debug.Log(string.Format("AddMapping failed. error is {0}", error));
}
});
}
If there is any account mapped to a specific IdP, try force mapping.
When you try force mapping, you need ForcingMappingTicket
obtained from the AddMapping API.
The following is an example of force mapping to Facebook:
API
static void AddMappingForcibly(GamebaseResponse.Auth.ForcingMappingTicket forcingMappingTicket, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
// Legacy API
static void AddMappingForcibly(string providerName, string forcingMappingKey, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
static void AddMappingForcibly(string providerName, string forcingMappingKey, Dictionary<string, object> additionalInfo, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
static void AddMappingForcibly(Dictionary<string, object> credentialInfo, string forcingMappingKey, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
Example
public void AddMappingForcibly(string idPName)
{
Gamebase.AddMapping(idPName, (authToken, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
// Successfully added mapping
}
else
{
// First, call the AddMapping API to try mapping to an already linked account and get ForcingMappingTicket as follows.
if (error.code.Equals(GamebaseErrorCode.AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER) == true)
{
// Gets the ForcingMappingTicket instance using the From() method of the ForcingMappingTicket class.
GamebaseResponse.Auth.ForcingMappingTicket forcingMappingTicket = GamebaseResponse.Auth.ForcingMappingTicket.From(error);
// Try force mapping.
Gamebase.AddMappingForcibly(forcingMappingTicket, (authTokenForcibly, errorForcibly) =>
{
if (Gamebase.IsSuccess(error) == true)
{
// Successfully added force mapping
}
else
{
// Failed to add force mapping
// Check the error code and resolve the error.
}
});
}
else
{
// Check the error code and resolve the error.
}
}
});
}
When there is an account already mapped to a specific IdP, log out from the current account and log in with the account already mapped to the IdP.
At this time, you need the ForcingMappingTicket
obtained from the AddMapping API.
If the Change Login API call fails, the Gamebase login status remains as the existing UserID.
API
static void ChangeLogin(GamebaseResponse.Auth.ForcingMappingTicket forcingMappingTicket, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
Example
The following example shows a situation where, after attempting to map to Facebook, an account already mapped to Facebook is found and the login is changed to the account.
public void ChangeLoginWithFacebook()
{
Gamebase.AddMapping(GamebaseAuthProvider.FACEBOOK, (authToken, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
// Successfully added mapping
return;
}
// First, call the addMapping API to try mapping to an already linked account and get ForcingMappingTicket as follows.
if (error.code.Equals(GamebaseErrorCode.AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER) == true)
{
// Use the from() method of the ForcingMappingTicket class to obtain the ForcingMappingTicket instance.
GamebaseResponse.Auth.ForcingMappingTicket forcingMappingTicket = GamebaseResponse.Auth.ForcingMappingTicket.From(error);
// Log in with the UserID of ForcingMappingTicket
Gamebase.ChangeLogin(forcingMappingTicket, (authTokenForcibly, errorForcibly) =>
{
if (Gamebase.IsSuccess(errorForcibly) == true)
{
// Successfully changed login
}
else
{
// Failed to change login
// Check the error code and resolve the error.
}
});
}
else
{
// Add Mapping Failed.
// Check the error code and resolve the error.
}
});
}
Remove mapping with a specific IdP. If IdP mapping is not removed, error will occur. After mapping is removed, Gamebase processes logout of the IdP.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID
static void RemoveMapping(string providerName, GamebaseCallback.ErrorDelegate callback)
Example
public void RemoveMapping(string providerName)
{
Gamebase.RemoveMapping(providerName, (error) =>
{
if (Gamebase.IsSuccess(error))
{
Debug.Log("RemoveMapping succeeded.");
}
else
{
Debug.Log(string.Format("RemoveMapping failed. error is {0}", error));
}
});
}
Return the list of IdPs mapped to user IDs.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID
static List<string> GetAuthMappingList()
Example
public void GetAuthMappingList()
{
List<string> mappingList = Gamebase.GetAuthMappingList();
}
Process authentication with Gamebase, in order to get information required to create an app.
Process authentication with Gamebase, in order to get information required to create an app.
Get User ID issued by Gamebase. API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID ■ UNITY_STANDALONE ■ UNITY_WEBGL ■ UNITY_EDITOR
static string GetUserID()
Example
public void GetUserID()
{
string userID = Gamebase.GetUserID();
}
Get AccessToken issued by Gamebase.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID ■ UNITY_STANDALONE ■ UNITY_WEBGL ■ UNITY_EDITOR
static string GetAccessToken()
Example
public void GetAccessToken()
{
string accessToken = Gamebase.GetAccessToken();
}
Get the last logged-in Provider Name in Gamebase.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID
static string GetLastLoggedInProvider()
Example
public void GetLastLoggedInProvider()
{
string lastLoggedInProvider = Gamebase.GetLastLoggedInProvider();
}
[Caution]
- For security reasons, it is recommended that you call the authentication information of an external IdP from the game server.
- Access token may expire relatively sooner depending on the IdP.
- For example, the access token of Google will expire within 2 hours from the time of login.
- If you need user information, it is recommended that you call the Gamebase Server API immediately after login.
- When logged in with the "Gamebase.LoginForLastLoggedInProvider()” API, the authentication info cannot be retrieved.
- If you need the user info, instead of "Gamebase.LoginForLastLoggedInProvider()” , use the {IDP_CODE} identical to the IDPCode that you want to use as the parameter to log in as the "Gamebase.Login(IDP_CODE, callback)" API.
Get Access Token from externally authentication SDK.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID ■ UNITY_STANDALONE ■ UNITY_WEBGL ■ UNITY_EDITOR
static string GetAuthProviderAccessToken(string providerName)
Example
public void GetAuthProviderAccessToken(string providerName)
{
string authProviderAccessToken = Gamebase.GetAuthProviderAccessToken(providerName);
}
Get Profile from externally authenticated SDK.
API
Supported Platforms ■ UNITY_IOS ■ UNITY_ANDROID ■ UNITY_STANDALONE ■ UNITY_WEBGL ■ UNITY_EDITOR
static GamebaseResponse.Auth.AuthProviderProfile GetAuthProviderProfile(string providerName)
Example
public void GetAuthProviderProfile(string providerName)
{
GamebaseRequest.AuthProviderProfile profile = Gamebase.GetAuthProviderProfile(providerName);
}
If a user is registered while being banned in Gamebase Console, the user will see the following usage restriction code when attempting to log in to the game. The GamebaseResponse.Auth.BanInfo.from(GamebaseError error) method can be used to check the ban information.
Issues a key to transfer the guest account to another device.
This key is called TransferAccountInfo. The issued TransferAccountInfo calls the requestTransferAccount API from another device to transfer the account.
[Caution]
The TransferAccountInfo key can be issued while the guest account is logged in. Transfer of guest account using TransferAccountInfo is allowed only when logged in to a guest account or not logged in. If the logged-in guest account has already been mapped to an IdP (Google, Facebook, PAYCO, etc.) account, account transfer is not supported.
Issues TransferAccountInfo to transfer the guest account.
API
static void IssueTransferAccount(GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.TransferAccountInfo> callback)
Example
public void IssueTransferAccount()
{
Gamebase.IssueTransferAccount((transfer, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
// Issuing TransferAccount success.
}
else
{
// Issuing TransferAccount failed.
}
});
}
Queries the TransferAccountInfo information issued for guest account transfer to the Gamebase server.
API
static void QueryTransferAccount(GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.TransferAccountInfo> callback)
Example
public void QueryTransferAccount()
{
Gamebase.QueryTransferAccount((transfer, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
// Querying TransferAccount success.
}
else
{
// Querying TransferAccount failed.
}
});
}
Renews the issued TransferAccountInfo information. There are two types of renewal: Auto Renew and Manual Renew. You can select either Renew Password Only or Renew Both ID and Password to renew the TransferAccountInfo information.
static void RenewTransferAccount(GamebaseRequest.Auth.TransferAccountRenewConfiguration configuration, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.TransferAccountInfo> callback)
Example
public void RenewTransferAccountManualIdPassword(string accountId, string accountPassword)
{
// Manual Setting
GamebaseRequest.Auth.TransferAccountRenewConfiguration configuration = GamebaseRequest.Auth.TransferAccountRenewConfiguration.MakeManualRenewConfiguration(accountId, accountPassword); // ID + Password
GamebaseRequest.Auth.TransferAccountRenewConfiguration configuration = GamebaseRequest.Auth.TransferAccountRenewConfiguration.MakeManualRenewConfiguration(accountPassword); // Password
// Auto Setting
GamebaseRequest.Auth.TransferAccountRenewConfiguration configuration = GamebaseRequest.Auth.TransferAccountRenewConfiguration.MakeAutoRenewConfiguration(type);
Gamebase.RenewTransferAccount(configuration, (transfer, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
// Renewing TransferAccount success.
}
else
{
// Renewing TransferAccount failed.
}
});
}
Transfers the account with TransferAccount issued with issueTransfer API. When account transfer is successful, a transfer completion message will be displayed from the device where TransferAccount has been issued and a new account will be created when a guest logs in. On the device where the account transfer was successfully made, the guest account from the previous device where TransferAccount was issued can still be used.
[Caution]
If account transfer is made while logged in to the guest account, the guest account will be lost. * If incorrect id/password is attempted multiple times, an AUTH_TRANSFERACCOUNT_BLOCK(3042) error occurs and the account migration is blocked for a certain period of time. In this case, you can inform the user how long the account migration will be banned through the TransferAccountFailInfo value as shown below.
API
static void TransferAccountWithIdPLogin(string accountId, string accountPassword, GamebaseCallback.GamebaseDelegate<GamebaseResponse.Auth.AuthToken> callback)
Example
public void TransferAccountWithIdPLogin(string accountId, string accountPassword)
{
Gamebase.TransferAccountWithIdPLogin(accountId, accountPassword, (authToken, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
// Transfering Account success.
// TODO: implements post login process
}
else
{
// Check the error code and handle the error appropriately.
if (error.code == GamebaseErrorCode.AUTH_TRANSFERACCOUNT_BLOCK)
{
GamebaseResponse.Auth.TransferAccountFailInfo transferAccountFailInfo = GamebaseResponse.Auth.TransferAccountFailInfo.From(error);
if (transferAccountFailInfo != null)
{
// Transfering Account failed by entering the wrong id / pw multiple times.
// You can tell when the account transfer is blocked by the TransferAccountFailInfo.
string failId = transferAccountFailInfo.id;
int failCount = transferAccountFailInfo.failCount;
DateTime dateTime = new DateTime(transferAccountFailInfo.blockEndDate);
}
}
}
});
}
This is a 'pending withdrawal" feature. By requesting a temporary withdrawal, the account is not immediately withdrawn. Instead, it is withdrawn after a specific grace period. The grace period can be changed in the console.
'Caution'
Do not use Gamebase.Withdraw() API if you're using the Pending Withdrawal feature. The Gamebase.Withdraw() API immediately withdraws accounts when used.
If login is successful, AuthToken.member.temporaryWithdrawal can be used to determine if the user is in the status of pending withdrawal.
Requests a temporary withdrawal. The account is automatically withdrawn after a specific grace period set in the console.
API
public static void RequestWithdrawal(GamebaseCallback.GamebaseDelegate<GamebaseResponse.TemporaryWithdrawalInfo> callback)
Example
public void SampleRequestWithdrawal()
{
Gamebase.TemporaryWithdrawal.RequestWithdrawal((data, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
long gracePeriodDate = data.gracePeriodDate;
Debug.Log(string.Format("RequestWithdrawal succeeded. The date when you can withdraw your withdrawal is {0}", gracePeriodDate));
}
else
{
Debug.Log(string.Format("RequestWithdrawal failed. error:{0}", error));
}
});
}
For games using the Pending Withdrawal feature must notify its users that they are in grace period if AuthToken.member.temporaryWithdrawal is not null after login.
Example
public void LoginSample()
{
Gamebase.Login(GamebaseAuthProvider.XXX, (authToken, error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
if(authToken.member.temporaryWithdrawal != null)
{
long gracePeriodDate = authToken.member.temporaryWithdrawal.gracePeriodDate;
Debug.Log(string.Format("User is under temporary withdrawa. GracePeriodDate: {0}", error));
}
else
{
string userId = authToken.member.userId;
Debug.Log(string.Format("Login succeeded. Gamebase userId is {0}", userId));
}
}
else
{
// Check the error code and handle the error appropriately.
Debug.Log(string.Format("Login failed. error is {0}", error));
}
});
}
Cancels a withdrawal request. If the grace period is over and the withdrawal process is completed, it cannot be undone.
API
static void CancelWithdrawal(GamebaseCallback.ErrorDelegate callback)
Example
public void SampleCancelWithdrawal()
{
Gamebase.TemporaryWithdrawal.CancelWithdrawal((error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
Debug.Log("CancelWithdrawal succeeded.");
}
else
{
Debug.Log(string.Format("CancelWithdrawal failed. error:{0}", error));
}
});
}
Immediately withdraws the account, ignoring the grace period. The internal mechanics are the same as the Gamebase.Withdraw() API.
Instant withdrawal cannot be undone, so it is important to ask the user several times if they really want to execute the command.
API
static void WithdrawImmediately(GamebaseCallback.ErrorDelegate callback)
Example
public void SampleWithdrawImmediately()
{
Gamebase.TemporaryWithdrawal.WithdrawImmediately((error) =>
{
if (Gamebase.IsSuccess(error) == true)
{
Debug.Log("WithdrawImmediately succeeded.");
}
else
{
Debug.Log(string.Format("SampleWithdrawImmediately failed. error:{0}", error));
}
});
}
Example
public void Login()
{
Gamebase.Login(GamebaseAuthProvider.GUEST, (authToken, error) =>
{
if (Gamebase.IsSuccess(error) == false)
{
// Login failed
return;
}
// Check if user is under grace ban
GamebaseResponse.Common.Member.GraceBanInfo graceBanInfo = authToken.member.graceBan;
if (graceBanInfo != null)
{
string periodDate = string.Format("{0:yyyy/MM/dd HH:mm:ss}",
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(graceBanInfo.gracePeriodDate));
string message = graceBanInfo.message;
GamebaseResponse.Common.Member.GraceBanInfo.ReleaseRuleCondition releaseRuleCondition = graceBanInfo.releaseRuleCondition;
if (releaseRuleCondition != null)
{
// condition type: "AND", "OR"
string releaseRule = string.Format("{0}{1} {2} {3}time(s)", releaseRuleCondition.amount,
releaseRuleCondition.currency, releaseRuleCondition.conditionType, releaseRuleCondition.count);
}
GamebaseResponse.Common.Member.GraceBanInfo.PaymentStatus paymentStatus = graceBanInfo.paymentStatus;
if (paymentStatus != null) {
String paidAmount = paymentStatus.amount + paymentStatus.currency;
String paidCount = paymentStatus.count + "time(s)";
}
// Guide the user through the UI how to finish the grace ban status.
}
else
{
// Login success.
}
});
}
Category | Error | Error Code | Description |
---|---|---|---|
Auth | INVALID_MEMBER | 6 | Request for invalid member. |
BANNED_MEMBER | 7 | Named member has been banned. | |
AUTH_USER_CANCELED | 3001 | Login is cancelled. | |
AUTH_NOT_SUPPORTED_PROVIDER | 3002 | The authentication is not supported. | |
AUTH_NOT_EXIST_MEMBER | 3003 | Named member does not exist or has withdrawn. | |
AUTH_EXTERNAL_LIBRARY_INITIALIZATION_ERROR | 3006 | Failed to initialize the external authentication library. | |
AUTH_EXTERNAL_LIBRARY_ERROR | 3009 | Error in external authentication library. Check the error details. |
|
AUTH_ALREADY_IN_PROGRESS_ERROR | 3010 | Previous authentication process is not complete. | |
AUTH_INVALID_GAMEBASE_TOKEN | 3011 | You have been logged out due to an invalid Gamebase Access Token. Please try logging in again. |
|
TransferAccount | SAME_REQUESTOR | 8 | The issued TransferKey has been used on the same device. |
NOT_GUEST_OR_HAS_OTHERS | 9 | You have tried transferring with a non-guest account or the account is linked with a non-guest IdP. | |
AUTH_TRANSFERACCOUNT_EXPIRED | 3041 | The date of TransferAccount has expired. | |
AUTH_TRANSFERACCOUNT_BLOCK | 3042 | You have entered a wrong TransferAccount several times, so the account transfer function has been locked. | |
AUTH_TRANSFERACCOUNT_INVALID_ID | 3043 | Invalid TransferAccount ID. | |
AUTH_TRANSFERACCOUNT_INVALID_PASSWORD | 3044 | Invalid TransferAccount Password. | |
AUTH_TRANSFERACCOUNT_CONSOLE_NO_CONDITION | 3045 | TransferAccount has not been set. Please set it on the NHN Cloud Gamebase console first. |
|
AUTH_TRANSFERACCOUNT_NOT_EXIST | 3046 | TransferAccount does not exist. Please issue TransferAccount first. | |
AUTH_TRANSFERACCOUNT_ALREADY_EXIST_ID | 3047 | TransferAccount exists. | |
AUTH_TRANSFERACCOUNT_ALREADY_USED | 3048 | TransferAccount has already been used. | |
Auth (Login) | AUTH_TOKEN_LOGIN_FAILED | 3101 | Token login has failed. |
AUTH_TOKEN_LOGIN_INVALID_TOKEN_INFO | 3102 | Invalid token information | |
AUTH_TOKEN_LOGIN_INVALID_LAST_LOGGED_IN_IDP | 3103 | Invalid last login IDP information | |
IdP Login | AUTH_IDP_LOGIN_FAILED | 3201 | IDP login has failed. |
AUTH_IDP_LOGIN_INVALID_IDP_INFO | 3202 | Invalid IDP information (IDP information does not exist in the Console.) | |
Add Mapping | AUTH_ADD_MAPPING_FAILED | 3301 | Add mapping has failed. |
AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER | 3302 | Already mapped to another member. | |
AUTH_ADD_MAPPING_ALREADY_HAS_SAME_IDP | 3303 | Already mapped to same IDP. | |
AUTH_ADD_MAPPING_INVALID_IDP_INFO | 3304 | Invalid IDP information (IDP information does not exist in the Console.) | |
AUTH_ADD_MAPPING_CANNOT_ADD_GUEST_IDP | 3305 | AddMapping is not available with Guest IdP. | |
Add Mapping Forcibly | AUTH_ADD_MAPPING_FORCIBLY_NOT_EXIST_KEY | 3311 | The force mapping key (ForcingMappingKey) has not been found. Please check ForcingMappingTicket again. |
AUTH_ADD_MAPPING_FORCIBLY_ALREADY_USED_KEY | 3312 | The force mapping key (ForcingMappingKey) has already been used. | |
AUTH_ADD_MAPPING_FORCIBLY_EXPIRED_KEY | 3313 | The date of force mapping key (ForcingMappingKey) has expired. | |
AUTH_ADD_MAPPING_FORCIBLY_DIFFERENT_IDP | 3314 | The force mapping key (ForcingMappingKey) has been used for a different IdP. The issued ForcingMappingKey is used for trying to force map to the same IdP. |
|
AUTH_ADD_MAPPING_FORCIBLY_DIFFERENT_AUTHKEY | 3315 | The force mapping key (ForcingMappingKey) has been used for a different account. The issued ForcingMappingKey is used for trying to force map to the same IdP and account. |
|
Remove Mapping | AUTH_REMOVE_MAPPING_FAILED | 3401 | Remove mapping has failed. |
AUTH_REMOVE_MAPPING_LAST_MAPPED_IDP | 3402 | Cannot delete last mapped IDP. | |
AUTH_REMOVE_MAPPING_LOGGED_IN_IDP | 3403 | Currently logged-in IDP | |
Logout | AUTH_LOGOUT_FAILED | 3501 | Logout has failed. |
Withdrawal | AUTH_WITHDRAW_FAILED | 3601 | Withdrawal has failed. |
AUTH_WITHDRAW_ALREADY_TEMPORARY_WITHDRAW | 3602 | The user is already in the status of temporary withdrawal. | |
AUTH_WITHDRAW_NOT_TEMPORARY_WITHDRAW | 3603 | The user is not in the status of temporary withdrawal. | |
Not Playable | AUTH_NOT_PLAYABLE | 3701 | Not playable (due to maintenance or service closed) |
Auth(Unknown) | AUTH_UNKNOWN_ERROR | 3999 | Unknown error (Undefined error) |
AUTH_EXTERNAL_LIBRARY_ERROR
GamebaseError gamebaseError = error; // GamebaseError object via callback
if (Gamebase.IsSuccess(gamebaseError) == true)
{
// succeeded
}
else
{
Debug.Log(string.Format("code:{0}, message:{1}", gamebaseError.code, gamebaseError.message));
if (gamebaseError.code == GamebaseErrorCode.AUTH_EXTERNAL_LIBRARY_ERROR)
{
GamebaseError moduleError = gamebaseError.error; // GamebaseError.error object from external module
if (null != moduleError)
{
int moduleErrorCode = moduleError.code;
string moduleErrorMessage = moduleError.message;
Debug.Log(string.Format("moduleErrorCode:{0}, moduleErrorMessage:{1}", moduleErrorCode, moduleErrorMessage));
}
}
}