キャッシュされたリフレッシュトークンを使用して再ログインする
Last updated on February 4, 2026
注釈:本資料はAI技術を用いて翻訳されています。
概要
AccelByte Gaming Services (AGS) Game SDK を使用すると、ゲーム開発者は再ログイン機能を実装できるため、ゲーム内のユーザーはキャッシュされたリフレッシュトークンを使用してログイン状態を維持できます。この機能は、サードパーティサービスがダウンしているか、メンテナンス中の場合にプレイヤーを認証するのに役立ちます。ユーザーはリフレッシュトークンを使用して 24 時間ログインできます。
実装
AGS Game SDK は、AGS User API の LoginWithOtherPlatform 関数を使用して、最初にプレイヤーを正常にログインさせます。ログインが成功すると、リフレッシュトークンが生成され、自動的にキャッシュされます。キャッシュには明示的な呼び出しは必要ありません。その後、プラットフォームサービスがダウンしているか利用できない場合に ReloginWithOtherPlatform 関数を使用でき、再ログイン API は最後に生成されたプラットフォーム refresh_token を使用して AGS プラットフォームにログインします。
Steam サービスを使用した実装の例を以下に示します。
- Unreal
- Unreal OSS
- Unity
//まず Steam を使用してログインを試みます
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString SteamTicket = GetSteamTicket(); // UnrealEngine Online Subsystem Steam を使用
bool bLoginDone = false;
bool bLoginUsingSteamAccountSuccess = false;
ApiClient->User.LoginWithOtherPlatform(EAccelBytePlatformType::Steam, SteamTicket,
FVoidHandler::CreateLambda([&]()
{
bLoginDone = true;
bLoginUsingSteamAccountSuccess = true;
}),
FErrorHandler::CreateLambda([&](int32 Code, FString Message)
{
bLoginDone = true;
}));
WaitUntil([&]() { return bLoginDone; }, "Waiting...");
FString SteamID = GetSteamUserId(); // Steamworks を使用
/// 例:
/// FString GetSteamUserId()
/// {
/// SteamID SteamID = SteamUser()->GetSteamID();
/// uint64 SteamIdLong = SteamID.ConvertToUint64();
/// return FString::Printf(TEXT("%llu"), SteamIdLong);
/// }
if (bLoginUsingSteamAccountSuccess)
{
return;
}
// Steam アカウントを使用したログインが何らかの理由で失敗した場合(例:Steam API がダウンしている)
// この例を使用して、キャッシュされたリフレッシュトークンを使用して再ログインします
bool bReloginDone = false;
bool bReloginSuccess = false;
ApiClient->User.TryRelogin(SteamID,
FVoidHandler::CreateLambda([&]()
{
bReloginDone = true;
bReloginSuccess = true;
}),
FErrorHandler::CreateLambda([&](int32 Code, FString Message)
{
bReloginDone = true;
}));
WaitUntil([&]() { return bReloginDone; }, "Waiting...");
/// 例:Steamworks をプロジェクトの .build.cs に含める
/// FString GetSteamUserId()
/// {
/// SteamID SteamID = SteamUser()->GetSteamID();
/// uint64 SteamIdLong = SteamID.ConvertToUint64();
/// return FString::Printf(TEXT("%llu"), SteamIdLong);
/// }
FString SteamUserID = GetSteamUserId(); //SteamUserID の例
int32 PlayerInputIndex = GetInputIndex(); //インデックスの例
FOnlineAccountCredentials LoginCreds;
LoginCreds.Type = "CachedToken";
LoginCreds.Id = SteamUserID;
const IOnlineSubsystem* Subsystem = Online::GetSubsystem(GetWorld());
const IOnlineIdentityPtr IdentityInterface = Subsystem->GetIdentityInterface();
IdentityInterface->Login(PlayerInputIndex, LoginCreds);
詳細については、Steam を ID プロバイダーとしてセットアップする を参照してください。
using AccelByte.Core;
using AccelByte.Models;
using UnityEngine;
using Steamworks;
public class Main: MonoBehaviour
{
public const string GameIdentity = "yourIdentity";
void Start()
{
GenerateSteamTicket(GameIdentity, OnGetSteamTicketDone);
}
private void OnGetSteamTicketDone(string steamTicket)
{
AccelByte.Api.User user = AccelByteSDK.GetClientRegistry().GetApi().GetUser();
if (string.IsNullOrEmpty(steamTicket))
{
Debug.LogError("Steam ticket is empty, re-login with previous token");
AutoReloginSteam();
return;
}
string steamToken = $"{GameIdentity}:{steamTicket}";
user.LoginWithOtherPlatform(AccelByte.Models.PlatformType.Steam, steamToken, OnLoginWithSteamDone);
}
private void OnLoginWithSteamDone(Result<TokenData, OAuthError> loginResult)
{
if (loginResult.IsError)
{
AutoReloginSteam();
}
else
{
Debug.Log("Login success");
}
}
private void AutoReloginSteam()
{
AccelByte.Api.User user = AccelByteSDK.GetClientRegistry().GetApi().GetUser();
user.ReloginWithOtherPlatform(PlatformType.Steam, reloginResult =>
{
if (reloginResult.IsError)
{
Debug.LogError(reloginResult.Error.error_description);
}
else
{
Debug.Log("Relogin success");
}
});
}
}