Set up Oculus as an Identity Provider
概要
このガイドは、検証済みの Oculus デベロッパーが Oculus アカウントを AccelByte Gaming Services (AGS)に接続することを支援するためのものです。場合によっては、Oculus サービス内の追加機能を設定する必要があります。ここにはその機能を記載していません。Oculus サービスの設定の詳細については、Oculus 担当者にお問い合わせいただき、また Oculus のドキュメントを確認されることをお勧めします。
AccelByte デベロッパーパートナーマネージャーからリクエストできる機密ガイド資料をご用意しています。
目標
AccelByte Game SDK を使用して、ゲームの Oculus 認証方法を有効化する。
前提条件
- 検証済みの Oculus 開発者アカウント。
- Unreal Engine をご利用の場合は、プラグインで OnlineSubsystem Oculus をアクティベートする必要があります。
- Unityを使用している場合は、Oculus Unity統合:Unityアセットストア を実行する必要があります。
- 認証を設定し、権限を管理する AccelByte 管理者ポータルアカウント。
- ゲームの名前空間。
- AccelByte Game SDK をインポートしたUnityまたはUnrealゲームプロジェクト。
- 最新版の AccelByte Unity SDK またはUnreal SDK。
- AccelByte IAM クライアントに精通していること。
Oculus Meta の設定
Oculus Meta アプリケーションの設定
アプリページの作成ガイド に従って、Oculus 開発者アカウントで Oculus Meta アプリケーションを設定します。
Oculus Meta リクエストプラットフォーム機能
アプリケーションの作成が完了したら、データ使用状況の確認 をリクエストし、ユーザー ID、ユーザープロファイル、アバターといったユーザーデータへのアクセス権を得ます。DUC ガイドの送信 の指示に従ってください。
Oculus 開発者ポータルでの設定に問題がある場合は、カスタマーサポートに連絡して AccelByte からガイドを入手してください。
Oculus SDK のゲーム内ログインの設定
Oculus アカウントでログインするには、ログイン方法を設定する必要があります。ゲーム内で Oculus ログインを設定し、プレイヤーが Oculus アカウントでサインインできるようにするには、次の手順に従ってください。
AccelByte 管理者ポータルにログインし、ゲームの名前空間を選択します。[User Management (ユーザー管理)]サイドバーの下にある [Login Method (ログイン方法)]をクリックし、右側の[+ Add New (+新規を追加)]をクリックします。
[Oculus SDK]をクリックします。
[Create Configuration (設定を作成)]ポップアップが表示されます。Oculusで、[Client ID (クライアント ID)]フィールドに[App ID (アプリ ID)]を入力し、 [App Secret (アプリの秘密)]フィールドに[Client Secret (クライアントの秘密)]を入力します。
システムにより詳細ページにリダイレクトされます。Oculus をアクティベートして使用します。
IAM クライアントの作成
IAM クライアントとは、ターゲットプラットフォームでリリースしたいゲームクライアントのことです。IAM クライアントを使用すると、 ゲームクライアントは適切な権限で、保護された AGS リソースへのアクセスを要求できます。
[Platform Configurations (プラットフォーム設定)]に移動し、次に[IAM Clients (IAM クライアント)]に移動します。
[+ Create New (+新規作成)]をクリックして、新しいIAM クライアントを作成します。
a. [Client Type (クライアントタイプ)]フィールドに[Confidential (機密)]と入力します。[Confidential (機密)]タイプを使用することをお勧めします。 なぜなら、AccelByte Gaming Services リソースにアクセスするために、場合によっては後でいくつかの権限を追加する必要があり、 その場合[Public (公開)]タイプを使用していると適切なセキュリティが利用できないためです。
b. [Secret (秘密)]フィールドに入力します。自分で秘密を入力するか、 [Generate Client Secret (クライアントの秘密を生成)]をクリックすると、秘密鍵を生成できます。
危険この作成ステップの後、クライアントの秘密は表示されません。ゲームの設定時に必要になるため、 確実に秘密をコピーして保存します。
c. [Client Name (クライアント名)]に
<game name> <target platform>
といった特定の名前を入力します。d. ゲームの[Namespace (名前空間)]を選択します。
e. [Scopes (スコープ)]フィールドはデフォルト値のままにします。
f. [*Redirect URI (リダイレクト URI)]フィールドはゲームクライアントのビルド**用であるため、
http://127.0.0.1
を入力します。g. [Target Audience (ターゲットオーディエンス)]と[Base URI (ベー スURI)]フィールドは空白のままにします。
h. IAM クライアントは[Description (説明)]フィールドに記述できます。
j.[SDK Configuration (SDK 設定)]の[Platform Input (プラットフォーム入力)]フィールドは、ゲームがビルドされるターゲットプラットフォームです。
k. [Advanced Configuration (高度な設定)]フィールドは、二要素認証や有効期限の上書きなどの追加機能で 構成されています。これはゲームクライアントのビルド用なので、デフォルト/無効のままでかまいません。
注記システムはクライアント ID を生成します。それをコピーして、ゲームビルドの SDK 設定で使用できます。
システムにより[Client Detail (クライアントの詳細)]ページにリダイレクトされます。必要な権限を設定します。 権限の詳細については、IAM クライアントの権限についてのドキュメントを参照してください。
ゲーム内ログインの指示
各ゲームエンジンの設定は異なっているので、利用可能なタブから適切なものを選択します。
- Unreal Engine Instructions
- Unity Engine Instructions
Unrealゲーム内ログインの統合
Oculus を統合して AccelByte SDK でサインインし、プレイヤーが Oculus 認証情報でゲームにログインできるように することが可能です。
Unrealの準備と設定
依存関係の追加
最初に OnlineSubsystem、OnlineSubsystemOculus、LibOvrPlatform という名前の公開依存関係モジュールを Build.cs ファイルに追加します。これらの依存関係は、プロジェクトがUnreal Engine の Oculus オンラインサブシステムを使用するために 必要です。
public ABThirdPartyLogin(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "OnlineSubsystem", "OnlineSubsystemUtils",
"OnlineSubsystemOculus","LibOVRPlatform",
"Sockets", "Networking", "InputCore", "AccelByteUe4Sdk", "Json", "JsonUtilities", "Http", "WebSockets"
});
PrivateDependencyModuleNames.AddRange(new string[] { });
PrivateDependencyModuleNames.Add("OnlineSubsystem");
また、TutorialProject.Target.cs と TutorialProjectEditor.Target.cs の中に OnlineSubsystemOculus を追加する必要があります。
public ABThirdPartyLoginTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.AddRange( new string[] { "ABThirdPartyLogin", "OnlineSubsystem", "AccelByteUe4Sdk", "OnlineSubsystemOculus" } );
}
public ABThirdPartyLoginEditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.AddRange( new string[] { "ABThirdPartyLogin", "OnlineSubsystem", "AccelByteUe4Sdk", "OnlineSubsystemOculus" } );
}
Oculus のUnreal Engine プロジェクト設定
DefaultEngine.ini ファイルの中に、Oculus 設定のための変数をいくつか追加する必要があります。プロジェクトを開くには、この 設定が必要です。デフォルトでは、Oculus は自動的に起動します。Rift アプリを開発する場合は、RiftAppId=[YourAppId] を 使用していることを確認してください。それ以外の場合は、OculusAppId=[YourAppId] を使用できます。
[OnlineSubsystem]
DefaultPlatformService=Oculus
[OnlineSubsystemOculus]
bEnabled=true
RiftAppId=[YourAppId]
Unrealサンプルコードの実装
Oculus ログイン統合を SDK でゲームに統合する方法について説明します。当社のロジックは、プレイヤーが Oculus でログインした時に そのログインを上書きし、当社のプラットフォームを使用して SDK がアクセスできるサービスを提供することです。
このプロジェクトでは Oculus をプラットフォームとして使用しているため、プレイヤーは Oculus の認証情報でログインできます。
- Oculus がエンタイトルメントパスを実行したら、必ずオンラインアイデンティティ関数を呼び出して platform_tokens を取得してください。
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);
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);
OnActionInfoUpdated.Broadcast(Message);
return;
}
- platform_token を取得すると、システムはトークンを使用して Accelbyte loginWithOtherPlatform API を呼び出します。 コードは次のようになります。
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)
{
auto OculusUserId = OnlineIdentity->GetUniquePlayerId(0);
auto GenAuth = OnlineIdentity->GetAuthToken(LocalPlayer->GetControllerId());
const FString PlatformToken = (TEXT("%s:%s"), OculusUserId, GenAuth);
UE_LOG(LogTemp, Warning, TEXT("PlatformToken : %s"), *PlatformToken);
OnActionInfoUpdated.Broadcast(FString::Printf(TEXT("PlatformToken : %s"), *PlatformToken));
FRegistry::User.LoginWithOtherPlatform(EAccelBytePlatformType::PS5, PlatformToken, OnLoginSuccessDelegate, OnLoginErrorDelegate);
UE_LOG(LogTemp, Warning, TEXT("Request LoginWithOtherPlatform"));
OnActionInfoUpdated.Broadcast(TEXT("Request LoginWithOtherPlatform"));
}
});
OnlineIdentity->AddOnLoginCompleteDelegate_Handle(LocalPlayer->GetControllerId(), NativeLoginComplete);
const bool bWaitForDelegate = OnlineIdentity->Login(LocalPlayer->GetControllerId(), FOnlineAccountCredentials());
if (!bWaitForDelegate)
{
FString Message = TEXT("The online subsystem couldn't login");
UE_LOG(LogTemp, Warning, TEXT("%s"), *Message);
OnActionInfoUpdated.Broadcast(Message);
}
コードEAccelBytePlatformType::Oculus
で適切なプラットフォームを呼び出していることを確認してください。
FRegistry::User.LoginWithOtherPlatform(EAccelBytePlatformType::Oculus, PlatformToken, OnLoginSuccessDelegate, OnLoginErrorDelegate);
サンプルコードのテスト
起動引数
エディタで実行してプロジェクトを起動するか、コマンドプロンプトまたは Powershell でこの実行可能コマンドを使用します。
"[[PathToUE5Folder]]\Epic Games\UE_5.0\Engine\Binaries\Win64\UnrealEditor.exe]" "[PathToProjectFolder]\TestingUnreal\ABThirdPartyLogin\ABThirdPartyLogin.uproject" -skipcompile -game
以下の画像は、Oculus アカウントを使用して当社のテストアプリに正常にログインしたことを示しています。
Unityゲーム内ログインの統合
AccelByte SDK でサインインするように Oculus アカウントを統合すると、プレイヤーは Oculus 認証情報を使用してゲームにログインできます。
Unityの準備と設定
- Unityプロジェクトに Accelbyte Unity SDK を追加します。
- Unityアセットストア から Unity Oculus Integration Asset を追加します
- Unityアセットをインストールして一覧表示してください。
Unityサンプルコードの実装
Accelbyte Unity SDK と Oculus Integration Asset を追加し、次の手順に従ってください。
1.空のスクリプトを作成して名前を付けます。
2.[Editor (エディタ)]でスクリプトを開き、ユーザー ID と nonce を取得する前にエンタイトルメントをチェックする、このコードを追加します。
void Awake()
{
try
{
Core.Initialize();// getting oculus APP ID
Entitlements.IsUserEntitledToApplication().OnComplete(EntitlementCallback);// if entitlement pass will automatically return callback
Users.GetLoggedInUser().OnComplete(getUserCallback);//to generate userId
Users.GetUserProof().OnComplete(userProofCallback);//to generate UserNonce
}
catch (UnityException e)
{
Debug.LogError("Platform failed to initialize due to exception.");
Debug.LogException(e);
// Immediately quit the application.
UnityEngine.Application.Quit();
}
}
// Called when the Meta Quest Platform completes the async entitlement check request and a result is available.
void EntitlementCallback(Message msg)
{
if (msg.IsError) // User failed entitlement check
{
// Implements a default behavior for an entitlement check failure -- log the failure and exit the app.
Debug.LogError("You are NOT entitled to use this app.");
UnityEngine.Application.Quit();
}
else // User passed entitlement check
{
// Log the succeeded entitlement check for debugging.
Debug.Log("You are entitled to use this app.");
LoginStatus.text = "You are entitled to use this app, Please Login";
}
}
void getUserCallback(Message<Models.User> msg)
{
if (!msg.IsError)
{
Models.User user = msg.Data;
userId = user.ID.ToString();
Debug.Log(
$"user : {user} ");
}
else
{
Models.Error error = msg.GetError();
}
}
void userProofCallback(Message<UserProof> msg)
{
if (!msg.IsError)
{
UserProof userNonce = msg.Data;
nonce = userNonce.Value;
Debug.Log(
$"userNonce : {userNonce} ");
}
else
{
Models.Error error = msg.GetError();
}
}
- [Oculus Tab -> Platform - Edit Setting (Oculus タブ -> プラットフォーム - 設定を編集)]を開き、[App Id (アプリ ID)]フィールドに入力します。
- スクリプトは引き続きこの関数を実行します。
public void OnLoginClick()
{
OculusLoginButton.interactable = false;
LoginStatus.text = "Logging in...";
// AccelByte's Multi Registry initialization
apiClient = MultiRegistry.GetApiClient();
//Grab a reference to the current User, even though they have not been logged in yet.
//This also acts as the initialisation point for the whole AccelByte plugin.
user = apiClient.GetApi<AccelByte.Api.User, UserApi>();
// oculus token
string oculusToken = userId + ":" + nonce;
Result<TokenData, OAuthError> loginResult = null;
user.LoginWithOtherPlatform(PlatformType.Oculus, oculusToken,
(Result<TokenData, OAuthError> loginResult) =>
{
if (loginResult.IsError)
{
//If we error, grab the Error Error and Description to print in the Log
Debug.Log(
$"Login failed : {loginResult.Error.error} Description : {loginResult.Error.error_description}");
//Set the Status Text to display the Error if there is any
LoginStatus.text =
$"Login failed : {loginResult.Error.error} Description : {loginResult.Error.error_description}";
}
else
{
Debug.Log($"Login successful : {loginResult.Value.ToJsonString()}");
LoginStatus.text = $"Success : {loginResult.Value.ToJsonString()} ";
}
//Enable interaction with the Button again
OculusLoginButton.interactable = true;
});
}
- この関数は、プラットフォームタイプが Oculus の Accelbyte エンドポイントにリクエストを送信し、コールバックを返します。
サンプルコードのテスト
これでプロジェクトをビルドして実行できます。以下の画像は、Oculus アカウントと当社のテストアプリを使用して正常にログインしたことを示しています。