Steam をアイデンティティプロバイダーとして設定する
概要
このガイドは、検証済みのSteam デベロッパーが、Steam プレイヤーアカウントを AccelByte Gaming Services (AGS)に接続することを支援するためのものです。ゲームによっては、ここに記載されていない Steam サービス内の追加機能を設定する必要があります。Steam サービスの設定の詳細については、Steam 担当者にお問い合わせいただき、また Steam のドキュメントを直接確認されることをお勧めします。
AccelByte デベロッパーパートナーマネージャーにリクエストできる機密のガイド資料をご用意しています。
目標
- AccelByte Game SDK を使用して、ゲームの Steam 認証方法を有効化する。
- AccelByte プレイヤーポータルを使用して、パブリッシャーウェブサイトの Steam 認証方法を有効化する。
前提条件
有効な Steam デベロッパーアカウントを所有していて、Steamworksにログインできる必要があります。
Steam Direct プロセスを通じて App ID を設定します。
Steamworks ドキュメントに従い、Steam パブリッシャー Web API キーを設定します。
Unreal Engine またはUnityについては、Steamworks GitHub ページから Steamworks SDK を入手します。
注記Steam アプリやパブリッシャー Web API キーの設定に問題がある場合は、デベロッパーパートナーマネージャーに連絡して AccelByte からガイドを入手してください。
Unreal Engine Steam OSS を所有しておきます。
- UE V4.27 以降:Unreal Engine OSS
- UE V5.0:Unreal Engine OSS
認証を設定し、権限を管理するための AccelByte 管理者ポータルアカウントを所有しておきます。まだ設定していない場合は以下を設定します。
- プレイヤーポータルとランチャーにパブリッシャーの名前空間を設定します。
- ゲームに対し、ゲームの名前空間を設定します。
ウェブログインを設定するにはプレイヤーポータルが必要になります。 AccelByte Game SDK をインポートしたUnityまたはUnrealゲームプロジェクトを所有しておきます。
- 最新版の AccelByte Unity SDK または AccelByte Unreal SDK を入手します。
AccelByte IAM クライアントに精通しておきます。
Steam 認証の有効化
Steam SDK ログイン方法の設定
AccelByte 管理者ポータルにログインし、[Game Namespace (ゲームの名前空間)]を選択し、[User Management (ユーザー管理)]サイドバーの下にある[Login Method (ログイン方法)]をクリックし、右側の[+ Add New (+新規を追加)]ボタンをクリックします。
[Steam SDK]をクリックします。
Steam ネットワークポータルの[APP ID (アプリ ID)]と[Web API Key (Web API キー)]を入力します。[Redirect URI (リダイレクト URI)]に http://127.0.0.1 と入力し、[Create (作成)]ボタンをクリックします。
アクティベートします。
IAM クライアントの作成
IAM クライアントとは、Steam プラットフォームでリリースしたいゲームクライアントのことです。IAM クライアントを使用すると、ゲームクライアントは適切な権限を使用して、保護されている AccelByte Gaming Services リソースへのアクセスを要求できます。
[Platform Configurations (プラットフォーム設定)]に移動し、[IAM Clients (IAM クライアント)]を見つけます。
[+ Create New (+新規作成)]ボタンをクリックして、新しいIAM クライアントを作成します。
a.[Client Type (クライアントタイプ)]には[Confidential (機密)]と入力します。[Confidential type (機密タイプ)]を使用することを強くお勧めします。なぜなら、AccelByte Gaming Services リソースにアクセスするために、場合によっては後でこの IAM クライアントにいくつかの権限を追加する必要があり、その場合[Public (公開)]タイプを使用していると適切なセキュリティが利用できないためです。
b.[Secret (秘密)]を入力します。許容される形式で秘密を自分で入力するか、[Generate Client Secret (クライアントの秘密を作成)]をクリックすると、秘密鍵を生成できます。
この作成ステップの後、クライアントの秘密は表示されません。必ずその値をコピーして保存してください。ゲームの設定時に必要になります。c.[Client Name (クライアント名)]を入力します。この IAM クライアントは Steam プラットフォームに固有であるため、
<game name> steam build
のような特定の名前を名付けます。d.特定のゲームの名前空間を選択します。
e.[Scopes (スコープ)]はデフォルトのままでかまいません。
f.[Redirect URI (リダイレクト URI)]は、ゲームクライアントビルド用なので、
http://127.0.0.1
を入力します。g.[Target Audience (ターゲットオーディエンス)]は空白のままでかまいません。
h.[BASE URI (ベース URI)]も空白のままでかまいません。
i.IAM クライアントは[Description (説明)]フィールドに記述できます。
j. SDK 設定の[Platform Input (プラットフォーム入力)]とは、ゲームをビルドするためのターゲットプラットフォームのことです。ここでは[Steam]に設定します。
k. [Advanced Configuration (高度な設定)]は、二要素認証や有効期限の上書きなどの追加機能で構成されています。これはゲームクライアントのビルド用なので、デフォルト/無効のままでかまいません。
注記クライアント ID は既に生成されていて、コピーできます。後ほどゲームをビルドする際に、SDK 設定でクライアント ID を使用できます。
[Client Detail (クライアントの詳細)]ページにリダイレクトされます。必要に応じて権限を設定してください。権限の詳細については、IAM クライアントの権限についてのドキュメントを参照してください。
ゲーム内ログイン手順
ゲームエンジンごとに設定が異なります。利用可能なタブからゲームエンジンを選択してください。
- Unreal Engine Instructions
- Unity Instructions
Unrealゲーム内ログインの統合
AccelByte SDK を使用して Steam ログインを統合できるので、プレイヤーは Steam 認証情報を使用してゲームにログインできます。
Unrealの準備と設定
依存関係の追加
最初に、公開依存関係モジュールOnlineSubsystem
、OnlineSubsystemSteam
、Steamworks
を追加する必要があります。これらはすべて、プロジェクトを統合してUnreal Engine 内から Steam オンラインサブシステムを使用するために必要な依存関係です。
public ABThirdPartyLogin(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" , "AccelByteUe4Sdk", "Slate", "SlateCore" });
PrivateDependencyModuleNames.AddRange(new string[] { "Json", "OnlineSubsystem", "OnlineSubsystemSteam", "Steamworks", "HTTP" });
}
<YourProject>.Target.cs
と<YourProjectEditor>.Target.cs
ファイルの中に OnlineSubsystemSteam を追加します。
public ABThirdPartyLoginTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.AddRange( new string[] { "ABThirdPartyLogin", "OnlineSubsystem", "AccelByteUe4Sdk", "OnlineSubsystemSteam" } );
}
public ABThirdPartyLoginEditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.AddRange( new string[] { "ABThirdPartyLogin", "OnlineSubsystem", "AccelByteUe4Sdk", "OnlineSubsystemSteam" } );
}
Steam のUnreal Engine プロジェクト設定
DefaultEngine.ini
ファイルの中に、Steam 設定のための変数をいくつか追加する必要があります。プロジェクトを開くと確実に Steam が自動で開始されるようにするには、この設定が必要です。
Unreal Engine に Online Subsystem Steam を使用するように指示するには、次の設定を追加します。
[OnlineSubsystem]
DefaultPlatformService=Steam
これで、アプリケーションが Steam オンラインサブシステムを使用することをUnreal Engine に伝えたので、次の設定を追加してOnlineSubsystemSteam
モジュールを設定する必要があります。
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
SteamDevAppId は Steam ゲームの App ID です。
アプリケーションの接続のために Net Driver に Steam クラスを指定します。
[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
Unreal Engine プロジェクト設定
AccelByte 認証情報をDefaultEngine.ini
に追加します。
[/Script/AccelByteUe4Sdk.AccelByteSettings]
ClientId=<Your Client_Id>
ClientSecret=<Your Client_Secret>
Namespace=<Your Namespace>
PublisherNamespace=<Your Publisher Namespace>
RedirectURI="http://127.0.0.1"
BaseUrl="https://prod.gamingservices.accelbyte.io"
AppId=480
IamServerUrl="https://prod.gamingservices.accelbyte.io/iam"
PlatformServerUrl="https://prod.gamingservices.accelbyte.io/platform"
AppId は Steam ゲームの App ID です。
推奨 DefaultEngine.ini 設定
この指示に従うと、DefaultEngine.ini
ファイルは次の例のようになります。
[OnlineSubsystem]
DefaultPlatformService=Steam
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=<your steam game app id>
[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
[/Script/AccelByteUe4Sdk.AccelByteSettings]
ClientId=<Your IAM_Client_Id>
ClientSecret=<Your IAM_Client_Secret>
Namespace=<Your Namespace>
PublisherNamespace=<Your Publisher Namespace>
RedirectURI="http://127.0.0.1"
BaseUrl="https://prod.gamingservices.accelbyte.io"
AppId=<your steam game app id>
IamServerUrl="https://prod.gamingservices.accelbyte.io/iam"
PlatformServerUrl="https://prod.gamingservices.accelbyte.io/platform"
サンプルコードの実装
次に、サンプルコードを使用してゲームの Steam 認証方法を実装する方法について説明します。
IOnlineSubsystem
が、DefaultEngine.ini
で定義されているDefaultPlatformService
値を読み取ります。IdentityInterface
は、ユーザーアカウントに関連するこれらのサービスとのやり取りを管理し、ユーザー認証とアクセストークンの取得を可能にします。操作に問題がなければ、AccelByte SDK のLoginWithOtherPlatform
関数は、アイデンティティインターフェイスから取得した認証トークンを使用して、サードパーティのプラットフォームのログインを処理します。
UE_LOG(LogTemp, Warning, TEXT("%s"), TEXT("Begin Login"));
const IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();
if (OnlineSubsystem == nullptr)
{
FString Message = TEXT("Cannot login with no online subsystem set!");
UE_LOG(LogTemp, Warning, TEXT("%s"), *Message);
OnActionInfoUpdated.Broadcast(Message);//will get active OSS Platform Service
return;
}
const IOnlineIdentityPtr OnlineIdentity = OnlineSubsystem->GetIdentityInterface();
if (!OnlineIdentity.IsValid())
{
FString Message = TEXT("Could not retrieve identity interface from native subsystem.");
UE_LOG(LogTemp, Warning, TEXT("%s"), *Message);
return;
}
APlayerController* MyPlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);;
const ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(MyPlayerController->Player);
if (LocalPlayer == nullptr)
{
FString Message = TEXT("Can only login with native platform for local players");
UE_LOG(LogTemp, Warning, TEXT("%s"), *Message);
return;
}
const FVoidHandler OnLoginSuccessDelegate = FVoidHandler::CreateLambda([=]() {
FAccountUserData AccountUserData = FRegistry::Credentials.GetAccountUserData();
FString AccountUserDataString;
FJsonObjectConverter::UStructToJsonObjectString(AccountUserData, AccountUserDataString);
FString Message = FString::Printf(TEXT("Login to AB Service Success : %s"), *AccountUserDataString);//Failed Login to AB Service
});
const FCustomErrorHandler OnLoginErrorDelegate = FCustomErrorHandler::CreateLambda([=](int32 ErrorCode, const FString& ErrorMessage, const FJsonObject& ErrorObject) {
FString Message = FString::Printf(TEXT("Error Login to AB Service : %s"), *ErrorMessage);
});
const FOnLoginCompleteDelegate NativeLoginComplete = FOnLoginCompleteDelegate::CreateLambda([=]
(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& Error) {
UE_LOG(LogTemp, Warning, TEXT("OnLoginComplete %s : %s"), bWasSuccessful ? TEXT("Success") : TEXT("Fail"), *Error);
FString Message = FString::Printf(TEXT("OnLoginComplete %s : %s"), bWasSuccessful ? TEXT("Success") : TEXT("Fail"), *Error);
OnActionInfoUpdated.Broadcast(Message);
if (bWasSuccessful)
{
const FString PlatformToken = OnlineIdentity->GetAuthToken(LocalPlayer->GetControllerId());
UE_LOG(LogTemp, Warning, TEXT("PlatformToken : %s"), *PlatformToken);
OnActionInfoUpdated.Broadcast(FString::Printf(TEXT("PlatformToken : %s"), *PlatformToken));//Will Obtained Auth Ticket from OnlineIdentity
FRegistry::User.LoginWithOtherPlatform(EAccelBytePlatformType::EpicGames, PlatformToken, OnLoginSuccessDelegate, OnLoginErrorDelegate);
UE_LOG(LogTemp, Warning, TEXT("Request LoginWithOtherPlatform"));
OnActionInfoUpdated.Broadcast(TEXT("Request LoginWithOtherPlatform"));
}//this method will hitting the AccelByte endpoint and will return value after success
});
OnlineIdentity->AddOnLoginCompleteDelegate_Handle(LocalPlayer->GetControllerId(), NativeLoginComplete);
const bool bWaitForDelegate = OnlineIdentity->Login(LocalPlayer->GetControllerId(), Credentials);
if (!bWaitForDelegate)
{
FString Message = TEXT("The online subsystem couldn't login");
UE_LOG(LogTemp, Warning, TEXT("%s"), *Message);
}
FString Message = TEXT("Sending login request to native subsystem!");
UE_LOG(LogTemp, Warning, TEXT("%s"), *Message);
このサンプルコードをプロジェクトに追加したら、プロジェクトをコンパイル、ビルド、実行します。以上です。
サンプルコードのテスト
以下の画像は、Steam を使用してサンプルコードで正常にログインしたことを示しています。
Unityゲーム内ログインの統合
Steam ゲームを統合して AccelByte SDK でサインインすれば、プレイヤーは Steam の認証情報を使用してゲームにログインできます。
Unityの準備と設定
Unityプロジェクト設定
For more information about opening the SDK Config, see Install and configure the SDK. Then, fill in each attribute based on the AGS Admin Portal values and save the configuration.
Unityサンプルコードの実装
In this sample code implementation, we will use Steamworks.NET as the wrapper of Steam SDK.
This example requires Steamworks.Net with a minimum version 20.2.0.
Generate Steam token
You can generate a Steam ticket with a new API called GetAuthTicketForWebApi
.
using AccelByte.Core;
using AccelByte.Models;
using Steamworks;
/// <summary>
/// API to generate Steam token
/// </summary>
/// <param name="serviceId">Value of any unique identifier</param>
public static void GenerateSteamTicket(string serviceId, System.Action<string> onGetSteamTokenFinished)
{
if (!SteamManager.Initialized)
{
Debug.LogError("Failed to initialize Steam");
return;
}
Callback<GetTicketForWebApiResponse_t> getAuthSessionTicketResponse = null;
GetTicketForWebApiResponse_t? responseResult = null;
getAuthSessionTicketResponse = Callback<GetTicketForWebApiResponse_t>.Create(response =>
{
getAuthSessionTicketResponse.Dispose();
responseResult = response;
if (response.m_eResult == EResult.k_EResultOK)
{
byte[] bytes = response.m_rgubTicket;
int byteSize = response.m_cubTicket;
string steamTicket = System.BitConverter.ToString(bytes, startIndex: 0, byteSize);
steamTicket = steamTicket.Replace("-", string.Empty);
Debug.Log($"Get steam ticket:\n{steamTicket}");
onGetSteamTokenFinished?.Invoke(steamTicket);
}
else
{
Debug.LogError("Failed to get Steam token");
onGetSteamTokenFinished?.Invoke(null);
}
});
SteamUser.GetAuthTicketForWebApi(serviceId);
}
platform_token
for Epic Games Authentication is Access Token or Auth Code.
Log in to the AccelByte IAM Service.
private void LoginAccelByteSteamPlatform(string serviceId)
{
GenerateSteamTicket(serviceId, steamTicket =>
{
if (string.IsNullOrEmpty(steamTicket))
{
Debug.LogError("Steam ticket is empty");
return;
}
AccelByte.Api.User user = AccelByteSDK.GetClientRegistry().GetApi().GetUser();
string platformToken = $"{serviceId}:{steamTicket}";
user.LoginWithOtherPlatform(AccelByte.Models.PlatformType.Steam, platformToken, OnLoginWithSteamDone);
});
}
private void OnLoginWithSteamDone(Result<TokenData, OAuthError> loginResult)
{
if (loginResult.IsError)
{
Debug.Log($"Login failed, Error: {loginResult.Error.error}, Description {loginResult.Error.error_description}");
}
else
{
Debug.Log("Login success");
}
}
Steam サンプルコードのテスト
これでプロジェクトをビルドして実行できます。下の画像は、Steam の認証情報を使用してテストアプリへのログインが成功した状態を示しています。
プレイヤーポータルの Steam 認証
設定手順
AccelByte 管理者ポータルにログインし、パブリッシャーの名前空間を使用して、[User Management (ユーザー管理)]サイドバーの下にある[Login Method (ログイン方法)]をクリックします。次に右側の[+ Add New (+新規を追加)]ボタンをクリックします。
2.[Steam Web]をクリックします。
Steam ネットワークポータルの[Steam Web API Key (Steam Web API キー)]を入力し、[Redirect URI (リダイレクト URI)]にドメイン URL (たとえばhttps://prod.gamingservices.accelbyte.io) を入力します。最後に[Create (作成)]ボタンをクリックします。
アクティベートします。
試行
プレイヤーポータルで、[Login (ログイン)]ボタンをクリックします。
Steam アイコンが見つからない場合は、[More login options (その他のログインオプション)]をクリックしてください。
[Login with Steam (Steam でログイン)]をクリックします。
[Steam Web Login (Steam ウェブログイン)]ページにリダイレクトされます。続行するには Steam の認証情報を入力する必要があります。
以上です。必要な手順を完了しました。
これで、プレイヤーは Steam アカウントを既存の AccelByte アカウントと、あるいは新しいアカウントとリンクするよう求められます。AccelByte では、この設定を行うための取り組みを進めています。これでプレイヤーがヘッドレスアカウントでプレイヤーポータルlに直接ログインできるようになります。
トラブルシューティング
このセクションには、サービス使用時に発生しうる一般的なエラーや問題、およびそれらを解決する方法についての推奨事項を記載しています。
設定ミス
Steam アプリ ID が正しくない場合、またはUnreal Engine 設定(DefaultEngine.ini
にて指定)に欠落がある場合、ゲームは Steam ログインサービスにアクセスできません。
DefaultEngine.ini
ファイルを再確認し、Steam App ID が正しく設定されていることを確認します。
Steam ログインが機能しない
Steam 側にアクセストークンがないと、プレイヤーは Steam でログインできません。
- Steam アプリがバックグラウンドで実行されていることを確認します。