This document is about: PUN 2
SWITCH TO

PUN Classic (v1)、PUN 2、Boltはメンテナンスモードとなっております。Unity2022についてはPUN 2でサポートいたしますが、新機能が追加されることはありません。お客様のPUNプロジェクトおよびBoltプロジェクトが停止することはなく、将来にわたってパフォーマンス性能が落ちることはありません。 今後の新しいプロジェクトについては、Photon FusionまたはQuantumへ切り替えていただくようよろしくお願いいたします。

Photon Steam認証

アプリケーションのセットアップ

Steamは認証プロバイダとして簡単に追加でき、 追加はPhotonアプリケーションのダッシュボードから数秒で設定できます。
アプリケーションの「管理」ページに進み、「認証」セクションにスクロールダウンしてください。

新たな認証プロバイダをSteamに追加する場合、または既存の認証プロバイダを編集する場合には、以下の設定が必須です:

  • apiKeySecret: SteamパブリッシャーWeb APIのキーです。Steam User Keyと混同しないよう留意してください。取得の方法はこちらを参照してください。
  • appid: SteamゲームのID。Steam Directの処理後(旧 Steam Greenlight)にこのIDを取得できます。
  • verifyOwnership:trueまたはfalseの値となります:認証の際に所有権の検証を有効化するかを設定します。
    これによって、ユーザーが本当にそのゲームを所有しているか(ゲームを購入し、ライブラリにそのゲームを所有しているか)を検証できます。
    有効化されている場合には、この手順はユーザーのセッションチケットを認証後に実行されます。
    これを有効化すると、認証が遅延する可能性があります。このため、本当に必要な場合のみ有効化してください。
  • verifyVacBan: trueまたはfalseの値となります: 認証の際にValveのAnti-Cheat (VAC)を使用し、ユーザーが禁止されたか確認を設定できます。
    詳細はこちらを参照してください。
    これを有効化すると、認証が遅延する可能性があります。このため、本当に必要な場合のみ有効化してください。
  • verifyPubBan: trueまたはfalseの値となります:認証の際にPublisher Banを使用し、ユーザーが禁止されたか確認を設定できます。
    詳細はこちらを参照してください。
    これを有効化すると、認証が遅延する可能性があります。このため、本当に必要な場合のみ有効化してください。
  • version: 1または2の可能性があります(デフォルト値は1です)。バージョンが2に設定されている場合には、セッションチケットの検証にアイデンティティーパラメータが使用されます。アイデンティティーを使用していない場合には、1のままにします。
  • identity: バージョンが2に設定されている場合に使用されます。Steamworks SDK 1.57では、アイデンティティーパラメータを必要とするGetAuthTicketForWebAPIが追加されました。任意の文字列識別子(デフォルトは「photon」)を指定できます。

クライアントコード(Unity)

クライアントは、セッションチケットを取得するためにValveのSteamworks APIを使用する必要があります。
このチケットは、そのクライアントが有効なSteamユーザーであることの証明です。

Steamworks.NET

Steamworks.NETは一般的かつ無償のオープンソースSteamworks APIラッパーです。
Steamworks.NETのUnityバージョンをインポートするには、 このページに記載された手順に従ってください。

チケットを取得

C#

// hAuthTicket should be saved so you can use it to cancel the ticket as soon as you are done with it
public string GetSteamAuthTicket(out HAuthTicket hAuthTicket)
{
    byte[] ticketByteArray = new byte[1024];
    uint ticketSize;
    hAuthTicket = SteamUser.GetAuthSessionTicket(ticketByteArray, ticketByteArray.Length, out ticketSize);
    System.Array.Resize(ref ticketByteArray, (int)ticketSize);
    StringBuilder sb = new StringBuilder();
    for(int i=0; i < ticketSize; i++)
    {
        sb.AppendFormat("{0:x2}", ticketByteArray[i]);
    }
    return sb.ToString();
}

上記のアイデンティティーパラメータの説明を参照してください。バージョンが2に設定されている場合にはGetAuthSessionTicketではなくGetAuthTicketForWebAPIを使用する必要があります。

チケットを送信

クライアントはユーザーのセッションチケット(16進暗号化UTF-8文字列に変換後)をクエリ文字列キー「チケット」の値として送信する必要があります。

C#

PhotonNetwork.AuthValues = new AuthenticationValues();
PhotonNetwork.AuthValues.UserId = SteamUser.GetSteamID().ToString();
PhotonNetwork.AuthValues.AuthType = CustomAuthenticationType.Steam;
PhotonNetwork.AuthValues.AddAuthParameter("ticket", SteamAuthSessionTicket);
// do not set AuthValues.Token or authentication will fail
// connect

チケットをキャンセル

認証完了後に、チケットをキャンセルまたは無効化することを推奨します。

完全なスニペット

以下は最小限の自己完結的なサンプルコードであり、全体をコピー/ペーストしてそのまま使用することを意図したものではありません。

C#

using Photon.Pun;
using Photon.Realtime;
using Steamworks;

public class MinimalSteamworksPunAuth : MonoBehaviourPunCallbacks
{
    private HAuthTicket hAuthTicket;

    private void Start()
    {
        if (SteamManager.Initialized)
        {
            Connect();
        }
    }

    public void Connect()
    {
        string SteamAuthSessionTicket = GetSteamAuthTicket(out hAuthTicket);
        PhotonNetwork.AuthValues = new AuthenticationValues();
        PhotonNetwork.AuthValues.UserId = SteamUser.GetSteamID().ToString();
        PhotonNetwork.AuthValues.AuthType = CustomAuthenticationType.Steam;
        PhotonNetwork.AuthValues.AddAuthParameter("ticket", SteamAuthSessionTicket);
        PhotonNetwork.ConnectUsingSettings();
    }

    public override void OnConnectedToMaster()
    {
        CancelAuthTicket(hAuthTicket);
    }

    public override void OnCustomAuthenticationFailed(string errorMessage)
    {
        CancelAuthTicket(hAuthTicket);
    }

    // ticket should be saved so you can use it to cancel the ticket as soon as you are done with it
    private string GetSteamAuthTicket(out HAuthTicket ticket)
    {
        byte[] ticketByteArray = new byte[1024];
        uint ticketSize;
        ticket = SteamUser.GetAuthSessionTicket(ticketByteArray, ticketByteArray.Length, out ticketSize);
        System.Array.Resize(ref ticketByteArray, (int)ticketSize);
        StringBuilder sb = new StringBuilder();
        for(int i=0; i < ticketSize; i++)
        {
            sb.AppendFormat("{0:x2}", ticketByteArray[i]);
        }
        return sb.ToString();
    }

  private void CancelAuthTicket(HAuthTicket ticket)
  {
      if (ticket != null)
      {
          SteamUser.CancelAuthTicket(ticket);
      }
  }
}

Facepunch.Steamworks

Facepunch.Steamworksは、もう1つの代替的な無償かつオープンソースのSteamworks API実装です。
Facepunch.Steamworksをインポートするには、このページに記載された手順に従ってください。

チケットを取得

以下のコードでセッションチケットを取得してください。その後、そのチケットを16進暗号化UTF-8文字列に変換します:

C#

// authTicket should be saved so you can use it to cancel the ticket as soon as you are done with it
public string GetSteamAuthTicket(out AuthTicket authTicket)
{
    authTicket = SteamUser.GetAuthSessionTicket();
    StringBuilder ticketString = new StringBuilder();
    for (int i = 0; i < authTicket.Data.Length; i++)
    {
        ticketString.AppendFormat("{0:x2}", authTicket.Data[i]);
    }
    return ticketString.ToString();
}

チケットを送信

クライアントはユーザーのセッションチケット(16進暗号化UTF-8文字列に変換後)をクエリ文字列キー「チケット」の値として送信する必要があります。

C#

PhotonNetwork.AuthValues = new AuthenticationValues();
PhotonNetwork.AuthValues.UserId = SteamClient.SteamId.ToString();
PhotonNetwork.AuthValues.AuthType = CustomAuthenticationType.Steam;
PhotonNetwork.AuthValues.AddAuthParameter("ticket", steamAuthSessionTicket);
// connect

チケットをキャンセル

認証完了後に、チケットをキャンセルまたは無効化することを推奨します。

PUN 2の場合には最初のコールバックがトリガーされ、チケットは IConnectionCallbacks.OnConnectedでキャンセルできます:

C#

private void OnConnected()
{
    ticket.Cancel();
}

以下のような、他のコールバックでチケットをキャンセルすることも可能です: IConnectionCallbacks.OnConnectedToMaster, IConnectionCallbacks.OnCustomAuthenticationFail または IConnectionCallbacks.OnDisconnected.

完全なスニペット

以下は最小限の自己完結的なサンプルコードであり、全体をコピー/ペーストしてそのまま使用することを意図したものではありません。

C#

using Photon.Pun;
using Photon.Realtime;
using Steamworks;
using UnityEngine;

public class MinimalSteamworksPunAuth : MonoBehaviourPunCallbacks
{
    [SerializeField]
    private int steamAppId;
    private AuthTicket hAuthTicket;

    private void Awake()
    {
        try
        {
            SteamClient.Init(steamAppId);
        }
        catch (System.Exception e)
        {
            // Couldn't init for some reason - it's one of these:
            //     Steam is closed?
            //     Can't find steam_api dll?
            //     Don't have permission to play app?
        }
    }

    private void Start()
    {
        Connect();
    }

    public void Connect()
    {
        string steamAuthSessionTicket = GetSteamAuthTicket(out hAuthTicket);
        PhotonNetwork.AuthValues = new AuthenticationValues();
        PhotonNetwork.AuthValues.UserId = SteamClient.SteamId.ToString();
        PhotonNetwork.AuthValues.AuthType = CustomAuthenticationType.Steam;
        PhotonNetwork.AuthValues.AddAuthParameter("ticket", steamAuthSessionTicket);
        PhotonNetwork.ConnectUsingSettings();
    }

    public override void OnConnectedToMaster()
    {
        CancelAuthTicket(hAuthTicket);
    }

    public override void OnCustomAuthenticationFailed(string errorMessage)
    {
        CancelAuthTicket(hAuthTicket);
    }

    // ticket should be saved so you can use it to cancel the ticket as soon as you are done with it
    private string GetSteamAuthTicket(out AuthTicket ticket)
    {
        ticket = SteamUser.GetAuthSessionTicket();
        StringBuilder ticketString = new StringBuilder();
        for (int i = 0; i < ticket.Data.Length; i++)
        {
            ticketString.AppendFormat("{0:x2}", ticket.Data[i]);
        }
        return ticketString.ToString();
    }

    private void CancelAuthTicket(AuthTicket ticket)
    {
        if (ticket != null)
        {
            ticket.Cancel();
        }
    }

    private void Update()
    {
        SteamClient.RunCallbacks();
    }

    private void OnApplicationQuit()
    {
        SteamClient.Shutdown();
    }
}

Change History

June 20, 2023:

  • Added: description for Steam identity usage
Back to top