Set up OIDC as an Identity Provider
概要
このガイドは、OIDC を AccelByte Gaming Services (AGS) に統合することを支援するためのものです。ゲームによっては、ここに記載されていないアイデンティティプロバイダー内の追加機能を設定する必要があります。OIDC サービスの設定の詳細については、アイデンティティプロバイダー担当者にお問い合わせいただき、また直接アイデンティティプロバイダーのドキュメントを確認されることをお勧めします。
目標
- AccelByte Game SDK を使用して、ゲームの OIDC 認証方法を有効化する。
- AccelByte プレイヤーポータルを使用して、パブリッシャーウェブサイトの OIDC 認証方法を有効化する。
前提条件
ウェブログイン統合の場合
- OIDC をサポートするアイデンティティプロバイダーを所有しておきます。
- 認証を設定し、権限を管理するための AccelByte 管理者ポータルアカウントを所有しておきます。
- まだ設定していない場合は、プレイヤーポータルとランチャーのパブリッシャーの名前空間を設定します。
- プレイヤーポータルを所有しておきます。
ゲーム内ログイン統合の場合
- OIDC をサポートするアイデンティティプロバイダーを用意しておきます。
- 認証を設定し、権限を管理するための AccelByte 管理者ポータルアカウントを所有しておきます。
- まだ設定していない場合は、ゲームに対し、ゲームの名前空間を設定します。
- AccelByte Game SDK をインポートしたUnityまたはUnrealゲームプロジェクトを所有しておきます。
- 最新版の AccelByte Unity SDK または Unreal SDK を入手します。
- AccelByte IAM クライアントに精通しておきます。
アイデンティティプロバイダー (IdP) の設定
次の手順を使用して、ゲーム内でアイデンティティプロバイダー (IdP) OIDC ログインを設定します。これでプレイヤーは自分のアカウントを使用して管理者ポータル、プレイヤーポータル/ランチャーとゲーム内にサインインできます。
OIDC をサポートするお好みのアイデンティティプロバイダー (IdP) を使用できます。当社がサポートする認証タイプは 3 種類あります。
認証コードは、ウェブフローベースの認証用です。アイデンティティプロバイダーのログインページにリダイレクトされ、さらにアクセス権を持つ AccelByte ポータルにリダイレクトされます。
ID トークンについては、アイデンティティプロバイダーから ID トークンを生成する必要があります。これは AccelByte アクセストークンと交換できます。
アクセストークンは、アイデンティティプロバイダーが ID トークンを提供できないものの、アクセストークンでアクセスできるユーザー情報エンドポイントを持っている場合のカスタムニーズに対応しています。
認証コードの種類
OKTA OIDC を例として、OIDC プレイヤーポータルと管理者ポータルログインを設定します。認証コードを使用する場合、アイデンティティプロバイダー OIDC を AccelByte Game Service と統合するには、次の項目が必要です。
- JWKS URL
- Issuer (発行元)
- Client ID (クライアント ID)
- Client Secret (クライアントの秘密)
- Authorization Request URL (承認リクエス トURL)
- Token Endpoint URL (トークンエンドポイント URL)
例として OKTA をアイデンティティプロバイダーとして使用します。ただし OKTA に限定されないことに注意してください。OIDC をサポートする他のアイデンティティプロバイダーも使用できます。
OKTA アプリケーションの作成
OKTA アカウントの下で OKTA アプリケーションを作成します。OIDC アプリ統合の作成ガイド の指示に従ってください。
OKTA OIDC 設定の取得
アプリ openid-configuration を開くには、この URL:https://<YOUR_OKTA_URL>.okta.com/oauth2/default/.well-known/openid-configuration
の指示に従ってください。
OIDC 認証コードタイプログインの設定に必要な、以下のアイテムを取得できます。
- JWKS URL
- Issuer (発行元)
- Authorization Request URL (承認リクエスト URL)
- Token Endpoint URL (トークンエンドポイント URL)
ID トークンタイプ
ID トークンを使用する場合、アイデンティティプロバイダー (IdP) からの承認を処理して ID トークンを取得する必要があります。アイデンティティプロバイダー OIDC を AccelByte Game Service と統合するには、次の項目が必要です。
- JWKS URL
- Issuer (発行元)
- Client ID (クライアント ID)
例として Facebook をアイデンティティプロバイダーとして使用します。ただし Facebook に限定されないことに注意してください。OIDC をサポートする他のアイデンティティプロバイダーを使用することもできます。
Facebook アプリケーションの作成
Facebook 開発者カウントの下で Facebook アプリケーションを作成します。アプリ作成ガイド の指示に従ってください。
アプリに Facebook ログインプロダクトを追加
アプリに Facebook ログインプロダクトを追加します。JavaScript SDK によるウェブ用 Facebook ログインガイド の指示に従ってください。
アクセストークンタイプ
アクセストークンを使用する場合、アイデンティティプロバイダー OIDC を AccelByte Game Service に統合するには、次の項目が必要です。
- User Info Endpoint URL (ユーザー情報エンドポイント URL)
- User Info Endpoint HTTP method (ユーザー情報エンドポイント HTTP メソッド)
例として OKTA をアイデンティティプロバイダーとして使用します。ただし OKTA に限定されないことに注意してください。OIDC をサポートする他のアイデンティティプロバイダーも使用できます。
OKTA アプリケーションの作成
OKTA アカウントの下で OKTA アプリケーションを作成します。OIDC アプリ統合作成ガイド の指示に従ってください。
OIDC ログイン方法の設定
ウェブログインの場合
認証コードタイプ
次の手順を使用して、プレイヤーポータルと管理者ポータルで OIDC ログインを設定します。これでプレイヤーは自分のアイデンティティプロバイダーアカウントを使用してプレイヤーポータルにサインインできます。
- AccelByte 管理者ポータルにログインし、[Publisher Namespace (パブリッシャーの名前空間)]を選択し、[User Management (ユーザー管理)]サイドバーの下にある[Login Method (ログイン方法)]をクリックし、右側の[+ Add New (+新規を追加)]ボタンをクリックします。
2.[Create OIDC (OIDC を作成)]ボタンを選択します。
この例(OKTA OIDC)では、[Authorization Code (承認コード)]を認証タイプとして使用します。以下のセクションに入力する必要があります。 a. [Platform Name (プラットフォーム名)]:わかりやすい名前、たとえば「oidcokta」を入力します。
b. [Platform ID (プラットフォーム ID)]:OKTA アプリで有効な RedirectURI として使用するプラットフォーム ID (たとえば「oidcokta」)を入力します。
c. [Authentication type (認証タイプ)]:[Authorization Code (承認コード)]。
a. [JWKS URL]:OKTA openid 設定 URL に jwks_uri を指定します。
d. [Issuer (発行元)]:OKTA openid 設定 URL に issuer を指定します。
e. [Client ID (クライアント ID)]:「OKTA アプリケーションの作成」ステップで取得した OKTA クライアント ID を入力します。
f. [Client Secret (クライアントの秘密)]:「OKTA アプリケーションの作成」ステップで取得したOKTA クライアントの秘密を入力します。
g. [Authorization Request URL (承認リクエスト URL)]:OKTA openid 設定 URL に authorization_endpoint を指定します。
h. [Token Endpoint URL (トークンエンドポイント URL)]:OKTA openid 設定 URL に token_endpoint を指定します。
i. [Clients (クライアント)]:この OIDC にクライアントを設定すると、使用状況に応じてプレイヤーポータル/ランチャー/管理者ポータル/ゲーム内ログインに OIDC ログインを使用できます。たとえば、OIDC ログインをプレイヤーポータルおよび管理者ポータルに統合する場合は、プレイヤーポータルウェブサイト IAM クライアントと管理者ポータルウェブサイト IAM クライアントの両方をここに追加する必要があります。
j. [Scopes (Optional) (スコープ(オプション))]:デフォルトでは、[openid email profile (openid メールプロファイル)]になります。
すべて入力したら、[Next (次へ)]をクリックします。
ユーザーアイデンティティを ID トークンにマッピングすると、AccelByte アカウント内に構文解析できます。
(オプション)ドメインを登録するには、[Register Domain (ドメインを登録)]ボタンをクリックして、ユーザーにロールを付与します。その後、以下の項目を入力します。
a. [Domain Name (ドメイン名)]:
<your-domain>
例:accelbyte.net
。b. [Client (クライアント)]:ユーザーには、クライアントに最初にログインするときにデフォルトのロールが付与されます。たとえば、ユーザーが管理者ポータルで OIDC を使用してログインしたときに管理者ロールを付与する場合、[Admin Portal Website IAM Client (管理者ポータルウェブサイト IAM クライアント)]に設定します。
c. [Default Role (デフォルトのロール)]:ユーザーに付与するロール。
d. [**Default Namespace (デフォルトの名前空間)]:デフォルトのロールがグローバルロールでない場合は、ロールの対象となる名前空間を指定する必要があります。
ドメインの登録は、指定されたドメインのユーザーに自動的にロールを割り当てる場合に便利です。たとえば、OIDC ログインを管理者ポータルログインに使用すると、ユーザーが OIDC ログインを使用してログインした際に、
<your-domain>
下のユーザーに自動的にロールを許可します。
詳細ページにリダイレクトされます。その時点でアクティベートすると使用できます。
OIDC を使用したプレイヤーポータルからのユーザーログイン
[Publisher Namespace (パブリッシャーの名前空間)]で既に OIDC ログイン方法を設定し、[Player Portal Website Client (プレイヤーポータルウェブサイトクライアント)]を OIDC クライアントとして設定していることを確認してください。
プレイヤーポータルに移動し、[Login (ログイン)]をクリックします。
[More Login Options (その他のログインオプション)]をクリックします。
[Login with
<oidcplatform>
]をクリックします。[OKTA Login (OKTA ログイン)]ページにリダイレクトされるので、認証情報を入力してログインします。
これで、プレイヤーは OIDC アカウントを既存の AccelByte アカウントと、あるいは新しいアカウントとリンクするよう求められます。AccelByte では、これを設定可能にするための取り組みを進めています。この設定により、プレイヤーがヘッドレスアカウントでプレイヤーポータルに直接ログインできるようになります。
OIDC を使用した管理者ポータルからのユーザーログイン
[Publisher Namespace (パブリッシャーの名前空間)]で OIDC ログイン方法を設定し、[**Admin Portal Website Client (管理者ポータルウェブサイトクライアント)]を OIDC クライアントとして設定していることを確認してください。
管理者ポータルにアクセスするには、ユーザーに管理者ロールを付与する必要があります。既に OIDC ログイン方法にドメインを登録し、そのドメインに管理者ロールを付与している場合、登録ドメインの下にあるすべての OIDC ユーザーに、ドメインに与えたロールが付与されます。
管理者ポータルに移動すると、ログインページにリダイレクトされます。OIDC ロゴをクリックします。複数ある場合は、マウスカーソルをボタンに合わせて、正しい OIDC ログインを使用していることを確認します。
[OKTA Login (OKTA ログイン)]ページにリダイレクトされるので、認証情報を入力してログインします。
ログイン後、管理者ポータルにリダイレクトされ、付与されたロールに基づいてアクセスできます。たとえば、割り当てられたロールが Accelbyte の名前空間の管理者ポータル読み取り専用である場合、名前空間 Accelbyte でそのロールを使用して許可されているすべての機能にのみアクセスできます。
ゲーム内ログインの場合
ID トークンタイプ
Facebook OIDC を例として使用し、OIDC ゲーム内ログインを設定します。ゲーム内で OIDC ログインを設定するには、次の手順を実行します。これでプレイヤーは自分のアイデンティティプロバイダーアカウントを使用してゲームにサインインできます
AccelByte 管理者ポータルにログインし、[Game Namespace (ゲームの名前空間)]を選択し、[User Management (ユーザー管理)]サイドバーの下にある[Login Method (ログイン方法)]をクリックし、右側の[+ Add New (+新規を追加)]ボタンをクリックします。
[Create OIDC (OIDC を作成)]ボタンを選択します。
この例(Facebook OIDC)では、認証タイプとして[ID Token (IDトークン)]を使用します。次のセクションを入力する必要があります。 a. [**Platform Name (プラットフォーム名)]:わかりやすい名前、たとえば「oidcfacebook」を入力します。
b. [Platform ID (プラットフォーム ID)]:わかりやすい値、たとえば「oidcfacebook」を入力します。
c. [Authentication type (認証タイプ)]:[ID Token (ID トークン)]。
d. JWKS URL:Facebook OIDC を使用しているため、https://www.facebook.com/.well-known/oauth/openid/jwks/”を入力します。
e. [Issuer (発行元)]:Facebook OIDC を使用しているため、発行元としてhttps://www.facebook.com”を入力します。
すべて入力したら、[Next (次へ)]をクリックします。
ユーザーアイデンティティを ID トークンにマッピングすると、AccelByte アカウント内に構文解析できます。トークンクレームの詳細については、こちら(ScopeClaimsをご覧ください。
詳細ページにリダイレクトされます。その時点でアクティベートすると使用できます。
アクセストークンタイプ
OKTA OIDC を例として、OIDC ゲーム内ログインを設定します。ゲーム内で OIDC ログインを設定するには、次の手順を実行します。これでプレイヤーは自分のアイデンティティプロバイダーアカウントを使用してゲームにサインインできます
AccelByte 管理者ポータルにログインし、[Game Namespace (ゲームの名前空間)]を選択し、[User Management (ユーザー管理)]サイドバーの下にある[Login Method (ログイン方法)]をクリックし、右側の[+ Add New (+新規を追加)]ボタンをクリックします。
[Create OIDC (OIDC を作成)]ボタンを選択します。
この例(OKTA)では、[Access Token (アクセストークン)]を認証タイプとして使用します。次のセクションに入力する必要があります。 a. [Platform Name (プラットフォーム名)]:わかりやすい名前、たとえば「oidc okta access token」を入力します。
b. [Platform ID (プラットフォーム ID)]:わかりやすい値、たとえば「oktaaccesstoken」を入力します。
c. [Authentication type (認証タイプ)]:[Access Token (アクセストークン)]。
d. [UserInfo Endpoint (ユーザー情報エンドポイント)]:OKTA アプリケーションユーザー情報エンドポイント、たとえば
https://YOUR_OKTA_URL.okta.com/oauth2/v1/userinfo
を入力します。e. [HTTP Method (HTTP メソッド)]:アイデンティティプロバイダーが使用する、対応する HTTP メソッド、たとえば
GET
を入力します。すべて入力したら、[Next (次へ)]をクリックします。
- ユーザー情報エンドポイント応答でユーザーアイデンティティをマッピングすると、AccelByte アカウント内に構文解析できます。
詳細ページにリダイレクトされます。その時点でアクティベートすると使用できます。
IAM クライアントの作成
IAM クライアントとは、ターゲットプラットフォームでリリースしたいゲームクライアントのことです。IAM クライアントを使用すると、ゲームクライアントは適切な権限を使用して、保護されている AGS リソースへのアクセスを要求できます。
特定の SDK プラットフォーム(XBox/Steam/PlayStation など)でゲーム用の IAM クライアントを既にお持ちの場合は、新しい IAM クライアントを作成する必要はありません。アイデンティティプロバイダー (IdP) はゲームをビルドするためのプラットフォームではないため、既存の IAM クライアントを使用できます。IAM クライアントの詳細については、こちらのドキュメントhttps://docs.accelbyte.io/guides/access/iam-client.htmlを参照してください。
[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 (クライアント名)]を入力します。
<game name> <target platform>
といった特定の名前を名付けることができます。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 (プラットフォーム入力)]とは、ゲームをビルドするためのターゲットプラットフォームを意味します。
k. [Advanced Configuration (高度な設定)]は、二要素認証や有効期限の上書きなどの追加機能で構成されています。これはゲームクライアントビルド用なので、デフォルト/無効のままでかまいません。
注記クライアント ID は既に生成されていて、コピーできます。後ほどゲームをビルドする際に、SDK 設定でクライアント ID を使用できます。
3.[Client Detail (クライアントの詳細)]ページにリダイレクトされます。必要に応じて権限を設定してください。権限の詳細については、IAM クライアントの権限についてのドキュメントを参照してください。
ゲーム内ログイン手順
ゲームエンジンごとに設定が異なります。利用可能なタブからゲームエンジンを選択してください。
- Unreal Engine Instructions
- Unity Engine Instructions
Unreal Engineゲーム内ログインの統合
AccelByte SDK でサインインするようにゲームを統合すると、プレイヤーは OIDC 認証情報を使用してゲームにログインできます。すべてのアイデンティティプロバイダー (IdP) が UE4 の統合をサポートしているわけではありません。そのためこの実装ではウェブログインを使用します。
Unrealの準備と設定
依存関係の追加
最初に AccelbyteUe4Sdk と呼ばれる公開依存関係モジュールを追加する必要があります。この依存関係は、プロジェクトを統合してUnreal Engine 内で Accelbyte SDK プラグインを使用するために必要となります。
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", "HTTP" });
}
AccelbyteUe4Sdk を<YourProject>.Target.cs
と<YourProjectEditor>.Target.cs
の内部に追加します。
public ABThirdPartyLoginTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.AddRange( new string[] { "ABThirdPartyLogin", "AccelByteUe4Sdk" } );
}
public ABThirdPartyLoginEditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.AddRange( new string[] { "ABThirdPartyLogin", "AccelByteUe4Sdk" } );
}
OIDC ログインのためのUnreal Engine プロジェクト設定
DefaultEngine.ini ファイル内で、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://demo.accelbyte.io"
IamServerUrl="https://demo.accelbyte.io/iam"
PlatformServerUrl="https://demo.accelbyte.io/platform"
Unrealサンプルコードの実装
次のステップとして、以下のサンプルコードを使用してゲームの OIDC 認証方法を実装する方法を説明します。
BluePrint で WebBrowser アイテムをログインコンテナとして作成します。
ログイン OIDC URL を読み込み、以下の認証パラメータを追加します。
- redirect_uri:ログインが完了したときの RedirectURL。リダイレクトすると、BaseURL がゲームに入力した値に戻るからです (FRegistry::Settings.BaseUrl)。また、BaseUrl の値を OIDC デベロッパーポータルのリダイレクト URI 設定に入力して、ホワイトリストに登録します。
- response_type:値を "code" とします。
- scope:値として権限スコープを入力します
void UAccelByteAuth::OIDCLogin()
{
FString OIDCClientId = TEXT("<YOUR_CLIENT_ID>");
FString OIDCClientSecret = TEXT("<YOUR_CLIENT_SECRET>");
FString AuthorizationUrl = TEXT("<YOUR_AUTH_URL>");
FString TokenUrl = TEXT("<YOUR_TOKEN_URL>");
GConfig->GetString(TEXT("OIDCConfig"), TEXT("OIDCClientId"), OIDCClientId, GEngineIni);
FString RedirectUri = FRegistry::Settings.BaseUrl;
FString Scope = TEXT("Your_OIDC_Scope");
FString Url = FString::Printf(TEXT("https://your_domain?client_id=%s&redirect_uri=%s&response_type=%s&scope=%s"),
*FGenericPlatformHttp::UrlEncode(OIDCClientId),
*FGenericPlatformHttp::UrlEncode(RedirectUri),
TEXT("code"),
*FGenericPlatformHttp::UrlEncode(Scope));
WBrowser_OIDCAuth->LoadURL(Url);
WBrowser_OIDCAuth->OnUrlChanged.AddUniqueDynamic(this, &UAccelByteAuth::AccelByteLoginWithOIDC);
}
void UAccelByteAuth::AccelByteLoginWithOIDC(const FText& NewUrl)
{
FString Url = NewUrl.ToString();
FString RedirectUri = FRegistry::Settings.BaseUrl;
FString LoginCode = TEXT("");
if (Url.Contains(RedirectUri))
{
LoginCode = FGenericPlatformHttp::GetUrlParameter(Url, TEXT("code")).GetValue();
}
if (!LoginCode.IsEmpty())
{
const FString SdkTestPlatformId = TEXT("OIDCTest");
ExchangeAuthorizationCode(LoginCode, SdkTestPlatformId);
}
}
void UAccelByteAuth::ExchangeAuthorizationCode(const FString& AuthorizationCode, const FString& PlatformId)
{
// Construct the form data for token exchange
FString ClientId;
GConfig->GetString(TEXT("OIDCConfig"), TEXT("OIDCClientId"), ClientId, GEngineIni);
FString ClientSecret;
GConfig->GetString(TEXT("OIDCConfig"), TEXT("OIDCClientSecret"), ClientSecret, GEngineIni);
FString RedirectUri = FRegistry::Settings.BaseUrl;
TMap<FString, FString> FormFields;
FormFields.Add(TEXT("code"), AuthorizationCode);
FormFields.Add(TEXT("client_id"), ClientId);
FormFields.Add(TEXT("client_secret"), ClientSecret);
FormFields.Add(TEXT("redirect_uri"), RedirectUri);
FormFields.Add(TEXT("grant_type"), TEXT("authorization_code"));
// Convert form data to JSON
FString JsonPayload = FJsonObjectConverter::MapToJsonString(FormFields);
// Send the token exchange request
FString TokenUrl = TEXT("https://your_token_url");
FHttpModule* HttpModule = &FHttpModule::Get();
TSharedRef<IHttpRequest> Request = HttpModule->CreateRequest();
Request->SetURL(TokenUrl);
Request->SetVerb(TEXT("POST"));
Request->SetHeader(TEXT("Content-Type"), TEXT("application/json"));
Request->SetContentAsString(JsonPayload);
Request->OnProcessRequestComplete().BindUObject(this, &UAccelByteAuth::HandleTokenExchangeResponse);
Request->ProcessRequest();
}
void UAccelByteAuth::HandleTokenExchangeResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bSuccess)
{
if (bSuccess && Response.IsValid())
{
int32 ResponseCode = Response->GetResponseCode();
FString ResponseContent = Response->GetContentAsString();
if (ResponseCode == 200)
{
// Extract the access token from the response
FString AccessToken;
TSharedPtr<FJsonObject> JsonObject;
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(ResponseContent);
if (FJsonSerializer::Deserialize(Reader, JsonObject))
{
if (JsonObject->HasField(TEXT("access_token")))
{
AccessToken = JsonObject->GetStringField(TEXT("access_token"));
}
}
// Handle the access token
if (!AccessToken.IsEmpty())
{
// Access token successfully extracted
const FString SdkTestPlatformId = TEXT("oidcokta");
FRegistry::User.LoginWithOtherPlatform(SdkTestPlatformId, AccessToken, FVoidHandler::CreateWeakLambda(this, [this]()
{
// Handle Success Login
}),
FCustomErrorHandler::CreateWeakLambda(this, [](int32 ErrorCode, const FString& ErrorMessage, const FJsonObject& ErrorJson)
{
// Handle Error Login
}));
// Close Login Page (Hide WebBrowser)
}
}
else
{
// Failed to extract access token from the response
}
}
else
{
// Token exchange request failed with an error response code
}
}
else
{
// Token exchange request failed
}
}
このサンプルコードをプロジェクトに追加したら、プロジェクトをコンパイル、ビルド、実行します。以上です。
サンプルコードのテスト
以下にコードが動作し、OIDC とサンプルコードを使用してログインできることを示すスクリーンショットを提示します。
Unityゲーム内ログイン統合
OIDC を統合して AccelByte SDK でサインインすれば、プレイヤーは OIDC の認証情報を使用してゲームにログインできます。
準備と設定
AccelByte Gaming Services のためのUnityプロジェクト設定
Accelbyte-SDK をプロジェクトで正しく実行するには、Accelbyte 管理者ポータルで以前に作成した値を入力し、以下の各手順を実行する必要があります。
- AccelByteSDKConfig.json という名前のゲームクライアント設定ファイルを作成します。
- AccelByteSDKConfig.json ファイルをコピーし、[Assets/Resource (アセット/リソース)]ディレクトリのUnityプロジェクトディレクトリに追加します。
- ゲームに基づく情報を使用して AccelByteSDKConfig.json ファイルに入力します。JSON ファイルの例を以下に示します。
{
"Default": {
"Namespace": "<Your Game Namespace>",
"UsePlayerPrefs": true,//It will use Player Preferences
"EnableDebugLog": true,//Enable Debug Logging
"DebugLogFilter": "Log",//Type of Debug Log
"BaseUrl": "https://demo.accelbyte.io",
"RedirectUri": "http://127.0.0.1",
"AppId": "<Your AppId>",
"PublisherNamespace": "<Your Publisher Namespace>"
}
}
- AccelByteServerSDKConfig.json という名前のファイルを作成し、[Assets/Resource (アセット/リソース)]ディレクトリのUnityプロジェクトディレクトリに追加します。
- AccelByteServerSDKConfig.json を以下のコードで更新し、ゲームサーバーの設定に使用します。JSON ファイルの例を以下に示します。
{
"Default": {
"Namespace": "<Your Game Namespace>",
"BaseUrl": "https://demo.accelbyte.io",
"RedirectUri": "http://127.0.0.1"
}
}
- AccelByteSDKOAuthConfig.json と AccelByteServerSDKOAuthConfig.json という名前の 2 つのファイルを作成します。この両ファイルを[Assets/Resources (アセット/リソース)]ディレクトリの Unity プロジェクトディレクトリに追加します。これらの両 JSON ファイルの内容は次のとおりです。
{
"Default": {
"ClientId": "<Your IAM Client ID>",
"ClientSecret": "<Your IAM Client Secret>"
}
}
サンプルコードの実装
次のステップとして、以下のサンプルコードを使用してゲームの OIDC 認証方法を実装する方法を説明します。
OIDC API を呼び出すにはカスタム SDK を作成する必要があります。以下はその例です。
public class OidcAuthCodeLoginHandler : MonoBehaviour
{
[SerializeField] Button OidcAuthCodeLoginButton;
[SerializeField] Text LoginStatus;
[SerializeField] private string clientId = "<YOUR_CLIENT_ID>";
[SerializeField] private string clientSecret = "<YOUR_CLIENT_SECRET>";
[SerializeField] private string redirectUri = "<YOUR_REDIRECT_URI>";
[SerializeField] private string authorizationUrl = "<YOUR_OIDC_AUTH_URL>";
[SerializeField] private string tokenUrl = "YOUR_OIDC_TOKEN_URL";
string[] scopes = { "<YOUR_OIDC_SCOPE>" };
// AccelByte's Multi Registry references
private ApiClient apiClient;
private User user;
private string serverURL = "<YOUR_SERVER_URL>"; // Replace with your desired server URL
private HttpListener listener;
private void OnEnable()
{
LoginStatus.text = "Please Login";
OidcAuthCodeLoginButton.onClick.AddListener(() =>
{
LoginStatus.text = "Attempting Login";
StartLogin();
});
}
public void StartLogin()
{
string authorizationURL = $"{authorizationUrl}?response_type=code&client_id={clientId}&redirect_uri={redirectUri}&scope={string.Join(" ", scopes)}&state=foo";
// Start the local server
StartServer();
// Open the authorization URL in the default browser or WebView
Application.OpenURL(authorizationURL);
// Wait for the response URL from the local server
StartCoroutine(WaitForResponseURL());
}
private void StartServer()
{
listener = new HttpListener();
listener.Prefixes.Add(serverURL + "/");
listener.Start();
// Start a new thread to handle incoming HTTP requests
ThreadPool.QueueUserWorkItem(HandleRequests);
}
private string authorizationCode;
private void HandleRequests(object state)
{
while (listener.IsListening)
{
try
{
HttpListenerContext context = listener.GetContext();
string responseURL = context.Request.Url.ToString();
// Check if the response URL contains the authorization code
if (responseURL.Contains("code="))
{
// Extract the authorization code from the response URL
authorizationCode = ExtractAuthorizationCode(responseURL);
if (authorizationCode != null)
{
// Continue with your authentication flow using the authorization code
// Send a response to the browser indicating success
byte[] responseBytes = System.Text.Encoding.UTF8.GetBytes("Authorization code received");
context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length);
context.Response.OutputStream.Close();
// Stop the local server
listener.Stop();
listener.Close();
// Call ExchangeAuthorizationCode on the main Unity thread
UnityMainThreadDispatcher.Instance().Enqueue(ExchangeAuthorizationCode());
break;
}
}
}
catch (Exception e)
{
Debug.LogError("Error handling request: " + e.Message);
}
}
}
private IEnumerator WaitForResponseURL()
{
while (true)
{
yield return new WaitForSeconds(1f); // Adjust the wait time as needed
// Send a request to the local server to check if the response URL has been received
using (UnityWebRequest webRequest = UnityWebRequest.Get(serverURL))
{
yield return webRequest.SendWebRequest();
if (!webRequest.isNetworkError && !webRequest.isHttpError)
{
// Response received, break the loop
Debug.Log("Response URL received: " + webRequest.downloadHandler.text);
break;
}
}
}
}
private string ExtractAuthorizationCode(string responseURL)
{
// Extract the code parameter from the response URL
Uri uri = new Uri(responseURL);
string query = uri.Query;
int codeIndex = query.IndexOf("code=");
int stateIndex = query.IndexOf("&state=");
if (codeIndex >= 0)
{
if (stateIndex > codeIndex)
{
// Extract the authorization code without the state parameter
string authorizationCode = query.Substring(codeIndex + 5, stateIndex - (codeIndex + 5));
Debug.Log(authorizationCode);
return authorizationCode;
}
else
{
// State parameter not found, extract the authorization code until the end
string authorizationCode = query.Substring(codeIndex + 5);
Debug.Log(authorizationCode);
return authorizationCode;
}
}
return null;
}
private IEnumerator ExchangeAuthorizationCode()
{
WWWForm form = new WWWForm();
form.AddField("code", authorizationCode);
form.AddField("client_id", clientId);
form.AddField("client_secret", clientSecret);
form.AddField("redirect_uri", redirectUri);
form.AddField("grant_type", "authorization_code");
using (UnityWebRequest www = UnityWebRequest.Post(tokenUrl, form))
{
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.Success)
{
string responseJson = www.downloadHandler.text;
string accessToken = ExtractAccessToken(responseJson);
LoginStatus.text = "Got Access Token" + accessToken;
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<User, UserApi>();
Result<TokenData, OAuthError> loginResult = null;
user.LoginWithOtherPlatform(PlatformType.Oidcokta, accessToken, (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 Login With oidc : {loginResult.Value.ToJsonString()} ";
}
//Enable interaction with the Button again
OidcAuthCodeLoginButton.interactable = true;
});
}
else
{
Debug.Log($"Token request error: {www.error}");
}
}
}
private string ExtractAccessToken(string responseJson)
{
// Parse the JSON response to extract the access token
AccessTokenResponse accessTokenResponse = JsonUtility.FromJson<AccessTokenResponse>(responseJson);
// Extract the access token from the parsed response
string accessToken = accessTokenResponse.access_token;
return accessToken;
}
[System.Serializable]
public class AccessTokenResponse
{
public string access_token;
public int expires_in;
public string token_type;
}
}
以下のコードでは LoginWithOtherPlatform を扱っていますが、これは GetAuthSessionTicket メソッドから取得した認証トークンによるサードパーティのプラットフォームログインを処理する Accelbyte SDK の一部です。
// 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<User, UserApi>();
Result<TokenData, OAuthError> loginResult = null;
user.LoginWithOtherPlatform(PlatformType.Oidcokta, accessToken, (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 Login With oidc : {loginResult.Value.ToJsonString()} ";
}
//Enable interaction with the Button again
OidcAuthCodeLoginButton.interactable = true;
});
プロジェクトにログインハンドラスクリプトを追加すると、プロジェクトをコンパイルできます。
サンプルコードのテスト
これでプロジェクトをビルドし、実行することができます。以下にコードが動作し、OIDC と当社のテストアプリを使用してログインできることを示すスクリーンショットを提示します。