Documentação do Steamworks
Autenticação de utilizador e posse

Vista geral

O Steamworks expõe vários métodos para autenticar a identidade de um utilizador do Steam e confirmar a posse de uma aplicação. O presente documento descreve cada um destes métodos de autenticação utilizadores nos seguintes cenários:

Identificação de um utilizador no Steam

Cada utilizador do Steam pode ser identificado de forma distinta através de um ID numérico de 64 bits, conhecido como o SteamID do utilizador. Nas APIs do Steamworks em C++, o SteamID de um utilizador é contido num objeto CSteamID. Pode obter o SteamID de 64 bits do utilizador atual ao chamar a função ISteamUser::GetSteamID e, de seguida, ao chamar CSteamID.ConvertToUint64() no valor retornado.

Os seguintes métodos de autenticação podem ser usados para confirmar de forma segura o SteamID de um utilizador.

APIs abrangidas neste documento

Tickets de sessão

Tickets de sessão são tickets assinados que podem ser usados para confirmar a identidade de um utilizador entre o cliente do jogo do utilizador e quaisquer outros clientes (como numa sessão multijogador P2P) ou um servidor dedicado/não dedicado (ao usar a API ISteamGameServer). Estes tickets também podem ser usados para confirmar a posse do jogo atual e DLC relacionado, assim como determinar se o utilizador foi banido pelo VAC (consulte Sistema antibatota da Valve (VAC) e banimentos em jogos).
Tickets de sessão também podem ser usados para confirmar a identidade de um utilizador entre o cliente do jogo e um servidor back‑end seguro através da Web API do Steamworks. Requer que o servidor seguro possa efetuar pedidos HTTPS a partner.steam-api.com.

Tickets de aplicação encriptados

Tickets de aplicação encriptados podem ser usados para confirmar a identidade de um utilizador entre o cliente do jogo do utilizador e um servidor back‑end seguro. Ao contrário do que acontece com tickets de sessão, confirmar tickets de aplicação encriptados não requer que o servidor seguro possa efetuar pedidos HTTPS. Em vez disso, uma biblioteca C++ e uma chave simétrica privada são usadas pelo servidor seguro para confirmar o ticket. O SDK do Steamworks inclui versões de 32 bits e de 64 bits da biblioteca para Windows e Linux no diretório public/steam/lib.

Antes de usar tickets de aplicação encriptados, terá de gerar uma chave privada para cada jogo. Para tal, aceda à página "Editar definições do Steamworks" referente à sua aplicação e, no separador "Segurança", selecione "Autenticação do SDK". Esta chave será associada ao AppID do jogo e a todos os DLCs associados. Para poder aceder a esta secção do Steamworks, o utilizador precisa de ter a permissão para "Gerir assinaturas" relativamente à aplicação em questão.
ATENÇÃO: estas chaves devem ser guardadas num local seguro e não devem ser distribuídas na aplicação!

Web API do Steamworks

O Steam expõe uma Web API baseada em HTTP que pode ser usada para aceder a várias funcionalidades do Steamworks. A API contém métodos públicos aos quais é possível aceder a partir de qualquer aplicação capaz de efetuar pedidos HTTP, como um servidor ou um cliente de jogo. A API também contém métodos protegidos que requerem autenticação e aos quais devem ser acedidos a partir de aplicações de back‑end confiáveis. Mais informações sobre a Web API estão disponíveis aqui.

P2P ou servidores de jogos

Tickets de sessão

Autenticação de utilizador

Os seguintes passos detalham como usar tickets de sessão para confirmar a identidade de um utilizador entre o cliente do jogo do utilizador (cliente A) e outro cliente ou servidor (cliente B):

Notas importantes sobre tickets de sessão:
  • Cada ticket de sessão só pode ser usado uma vez. A função ISteamUser::GetAuthSessionTicket deve ser chamada para cada cliente da sessão multijogador que pedir um ticket.
  • Quando usados para autenticar jogadores numa sessão multijogador P2P, cada cliente deve confirmar a identidade de todos os outros clientes na sessão.
  • Quando terminar de usar um ticket de sessão, a função ISteamUser::CancelAuthTicket deve ser chamada para cada handle retornado por ISteamUser::GetAuthSessionTicket.
  • Quando o cliente A chamar ISteamUser::CancelAuthTicket, o cliente B irá receber um callback ISteamUser::ValidateAuthTicketResponse_t a indicar que o ticket do cliente A já não é válido.
  • Quando o cliente A sair de uma partida em que o cliente B esteja, se a chamada do cliente A à função ISteamUser::CancelAuthTicket for processada antes da chamada do cliente B à função ISteamUser::EndAuthSession, o cliente B poderá receber um callback ISteamUser::ValidateAuthTicketResponse_t a indicar que o ticket foi cancelado. Como existe um acordo mútuo de que o cliente A está a sair, este callback pode ser ignorado.
  • Condições de rede podem impedir que o back‑end do Steam envie um callback ao autor da chamada à função ISteamUser::BeginAuthSession durante um período indefinido. Quem chamou a função ISteamUser::BeginAuthSession (cliente B) não deve supor que conhece a verdadeira identidade do cliente A até que este callback seja recebido, mas deve permitir que a sessão multijogador continue.
  • Se o autor da chamada à função ISteamUser::BeginAuthSession receber um callback ISteamUser::ValidateAuthTicketResponse_t a indicar que o ticket do cliente A é inválido, o autor deve recusar continuar a sessão multijogador com o cliente A. Se os outros peers na partida não recusarem jogar com o cliente A, quem chamou a função deve sair da sessão multijogador.
  • ISteamGameServer expõe os mesmos métodos de ticket de sessão para realizar autenticação entre um cliente e um servidor.

Confirmação de posse

Ao usar tickets de sessão, o Steam irá confirmar automaticamente a posse do AppID atual. Se o utilizador não possuir o AppID atual, o campo m_eAuthSessionResponse de ISteamUser::ValidateAuthTicketResponse_t terá o valor de k_EAuthSessionResponseNoLicenseOrExpired. Depois de receber um ticket de sessão de um utilizador e de o passar para a função ISteamUser::BeginAuthSession, a função ISteamUser::UserHasLicenseForApp pode ser usada para determinar se o utilizador possui um DLC específico.

Servidor back-end

Tickets de sessão e a Web API do Steamworks

Autenticação de utilizador

Os seguintes passos detalham como usar tickets de sessão para confirmar a identidade de um utilizador entre o cliente do jogo do utilizador e um servidor seguro:

Confirmação de posse

Assim que a identidade de um utilizador for confirmada, um servidor seguro pode usar o método ISteamUser/CheckAppOwnership da Web API para verificar se o utilizador tem um AppID específico, ou chamar ISteamUser/GetPublisherAppOwnership para obter uma lista de todos os AppIDs do utilizador associados à chave de editora fornecida.

Tickets de aplicação encriptados

Autenticação de utilizador

Os seguintes passos detalham como usar tickets de aplicação encriptados para confirmar a identidade de um utilizador entre o cliente do jogo do utilizador e um servidor seguro:

Um exemplo de implementação está disponível no projeto Aplicação de exemplo da API do Steamworks (Spacewar) incluído no SDK, especificamente CSpaceWarClient::RetrieveEncryptedAppTicket e CSpaceWarClient::OnRequestEncryptedAppTicket.

Confirmação de posse

O Steam só irá criar tickets de aplicação encriptados para utilizadores que tenham o AppID relacionado. Depois de desencriptar um ticket de aplicação encriptado, o servidor seguro pode usar SteamEncryptedAppTicket::BIsTicketForApp para confirmar se o AppID do ticket corresponde ao AppID do título. O servidor também pode usar SteamEncryptedAppTicket::BUserOwnsAppInTicket para determinar se o utilizador tem um DLC (conteúdo transferível) específico.

Autenticação baseada em browser da web com OpenID

O Steam é um fornecedor OpenID, como descrito na especificação OpenID 2.0. Num browser da web, um site de terceiros pode usar OpenID para obter o SteamID de um utilizador, que por sua vez pode ser usado como as credenciais de sessão para esse site ou associado a uma conta existente nesse site.

Ao usar OpenID, o utilizador começa no site de terceiros num browser da web. Quando o utilizador pretender iniciar sessão ou associar a respetiva conta ao site, via OpenID, o site encaminha o utilizador para um formulário de início de sessão no site da Comunidade Steam. Assim que o utilizador tiver introduzido as credenciais da conta Steam, o browser do utilizador será redirecionado automaticamente para o site de terceiros com dados específicos do OpenID anexados ao URL de regresso. De seguida, a biblioteca OpenID do site poderá usar estes dados para confirmar e obter o SteamID do utilizador.

O Steam disponibiliza as seguintes imagens para utilização por sites de terceiros como link para a página de início de sessão do Steam:
sits_large_border.png

sits_large_noborder.png

sits_small.png

Autenticação de utilizador

A implementação do OpenID 2.0 pelo Steam pode ser usada para associar a conta Steam de um utilizador à respetiva conta no site de terceiros.
Uma lista de bibliotecas OpenID open-source está disponível no site do OpenID. Para confirmar a identidade de um utilizador com o OpenID:
  • Configure a sua biblioteca OpenID para usar o seguinte URL de endpoint de fornecedor OpenID do Steam: https://steamcommunity.com/openid/
  • Assim que um utilizador for autenticado, o "Claimed ID" do utilizador irá conter o respetivo SteamID. O formato do "Claimed ID" é: http://steamcommunity.com/openid/id/<SteamID>.

Confirmação de posse

Assim que a identidade de um utilizador for confirmada, um servidor seguro pode usar o método ISteamUser/CheckAppOwnership da Web API para verificar se o utilizador tem um AppID específico, ou chamar ISteamUser/GetPublisherAppOwnership para obter uma lista de todos os AppIDs do utilizador associados à chave da Web API de editora fornecida.

Exemplos

Associação de contas de serviços de terceiros a contas Steam

Contas de serviços de terceiros podem ser associadas a contas Steam ao associar o SteamID de um utilizador à conta do serviço de terceiros.

O SteamID de um utilizador pode ser obtido de forma segura dentro do jogo ou via browser da web. Assim que a associação inicial tiver ocorrido, poderá permitir acesso seguro à conta do serviço de terceiros ao confirmar o SteamID do utilizador. Isto evita que utilizadores do Steam precisem de iniciar sessão com uma conta diferente em sistemas de terceiros. Além disso, se novas contas do serviço de terceiros puderem ser criadas e associadas automaticamente quando um novo SteamID é encontrado, o utilizador do Steam nuncá chegará sequer a saber que uma autenticação secundária existe. Em vez disso, a conta Steam pode conceder acesso a todos os jogos do utilizador, simplificando a experiência e removendo barreiras possíveis na instalação e experimentação de jogos novos.

Associação a partir do jogo

Tickets de sessão podem ser usados para confirmar a identidade de um utilizador entre o cliente do jogo do utilizador e um servidor back‑end seguro ao usar a Web API do Steamworks:

Associação a partir de um browser da web

O Steam é compatível com a especificação OpenID 2.0 para que os utilizadores possam iniciar sessão, de forma segura, com uma conta Steam no seu site. Para detalhes sobre como usar o OpenID com o Steam, consulte a secção Autenticação baseada em browser da web com OpenID.

Confirmação de posse

Assim que a identidade de um utilizador for confirmada, um servidor seguro pode usar o método ISteamUser/CheckAppOwnership da Web API para verificar se o utilizador tem um AppID específico, ou chamar ISteamUser/GetPublisherAppOwnership para obter uma lista de todos os AppIDs do utilizador associados à chave da Web API de editora fornecida.

Migração de códigos de produto de serviços de terceiros para verificações de posse nativas do Steam

O Steam em si oferece vários métodos pelos quais um jogo pode autenticar um utilizador, removendo a necessidade de um código de produto de um serviço de terceiros. Compilámos uma lista de casos de uso comum para códigos de produto e exemplos de como poderá implementar cada caso de forma nativa no Steam:

Acesso a fóruns privados

Faça com que os utilizadores iniciem sessão diretamente com a respetiva conta Steam via OpenID. O OpenID irá retornar o SteamID de 64 bits do utilizador, que poderá ser usado com o método ISteamUser/CheckAppOwnership para confirmar se o utilizador tem o AppID do seu jogo. Mais detalhes podem ser encontrados na secção Associação de contas de serviços de terceiros a contas Steam.

Acesso a uma versão não-Steam e sem DRM de um jogo

Utilize o OpenID e o método ISteamUser/CheckAppOwnership (documentado acima) para conceder acesso ao conteúdo no seu próprio site. Também pode enviar a versão sem DRM como um DLC opcional e gratuito.

Software vendido no site do developer e é disponibilizado através de um código

Faça com que os utilizadores iniciem sessão diretamente com a respetiva conta Steam via OpenID. O OpenID irá retornar o SteamID de 64 bits do utilizador, que poderá ser usado com o método ISteamUser/CheckAppOwnership para confirmar se o utilizador tiver o AppID do seu jogo. Mais detalhes podem ser encontrados na secção Associação de contas de serviços de terceiros a contas Steam acima.

Distribuição de itens no jogo por ativação de código de produto de um serviço de terceiros

Caso esteja a usar o Serviço de Inventário Steam, assegure-se de que a definição do item (itemdef) está configurada corretamente como um item promocional e chame ISteamInventory::AddPromoItem a partir do jogo.
Se tiver o seu próprio servidor de itens, pode chamar ISteamUser::GetAuthSessionTicket a partir do jogo e depois usar ISteamUserAuth/AuthenticateUserTicket com ISteamUser/CheckAppOwnership para confirmar a posse. Mais informações...

O código controla qual a versão do software disponibilizada

Cada versão do seu jogo deve ter um AppID distinto. A partir do jogo, chame ISteamUser::GetAuthSessionTicket e use ISteamUserAuth/AuthenticateUserTicket com ISteamUser/CheckAppOwnership para confirmar a posse. Mais informações...