Steamworks ドキュメンテーション
ユーザー認証と所有権確認

概要

SteamworksではSteamユーザーのIDを認証し、アプリケーションの所有権を確認する複数のメソッドを公開しています。 このドキュメントでは、次のシナリオで使用されるそれぞれの認証方法について説明します:

Steam内でのユーザーの識別

すべてのSteamユーザーは、Steam IDとして知られる64ビットの数値IDで一意に識別できます。 Steamworks C++ APIでは、SteamIDはCSteamIDオブジェクトに含まれています。 現在のユーザーのSteamIDは ISteamUser::GetSteamIDを呼び出すと取得でき、その戻り値に対して CSteamID.ConvertToUint64()を呼び出すことで64ビットIDを取得できます。

以下の認証方法を使用すれば、ユーザーのSteam IDを安全に確認できます。

このドキュメントで紹介しているAPI

セッションチケット

セッションチケットは、ユーザーのゲームクライアントとその他複数のゲームクライアント (ピアツーピアでのマルチプレイヤーセッションなどにおける) 間あるいは、ゲームクライアントと(ISteamGameServer API ) 使用のリッスン/専用サーバーとの間でユーザーを確認するために使用可能な署名済みチケットです。 チケットは、現在のゲームと関連DLCの所有権の確認にも使用でき、ユーザーがVACで禁止されているかどうかの判断にも使えます。( Valve アンチチート (VAC) とゲーム禁止) 参照
セッションチケットは、 Steamworks Web API を使用してゲームクライアントと安全なバックエンドサーバー間におけるユーザーの確認にも使用できます。 セキュアサーバーがpartner.steam-api.comへのHTTPSリクエストを実行できることが必要です。

暗号化されたアプリケーションチケット

暗号化されたアプリケーションチケットは、ゲームクライアントと安全なバックエンドサーバー間におけるユーザーの確認に使用できます。 セッションチケットとは異なり、暗号化されたアプリケーションチケットの確認は、セキュアサーバーがHTTPSリクエストを実行できることを必要としません。 その代わり、チケットの確認にはセキュアサーバーによるC++ライブラリとプライベートな対称キーが使用されます。 このライブラリのWindowsとLinux用の32ビットと64ビットバージョンはSteamworks SDKのpublic/steam/libディレクトリ下にあります。
暗号化されたアプリケーションチケットを使用する前に、それぞれのタイトル毎にプライベートキーを作成する必要があります。 作成には、アプリケーションのランディングページから [Steamworks 設定を編集] を開き、[セキュリティ] タブのドロップダウンから [SDK 認証] を選択して下さい。 このキーは、タイトルのAppIDとそのタイトルのすべてのDLCに関連付けられます。

注: これらのキーは安全に保存し、何らかの方法でアプリケーション内で配布されることの無いようにしてください!

Steamworks Web API

Steamは、多数のSteamworks機能にアクセスする際に使用できるHTTPベースのWeb APIを公開しています。 APIは、ゲームクライアントまたはサーバー等のHTTPリクエストを作成できるすべてのアプリケーションからアクセスできるパブリックメソッドを含みます。 同時に、信頼できるバックエンドアプリケーションからのアクセス用に、認証の必要な保護されたメソッドも含みます。 Web APIの詳細は こちらを参照して下さい。

P2Pまたはゲームサーバー

セッションチケット

ユーザー認証

以下の手順では、セッションチケットを使用してユーザーのゲームクライアント (クライアントA) と別のクライアントまたはゲームサーバー (クライアントB) の間でユーザーの確認する方法を説明しています:

セッションチケットに関する重要事項
  • セッションチケットは一度のみ使用可能です。 マルチプレイヤーセッション内のチケットをリクエストする各クライアントに対して、 ISteamUser::GetAuthSessionTicketを呼び出す必要があります。
  • ピアツーピアのマルチプレイヤーセッション内でプレイヤーの認証に使用する場合、各ゲームクライアントはマルチプレイヤーセッション内の自分以外のゲームクライアントのIDを確認する必要があります。
  • セッションチケットの使用が終わるときは、ISteamUser::GetAuthSessionTicketから返されたすべてのハンドルに対してISteamUser::CancelAuthTicketを呼び出す必要があります。
  • クライアントAがISteamUser::CancelAuthTicketを呼び出す時、クライアントBはクライアントAのチケットが無効であることを示すISteamUser::ValidateAuthTicketResponse_tコールバックを受け取ります。
  • クライアントAがクライアントBとのゲームを退出するとき、クライアントAの ISteamUser::CancelAuthTicket呼び出しがクライアントBのISteamUser::EndAuthSession呼び出しよりも前に処理された場合、クライアントBはチケットがキャンセルされたことを示すISteamUser::ValidateAuthTicketResponse_tコールバックを受け取ります。 クライアントAが退出することに対する相互の合意が存在するため、このコールバックは無視できます。
  • ネットワークの状態によっては、SteamバックエンドがISteamUser::BeginAuthSession呼び出し元に対してコールバックを提供できない場合があります。 ISteamUser::BeginAuthSession の呼び出し元 (クライアントB) は、このコールバックを受信するまでクライアントAのIDが確認できたと仮定するべきではありませんが、マルチプレイヤーセッションの継続は許可してください。
  • ISteamUser::BeginAuthSessionの呼び出し元が、クライアントAのチケットが無効と示す ISteamUser::ValidateAuthTicketResponse_tコールバックを受け取った場合、 呼び出し元はクライアントAとのマルチプレイヤーセッションの継続を拒否しなければなりません。ゲーム内の他のピアーもクライアントAとのプレイを拒否しない場合でも、呼び出し元はマルチプレイヤーセッションを退出してください。
  • ISteamGameServerはゲームクライアントとゲームサーバー間で認証を行うのと同様のセッションチケットメソッドを公開しています。

所有権の確認

セッションチケットを使用するとき、Steamは自動で現在のAppIDの所有を確認します。 ユーザーが現在のAppIDを所有していない場合には、ISteamUser::ValidateAuthTicketResponse_tm_eAuthSessionResponseフィールドがk_EAuthSessionResponseNoLicenseOrExpiredに設定されます。 ユーザーのセッションチケットを取得してISteamUser::BeginAuthSessionに渡してから、ユーザーが特定のDLCを持っているかどうかを確認するためにISteamUser::UserHasLicenseForAppを使用できます。

バックエンドサーバー

セッションチケットとSteamworks Web API

ユーザー認証

以下の手順では、セッションチケットを使用してユーザーのゲームクライアントとセキュアサーバーの間でユーザーを確認する方法を説明しています:
  • クライアントは、ISteamUser::GetAuthSessionTicketを呼び出してセッションチケットを取得する必要があります。
  • 有効なチケットを保証するため、クライアントはISteamUser::GetAuthSessionTicketResponse_tコールバックを待つ必要があります。
  • クライアントはそのセッションチケットをセキュアサーバーに送信する必要があります。
  • セキュアサーバーはpartner.steam-api.comにHTTPSリクエストを作成し、 ISteamUserAuth/AuthenticateUserTicket Webメソッドを呼び出し、ユーザーのセッションチケットをHex エンコードされたUTF-8文字列として送信します。 このメソッドは、提供されたチケットが渡されるAppIDに関連付けられた Steam Web APIキー、またはWeb APIパブリッシャーキーを許可することにご注意ください。 このAPIへの将来のアップデートでは、Web APIパブリッシャーキーが提供された時に、呼び出し元にさらなる情報を返す可能性があります。
  • ユーザーのチケットが有効な場合、ISteamUserAuth/AuthenticateUserTicketがユーザーの64ビットSteamIDを返します。

所有権の確認

ユーザーのIDが確認された後、セキュアサーバーは ISteamUser/CheckAppOwnershipWeb APIメソッドを使ってユーザーが指定のAppIDを所有しているかどうかを確認できます。または、ISteamUser/GetPublisherAppOwnershipを呼び出して、提供されたパブリッシャーキーに関連付けられているユーザーが所有するAppIDのリストを取得できます。

暗号化されたアプリケーションチケット

ユーザー認証

以下の手順では、暗号化されたアプリケーションチケットを使用して、ユーザーのゲームクライアントとセキュアサーバーの間でユーザーを確認する方法を説明しています:

実装例は、SDK内のSteamworks APIのサンプルアプリケーション(SpaceWar)プロジェクトを参照してください。 特にCSpaceWarClient::RetrieveEncryptedAppTicketCSpaceWarClient::OnRequestEncryptedAppTicketです。

所有権の確認

Steamは、チケットが作成されたAppIDを持つユーザーに対してのみ暗号化されたアプリケーションチケットを作成します。 暗号化されたアプリケーションチケットの暗号を解読した後、セキュアサーバーは SteamEncryptedAppTicket::BIsTicketForAppを使ってタイトルのAppIDとチケットのAppIDがマッチすることを確認できます。 ユーザーが指定のダウンロードコンテンツ (DLC)を所有するかを判別するにはSteamEncryptedAppTicket::BUserOwnsAppInTicketを使うことができます。

WebブラウザベースのOpenID認証

Steamは、OpenID 2.0仕様書で記述されているOpenIDのプロバイダーです。 Webブラウザ内で、サードパーティWebサイトはOpenIDの使用によってユーザーのSteamIDを取得できます。SteamIDはサードパーティのWebサイトのログイン資格情報としての使用や、そのWebサイトの既存のアカウントへのリンク付けが可能です。

OpenIDの使用時、ユーザーはブラウザ内でサードパーティーWebサイトから開始します。 ユーザーがそのWebサイトでOpenIDを使用して自分のアカウントにログイン/リンクを希望する場合、サイトはユーザーをSteamコミュニティのWebサイトのログインフォームへ誘導します。 ユーザーがSteamログイン資格情報を入力すると、WebブラウザはリターンURLに特定のOpenIDデータを付加してサードパーティーWebサイトにリダイレクトします。 サイトのOpenIDライブラリは、次にこのデータを利用してユーザーのSteamIDを確認し取得することができます。

Steamはログインページにリンクする際に利用できる以下の画像をサードパーティーサイトに提供します:
sits_large_border.png

sits_large_noborder.png

sits_small.png

ユーザー認証

SteamのOpenID 2.0実装を利用して、ユーザーのSteamアカウントをサードパーティWebサイトのアカウントにリンクすることができます。
OpenID WebサイトからオープンソースのOpenIDライブラリのリストを参照できます。 OpenIDを使用したユーザーIDの確認には:
  • https://steamcommunity.com/openid/をSteamのOPエンドポイントURLとして使用するようにOpenIDライブラリを設定してください。
  • ユーザーが認証されると、そのユーザーのClaimed ID にはSteamIDが追加されます。 Steam Claimed IDの形式は : http://steamcommunity.com/openid/id/<steamid>です。

所有権の確認

ユーザーのIDが確認された後、セキュアサーバーは ISteamUser/CheckAppOwnershipWeb APIメソッドを使ってユーザーが指定のAppIDを所有しているかどうかを確認できます。または、ISteamUser/GetPublisherAppOwnershipを呼び出して、提供されたWeb APIパブリッシャーキーに関連付けられているユーザーが所有するAppIDのリストを取得できます。

サードパーティアカウントをSteamアカウントにリンクする

ユーザーのSteamIDをサードパーティアカウントを関連付けることで、サードパーティアカウントをSteamアカウントにリンクすることができます。

ユーザーのSteamIDはゲーム内あるいはWe ブラウザを通して安全に取得することができ、いったん関連付けが行われるとSteamIDを確認するだけで安全にサードパーティアカウントへのアクセスを許可をできるようになります。 この方法で、Steamユーザーのサードパーティアカウントシステムへの二次的なログインを行う必要性を排除できます。 更に、SteamIDが新しく作成された時には自動的に新しいサードパーティアカウントを作成してリンクすることができるので、Steamユーザーは二次的な認証が行われていることを意識しないですみます。 ユーザー体験をスムーズにし、新しいゲームをインストールして試すことへの弊害の可能性を取り除きつつ、単一のSteamアカウントでユーザーが所有するゲームへのアクセスを付与できるのです。

ゲーム内からのリンク付け

セッションチケットは、Steamworks Web APIを使ってゲームクライアントとセキュアなバックエンドサーバー間においてユーザーのID確認に使用できます。
  • クライアントは、ISteamUser::GetAuthSessionTicketを呼び出してセッションチケットを取得する必要があります。
  • 有効なチケットを保証するため、クライアントはISteamUser::GetAuthSessionTicketResponse_tコールバックを待つ必要があります。
  • クライアントはそのセッションチケットをセキュアサーバーに送信する必要があります。
  • セキュアサーバーはapi.steampowered.comにHTTPSリクエストを作成してISteamUserAuth/AuthenticateUserTicket Webメソッドを呼び出し、ユーザーのセッションチケットをHexエンコードされたUTF-8文字列として送信します。 このメソッドでは、提供されたチケットに対するAppIDが関連付けられた Web APIパブリッシャーキーが必要になる点にご注意ください。
  • ユーザーのチケットが有効な場合、 ISteamUserAuth/AuthenticateUserTicketがユーザーの64ビットSteamIDを返します。

Webブラウザからリンク付け

SteamはOpenID 2.0仕様をサポートしているため、ユーザーをSteamアカウントでWebサイトから安全にログインさせてSteamIDを取得することができます。 SteamでOpenIDを使用する方法についての詳細はOpenIDの使用を参照してください。

所有権の確認

ユーザーのIDが確認された後、セキュアサーバーは ISteamUser/CheckAppOwnershipWeb APIメソッドを使ってユーザーが指定のAppIDを所有しているかどうかを確認できます。または、ISteamUser/GetPublisherAppOwnershipを呼び出して、提供されたWeb APIパブリッシャーキーに関連付けられているユーザーが所有するAppIDのリストを取得できます。

サードパーティCDキーから ネイティブのSteam所有権チェックへの移行

Steamはそれ自体にタイトルにてユーザーを認証をできる方法が複数あり、サードパーティCDキーの必要性を排除しています。 一般的なCDキーの使用と それぞれの事例においてSteamとネイティブに統合する方法を紹介します:

プライベートフォーラムのアクセス

OpenIDを使用して、ユーザーに直接Steamアカウントでログインしてもらうのがいいでしょう。 OpenIDはユーザーの64ビットのSteamIDを返します。それをISteamUser/CheckAppOwnershipで使用すると、ユーザーが指定のAppIDを所有しているかを確認します。 詳細はサードパーティアカウントと Steamアカウントのリンクを参照してください。

非SteamゲームのDRM無しビルドをアンロックする

OpenIDとISteamUser/CheckAppOwnership (上記参照) を使うと、あなた自身のサイト上でコンテンツをアンロックできます。 または、DRM無しのビルドをオプションの無料DLCとしてアップロードできます。

ソフトウェアを自身の運営するWebサイトで販売し、キーを使ってアンロックしている場合

OpenIDを使用して、ユーザーに直接Steamアカウントでログインしてもらうのがいいでしょう。 OpenIDはユーザーの64ビットのSteamIDを返します。それをISteamUser/CheckAppOwnershipで使用すると、ユーザーが指定のAppIDを所有しているかを確認します。 詳細情報は上記のサードパーティアカウントをSteamアカウントにリンクするを参照してください。

サードパーティキーの登録に対して、ゲーム内アイテムをドロップする場合

Steamインベントリサービスをご利用の場合、アイテムのitemdefが正しくプロモーションアイテムとして設定され、クライアントから ISteamInventory::AddPromoItemを呼び出すようにしてください。
ゲームでアイテムバックエンドを用意した場合には、ゲームクライアントから ISteamUser::GetAuthSessionTicketを呼び出し、ユーザーの所有権を確認するためにISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnershipを使用できます。 詳細情報はこちらを参照してください。

キーでアンロックされるソフトウェアのバージョンをコントロールする場合

それぞれのゲームのバージョンにAppIDを持つ必要があります。 ゲームクライアントからISteamUser::GetAuthSessionTicketを呼び出しISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnershipを使って所有権を確認します。 詳細情報はこちらを参照してください。