セッションの設定

セッションとは、クライアントアプリとVonage APIとの間の認証済み接続のことです。バックエンドがJWTを発行し、Client SDKはそのJWTを使用して createSession().

セッションモデル

  • Vonage API はセッションのライフサイクルを管理します。
  • Client SDK は JWT を発行せず、トークンの発行も管理しません。
  • バックエンドは、引き続きIDおよびアクセスポリシーにおける「真実の源」となります。

認証フロー

バックエンドでのJWTの発行

以下の例は、必要なJWTの構造を示しています。実際の実装は、バックエンドの言語やフレームワークによって異なります。

JWTはサーバー側で生成する必要があります。具体的な実装方法はアプリケーションによって異なります。

const privateKeyPem =
  '-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----';

const payload: GuideJwtPayload = {
  application_id: applicationId,
  sub: userName,
  acl: {
    paths: {
      '/*/users/**': {},
      '/*/conversations/**': {},
      '/*/sessions/**': {},
      '/*/devices/**': {},
      '/*/image/**': {},
      '/*/media/**': {},
      '/*/applications/**': {}
    }
  },
  exp: Math.floor(Date.now() / 1000) + 60 * 60
};

const jwt = signJwt(payload, privateKeyPem);
console.log(jwt);

セッションの作成

client.setConfig({ region: ConfigRegion.EU });

try {
  const sessionId = await client.createSession(jwt);
  console.log(`Session created: ${sessionId}`);
} catch (error) {
  console.error('Failed to create session', error);
}
 val client = VoiceClient(ctx)

 val config = VGClientConfig(VGConfigRegion.EU)
 client.setConfig(config)

 client.createSession(jwt) { error, sessionId ->
     if (error != null) {
         println("Failed to create session: $error")
         return@createSession
     }

     println("Session created: $sessionId")
 }
 VoiceClient client = VoiceClient.createClient(ctx);

 VGClientConfig config = new VGClientConfig(ClientConfigRegion.EU);
 client.setConfig(config);

 client.createSession(jwt, null, (error, sessionId) -> {
     if (error != null) {
         System.out.println("Failed to create session: " + error);
         return null;
     }

     System.out.println("Session created: " + sessionId);
     return null;
 });
 let config = VGClientConfig(region: .EU)
 client.setConfig(config)

 client.createSession(jwt) { error, sessionId in
     guard error == nil, let sessionId = sessionId else {
         print("Failed to create session: \(error?.localizedDescription ?? "unknown")")
         return
     }

     print("Session created: \(sessionId)")
 }
 VGClientConfig *config = [[VGClientConfig alloc] initWithRegion:VGConfigRegionEU];
 [client setConfig:config];

 [client createSession:jwt callback:^(NSError * _Nullable error, NSString * _Nullable sessionId) {
     if (error != nil || sessionId == nil) {
         NSLog(@"Failed to create session: %@", error);
         return;
     }

     NSLog(@"Session created: %@", sessionId);
 }];

セッションの有効期間

セッションは、 createSession() が有効です。セッションの有効期間は、JWTの exp claim — その有効期間はバックエンドによって制御されます(最短30秒、最長24時間、明示的に設定されていない場合はデフォルトで15分)。SDK自体ではセッションのTTLを一切制限しません。

JWTの有効期限が切れる前にセッションを延長するには、以下を呼び出します。 refreshSession(jwt) 新しいJWTを使用して。多くの顧客は、有効期間が短い(15分)JWTを発行し、バックエンドから約10分ごとに更新しています。

一時的な接続切断後の再接続

何らかの理由(ネットワーク切断、アプリのサスペンド、タブの閉じなど)でWebSocketが切断された場合、バックエンドはセッションを「切断済み」としてマークしますが、約 15分 これにより、クライアントは再接続できるようになります。その期間中は:

  • 電話 refreshSession(jwt) SDKの状態がまだ残っている場合(SDKは内部でセッションIDを追跡しています)。
  • またはお電話ください createSession(jwt, existingSessionId) SDKの状態が失われた場合(アプリの再起動など)でも、セッションIDを自分で保持しておいた場合。

どちらの場合も、バックエンドは接続が切断されていた間に届いたイベント(着信招待など)をすべて再生するため、顧客は再接続の間に着信した電話に応答することができます。

再接続が行われないまま約15分が経過すると、セッションは削除されるため、以下の関数を呼び出す必要があります。 createSession(jwt) 新しいJWTを使用して、新たなセッションを開始します。

参照 Vonage Client SDK のセッション セッションのライフサイクルに関する詳細については、こちらをご覧ください。

セッションのTTL(15分)およびJWTの有効期限(exp (クレーム)は独立しています。JWTの有効期間は15分を超えることもありますが、リフレッシュされない限り、セッションは15分後に期限切れとなります。TTLが切れる前に、必ずセッションをリフレッシュするか、新たに作成してください。

エラー処理

createSession 失敗する原因はいくつか考えられます。必ずエラーコールバックを処理してください:

try {
  const sessionId = await client.createSession(token);
  console.log("Session created:", sessionId);
} catch (error) {
  // error is a VonageError with type and message
  console.error("Session creation failed:", error.type, error.message);
}
client.createSession(token) { error, sessionId ->
    if (error != null) {
        when {
            error.message?.contains("token") == true ->
                // Invalid or expired JWT — request a new one from your backend
                println("Token error: $error")
            error.message?.contains("already active") == true ->
                // Session already exists — call deleteSession first if you need a fresh session
                println("Session already active")
            else ->
                println("Session creation failed: $error")
        }
    } else {
        println("Session created: $sessionId")
    }
}
client.createSession(token) { error, sessionId in
    if let error = error {
        print("Session creation failed: \(error.localizedDescription)")
        return
    }
    print("Session created: \(sessionId ?? "")")
}

発生しうるエラーの種類の一覧については、以下を参照してください。 エラー.