Configuração da sessão

Uma sessão é uma conexão autenticada entre seu aplicativo cliente e a API da Vonage. Seu backend emite um JWT, e o Client SDK utiliza esse JWT em createSession().

Modelo de sessão

  • A API da Vonage controla o ciclo de vida da sessão.
  • O Client SDK não gera JWTs nem gerencia a emissão de tokens.
  • Seu backend continua sendo a fonte de referência para as políticas de identidade e acesso.

Fluxo de autenticação

Geração de JWT no backend

O exemplo a seguir ilustra a estrutura necessária do JWT. Sua implementação concreta irá variar de acordo com a linguagem e o framework do seu backend.

Os JWT devem ser gerados no seu servidor. A implementação exata depende do aplicativo.

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);

Criar uma sessão

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);
 }];

Duração da sessão

Uma sessão permanece ativa enquanto o JWT usado em createSession() é válida. A duração da sessão é definida pelo JWT exp sessão — seu backend determina a duração dessa sessão (mínimo de 30 segundos, máximo de 24 horas; o padrão é de 15 minutos, caso não seja definido explicitamente). O SDK não impõe nenhum tempo de vida (TTL) próprio para a sessão.

Para prorrogar uma sessão antes que o JWT expire, chame refreshSession(jwt) com um JWT novo. Muitos clientes geram JWTs de curta duração (15 minutos) e os atualizam a cada ~10 minutos a partir de seu backend.

Reconexão após uma desconexão temporária

Se a conexão do WebSocket for interrompida por qualquer motivo (perda de conexão, aplicativo suspenso, aba fechada), o backend marca a sessão como desconectada, mas a mantém ativa por aproximadamente 15 minutos para que o cliente possa se reconectar. Durante esse intervalo:

  • Ligar refreshSession(jwt) se você ainda estiver no estado do SDK (o SDK rastreia o ID da sessão internamente).
  • Ou ligue createSession(jwt, existingSessionId) se você perdeu o estado do SDK (por exemplo, ao reiniciar o aplicativo), mas armazenou manualmente o ID da sessão.

Em ambos os casos, o backend reproduz todos os eventos que ocorreram enquanto você estava desconectado (convites para chamadas recebidas, etc.), de modo que o cliente ainda possa atender uma chamada que tenha chegado durante o período de reconexão.

Após cerca de 15 minutos sem reconexão, a sessão é excluída e você deve ligar para createSession(jwt) com um JWT novo para iniciar um novo.

Veja Sessões do Vonage Client SDK para obter mais detalhes sobre o ciclo de vida da sessão.

TTL da sessão (15 minutos) e validade do JWT (exp (claim) são independentes. Um JWT pode ter validade superior a 15 minutos, mas a sessão ainda assim expira após 15 minutos, a menos que seja atualizada. Sempre atualize ou recrie a sessão antes que o TTL expire.

Tratamento de erros

createSession pode falhar por diversos motivos. Sempre lide com a função de retorno de chamada de erro:

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 ?? "")")
}

Para obter uma lista completa dos tipos de erros possíveis, consulte Erros.