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のこのセクションにアクセスするためには、ユーザーはアプリにおける「署名管理」権限が必要です。
注意:これらのキーは安全に保管し、誤ってアプリケーション内で配布されることがないようにしてください!

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に渡した後に、ISteamUser::UserHasLicenseForAppを使用することでユーザーが特定のDLCを持っているかどうかを確認できます。

バックエンドサーバー

セッションチケットと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/です。

所有権の確認

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

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

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

ユーザーのSteamIDは、ゲーム内またはWebブラウザを通して安全に取得することができ、いったん関連付けが行われると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を使って所有権を確認します。 詳細はこちらをを参照してください。