Documentación de Steamworks
Autenticación de usuario y propiedad

Introducción

Steamworks ofrece varios métodos para autenticar la identidad de un usuario de Steam y verificar la propiedad de una aplicación. El siguiente documento describe cada uno de los métodos de autenticación usados en las siguientes situaciones:

Identificación de un usuario dentro de Steam

Cada usuario de Steam puede identificarse de forma única mediante un id. numérico de 64 bits conocido como id. de Steam. En las API C++ de Steamworks, el SteamID de un usuario se contiene dentro de un objeto CSteamID. Se puede recuperar el SteamID del usuario actual llamando a ISteamUser::GetSteamID y recuperando después el id. de 64 bits mediante una llamada a CSteamID.ConvertToUint64() con el valor devuelto.

Los siguientes métodos de autenticación sirven para verificar de forma segura el id. de Steam de un usuario.

API cubiertas en este documento

Tickets de sesión

Los tickets de sesión son tickets firmados que pueden utilizarse para verificar la identidad de un usuario entre el cliente de juego del usuario y otros clientes de juego (por ejemplo, en una sesión multijugador P2P) o un servidor de juego de escucha/dedicado (mediante la API ISteamGameServer). Estos tickets también pueden utilizarse para verificar la propiedad del juego actual y el contenido descargable relacionado, y para determinar si el usuario está sujeto a un bloqueo por VAC (véase Valve Anti-Cheat (VAC) y bloqueos de juego).
Los tickets de sesión se pueden emplear también para verificar la identidad de un usuario entre un cliente de juego y un servidor backend seguro usando la Web API de Steamworks. Requiere que el servidor seguro pueda hacer solicitudes HTTPS a partner.steam-api.com.

Tickets de aplicación cifrados

Los tickets de aplicación cifrados se pueden usar para verificar la identidad de un usuario entre un cliente de juego y un servidor backend seguro. A diferencia de lo que sucede con los tickets de sesión, para verificar tickets de aplicación cifrados no hace falta que el servidor seguro pueda hacer solicitudes HTTPS. En su lugar, el servidor seguro usa una biblioteca de C++ y una clave simétrica privada para verificar el ticket. El SDK de Steamworks incluye las versiones de 32 y 64 bits de esta librería para Windows y Linux en el directorio public/steam/lib.
Antes de usar tickets de aplicación cifrados, hay que generar una clave privada para cada título. Esto se puede hacer yendo a Editar ajustes de Steamworks para la aplicación en cuestión y seleccionando Autenticación de SDK desde el menú desplegable Seguridad. Esta clave quedará asociada al id. de aplicación del juego y a cualquier contenido descargable para él.

NOTA: ¡Estas claves deben almacenarse de manera segura y no se deben distribuir bajo ningún concepto dentro de la aplicación!

Web API de Steamworks

Steam tiene una Web API basada en HTTP que se puede usar para acceder a muchas características de Steamworks. La API contiene métodos públicos a los que se puede acceder desde cualquier aplicación capaz de realizar una solicitud HTTP, como un cliente de juego o un servidor. También contiene métodos protegidos que requieren autenticación y que están pensados para que accedan a ellos aplicaciones del backend. Se pueden encontrar más detalles sobre la Web API aquí.

Servidores de juego o P2P

Tickets de sesión

Autenticación de usuario

En los siguientes pasos se describe cómo usar los tickets de sesión para verificar la identidad de un usuario entre su cliente de juego (cliente A) y otro cliente o servidor de juego (cliente B):

Unas notas importantes sobre los tickets de sesión:
  • Los tickets de sesión solo se deben usar una vez. ISteamUser::GetAuthSessionTicket se llamará a la función para cada cliente en la sesión multijugador que solicite un ticket.
  • Cuando se usa para autenticar jugadores en una sesión multijugador P2P, cada cliente de juego debe verificar la identidad de cada uno de los demás en la sesión.
  • Al terminar con un ticket de sesión, hay que llamar a ISteamUser::CancelAuthTicket por cada identificador o handle devuelto por ISteamUser::GetAuthSessionTicket.
  • Cuando el cliente A llama a ISteamUser::CancelAuthTicket, el cliente B recibirá una devolución de ISteamUser::ValidateAuthTicketResponse_t y una llamada que dirá que el ticket del cliente A ya no es válido.
  • Cuando el cliente A deja una partida con el cliente B, si la llamada de A en ISteamUser::CancelAuthTicket se procesa antes que la llamada a B de ISteamUser::EndAuthSession, puede que este último reciba una devolución ISteamUser::ValidateAuthTicketResponse_t de llamada que dirá que el ticket se ha cancelado. Como existe el acuerdo mutuo de que el cliente A se marcha, se puede ignorar esta devolución de llamada.
  • Las condiciones de la red pueden impedir que el backend de Steam envíe la devolución de llamada a ISteamUser::BeginAuthSession quien llamó durante un periodo indefinido. Quien llamó a ISteamUser::BeginAuthSession (el cliente B) no debe asumir que conoce la auténtica identidad del cliente A hasta haber recibido esta devolución de llamada, pero sí permitir que continúe la sesión multijugador.
  • Si quien llamó a ISteamUser::BeginAuthSession recibe una devolución de ISteamUser::ValidateAuthTicketResponse_t llamada en la que se dice que el ticket del cliente A no es válido, deberá negarse a continuar la sesión con el cliente A. Si los demás participantes no se niegan tampoco a jugar con el cliente A, quien realizó la llamada deberá abandonar la sesión multijugador.
  • ISteamGameServer expone los mismos métodos del ticket de la sesión para realizar la autenticación entre un cliente de juego y un servidor de juego.

Verificación de propiedad

Al usar tickets de sesión, Steam verificará automáticamente la propiedad del id. de aplicación actual. Si el usuario no posee el id. de aplicación actual, de m_eAuthSessionResponse el campo de ISteamUser::ValidateAuthTicketResponse_t se ajustará a k_EAuthSessionResponseNoLicenseOrExpired. Tras recibir el ticket de sesión y pasarlo a ISteamUser::BeginAuthSession y ISteamUser::UserHasLicenseForApp se puede usar para determinar si el usuario posee un contenido descargable concreto.

Servidor backend

NOTA. Este método de autenticación de usuario no puede ser usado por juegos que utilizar el sistema antitrampas de Valve (VAC).

Tickets de sesión y la Web API de Steamworks

Autenticación de usuario

En los siguientes pasos se describe cómo usar los tickets de sesión para verificar la identidad de un usuario entre su cliente de juego y un servidor seguro:

Verificación de propiedad

Una vez verificada la identidad del usuario, un servidor seguro puede usar el método de la Web API ISteamUser/CheckAppOwnership para verificar si el usuario tiene un id. de aplicación concreto o llamar a ISteamUser/GetPublisherAppOwnership para obtener una lista con todos los id. de aplicación asociados a la Clave de editor dada.

Tickets de aplicación cifrados

Autenticación de usuario

En los siguientes pasos se describe cómo usar los tickets de aplicación cifrados para verificar la identidad de un usuario entre su cliente de juego y un servidor seguro:

Se puede encontrar un ejemplo de implementación en el proyecto Ejemplo de aplicación de la API de Steamworks (Spacewar!) del SDK. Específicamente a CSpaceWarClient::RetrieveEncryptedAppTicket y CSpaceWarClient::OnRequestEncryptedAppTicket.

Verificación de propiedad

Steam solo creará tickets de aplicación cifrados para los usuarios que posean el id. de aplicación para el que se creó el ticket. Tras descifrar un ticket de aplicación cifrado, el servidor seguro puede usar SteamEncryptedAppTicket::BIsTicketForApp para verificar que el id. de aplicación del ticket se corresponde con el del título. También puede usar SteamEncryptedAppTicket::BUserOwnsAppInTicket para determinar si el usuario posee una pieza especifica concreta de Contenido descargable (DLC).

Autenticación basada en navegador web con OpenID

Steam es un proveedor de OpenID, tal como se describe en la especificación OpenID 2.0. Dentro de un navegador web, el sitio web de un tercero puede usar OpenID para obtener el SteamID de un usuario, que se puede utilizar como credenciales de inicio de sesión en dicho sitio o vincular a una cuenta existente en él.

Al utilizar OpenID, el usuario comienza en un navegador web en el sitio de un tercero. Cuando quiere iniciar sesión en el sitio o vincular su cuenta a él usando OpenID, el sitio lo envía a un formulario de inicio de sesión en el sitio web de la Comunidad Steam. Una vez que el usuario ha introducido sus credenciales de inicio de sesión en Steam, el navegador web lo devuelve automáticamente al sitio del tercero, con datos OpenID adicionales anexados a la URL de regreso. A continuación, la librería OpenID puede usar estos datos para verificar y obtener el SteamID del usuario.

Steam facilita las siguientes imágenes a los sitios de terceros para que las usen en los enlaces a la página de inicio de sesión de Steam:
sits_large_border.png

sits_large_noborder.png

sits_small.png

Autenticación de usuario

Se puede usar la implementación de OpenID 2.0 de Steam para vincular la cuenta de Steam de un usuario a su cuenta en el sitio del tercero.
Se puede encontrar una lista de librerías de OpenID de código abierto en el sitio web de OpenID. Para verificar la identidad de un usuario con OpenID:
  • Configura tu librería de OpenID para que use la siguiente dirección como URL del punto de conexión OP de Steam: https://steamcommunity.com/openid/
  • Una vez autenticado un usuario, el id. asociado contendrá su SteamID. El formato del id. asociado en Steam es: http://steamcommunity.com/openid/id/<steamid>.

Verificación de propiedad

Una vez verificada la identidad del usuario, un servidor seguro puede usar el método de la Web API ISteamUser/CheckAppOwnership para verificar si el usuario tiene un id. de aplicación concreto, o llamar a ISteamUser/GetPublisherAppOwnership para obtener una lista con todos los id. de aplicación asociados a la Web API para editores dada.

Ejemplos

Vincular cuentas de terceros a cuentas de Steam

Se pueden vincular cuentas de terceros a cuentas de Steam asociando el SteamID de un usuario con su cuenta en un tercero.

Se puede recuperar de manera segura el SteamID de un usuario en el juego o a través de un navegador web y, una vez completada la asociación inicial, se puede autorizar sin peligro el acceso a la cuenta de terceros con solo verificar el id. de Steam. De este modo no hace falta que los usuarios de Steam inicien sesión en sistemas de cuentas de terceros. Además, si se pueden crear y vincular automáticamente nuevas cuentas de terceros al encontrarse con un nuevo SteamID, el usuario de Steam no tendrá ni que darse cuenta de que se está produciendo un proceso de autenticación secundario. En su lugar, la cuenta de Steam le permitirá acceder a todos sus juegos, lo que, además de brindarle una mejor experiencia de usuario, eliminará escollos potenciales a la hora de instalar y probar nuevos títulos.

Vinculación desde dentro de los juegos

Los tickets de sesión se pueden usar para verificar la identidad de un usuario entre un cliente de juego y un servidor backend seguro usando la Web API de Steamworks:

Vinculación desde un navegador web

Steam es compatible con la especificación OpenID 2.0, lo que permite a los usuarios iniciar sesión de manera segura en su cuenta de Steam desde otro sitio web y recuperar su SteamID. Hay información más detallada sobre el uso de OpenID con Steam en Usando el OpenID.

Verificación de propiedad

Una vez verificada la identidad del usuario, un servidor seguro puede usar el método de la Web API ISteamUser/CheckAppOwnership para verificar si el usuario tiene un id. de aplicación concreto, o llamar a ISteamUser/GetPublisherAppOwnership para obtener una lista con todos los id. de aplicación asociados a la clave de Web API para editores dada.

Migración desde las claves de CD de terceros a los sistemas de verificación de propiedad de Steam

Steam ofrece diferentes maneras de autentificar a los usuarios desde un título, lo que elimina la necesidad de contar con claves de CD de terceros. Hemos recopilado una lista de situaciones habituales en las que se usan claves de CD y, para cada una de ellas, ofrecemos una forma de conseguir el mismo resultado de manera nativa a través de Steam:

Acceso a foros privados

El objetivo es que los usuarios inicien sesión directamente con su cuenta de Steam usando OpenID. OpenID devolverá el SteamID de 64 bits del usuario, que a continuación podrá usarse con ISteamUser/CheckAppOwnership para verificar que dicho usuario posee realmente el id. de aplicación. Se pueden encontrar más detalles arriba, en Vincular cuentas de terceros a cuentas de Steam.

Desbloquear una compilación de un juego sin DRM que no está en Steam

Usa OpenID y ISteamUser/CheckAppOwnership (documentado arriba) para desbloquear el contenido desde tu propio sitio. También puedes cargar la compilación sin DRM como DLC gratuito opcional.

El software se vende en mi propio sitio web y se desbloquea con una clave

El objetivo es que los usuarios inicien sesión directamente con su cuenta de Steam usando OpenID. OpenID devolverá el SteamID de 64 bits del usuario, que a continuación podrá usarse con ISteamUser/CheckAppOwnership para verificar que dicho usuario posee realmente el id. de aplicación. Se puede encontrar más información en Vincular cuentas de terceros a cuentas de Steam.

Regalar artículos de juego por registrar una clave de terceros

Si se usa el servicio de inventario de Steam hay que asegurarse de que el ItemDef está debidamente configurado como artículo de promoción y llamar a la función ISteamInventory::AddPromoItem desde el cliente.
Si se tiene un backend de artículos propio, se puede llamar a ISteamUser::GetAuthSessionTicket desde el cliente de juego y usar ISteamUserAuth/AuthenticateUserTicket con ISteamUser/CheckAppOwnership para verificar la propiedad. Más información....

La clave determina qué versiones del software se desbloquean

Cada versión del juego debería tener su propio id. de aplicación. Desde el cliente de juego, se llama a ISteamUser::GetAuthSessionTicket y luego se usa ISteamUserAuth/AuthenticateUserTicket con ISteamUser/CheckAppOwnership para verificar la propiedad. Para más información....