Identidad de vinculación principal
El primer requisito de cualquier estrategia de progresión cruzada es determinar qué identidad de jugador abarcará las plataformas de juego. El jugador debe poder iniciar sesión con esta identidad en cualquier dispositivo en el que el juego esté disponible. Para un título de primera parte, suele ser la cuenta de Microsoft (MSA)/cuenta de XBOX. Para muchos terceros, probablemente sea una identidad del editor expuesta a través de una implementación de OpenID Connect. Los dos requisitos de esta identidad de jugador son:- Estar disponible para los jugadores en todas las plataformas en las que puedan jugar al juego
- Ser compatible con una llamada de inicio de sesión de PlayFab existente, como
LoginWithXboxoLoginWithOpenIdConnect
Identidad nativa de la plataforma
Una identidad nativa de la plataforma es el sistema de cuentas proporcionado por la plataforma en la que el jugador ejecuta el juego. Algunos ejemplos son:- Steam: cuenta de Steam y vale de autenticación (
ISteamUser::GetAuthTicketForWebApi) - XBOX en PC/consola:
XUserHandlede MSA/XBOX y token XSTS - PlayStation: identificador en línea/cuenta de PSN
- Nintendo: cuenta de servicio de Nintendo/identificador de dispositivo
PFLocalUserHandle para el jugador activo en un dispositivo determinado (por ejemplo, PFLocalUserCreateHandleWithSteamUser o encapsulando un XUserHandle). También se pueden usar para autenticarse mediante las API de inicio de sesión de PlayFab específicas del proveedor (por ejemplo, LoginWithSteam, LoginWithXbox) cuando corresponda.
En escenarios de progresión cruzada, las identidades nativas de la plataforma se vinculan a la identidad de vinculación principal, de modo que el progreso y los derechos siguen al jugador entre plataformas. Los flujos de trabajo recomendados en este documento usan la identidad nativa de la plataforma como contexto de usuario local y la identidad de vinculación principal como ancla multiplataforma.
Opciones de estrategia de vinculación
Este documento explora dos estrategias relacionadas:- Todos los jugadores están obligados a vincular su identidad nativa de la plataforma con su identidad de vinculación principal antes de jugar.
- La vinculación entre la identidad nativa de la plataforma y la identidad de vinculación principal es opcional, pero muy recomendada antes de jugar.
Estado deseado
Independientemente de la estrategia, el objetivo final es llevar a todos los jugadores al mismo estado. Su identidad de vinculación principal debe estar vinculada con la identidad nativa de la plataforma en todos los dispositivos en los que jueguen. En ese estado, el progreso está vinculado de forma coherente a la identidad de vinculación principal y las identidades nativas de la plataforma también pueden usarse como una identidad proxy eficaz de la identidad principal en todas las plataformas. En algunas plataformas, es posible que la identidad de vinculación principal sea la identidad nativa de la plataforma (juegos de primera parte que se ejecutan en una XBOX). En esos casos, resulta trivial alcanzar el estado deseado. Este documento no los explora en profundidad, ya que las instrucciones existentes de inicio de sesión y vinculación son adecuadas.LocalUser frente a inicio de sesión
Es importante diferenciar entre dos conceptos relacionados pero separados que existen dentro del SDK de PlayFab. Una llamada de LocalUserCreate construye un objeto de usuario local y devuelve un PFLocalUserHandle sin realizar ninguna autenticación. Identifica y almacena en caché al usuario mediante un identificador local específico de la plataforma o persistente (por ejemplo, encapsulando un XUserHandle) para que pueda reutilizar el mismo contexto local en distintas operaciones e instancias del juego. Esta operación es puramente local: no realiza solicitudes de red, no obtiene un token de entidad ni crea una cuenta de PlayFab. En cambio, una llamada de Login autentica al usuario local con PlayFab y establece una entidad autenticada, incluidos los tokens y los identificadores. La llamada de Login realiza solicitudes de red (como /Client/LoginWithXbox) y respeta marcadores como createAccount, y una vez que se realiza correctamente, el resultado se almacena en caché para que las llamadas posteriores puedan reutilizar el estado autenticado. En resumen, crear un usuario local configura la identidad local y la administración de identificadores necesarias para PlayFab Game Saves, mientras que iniciar sesión es el paso que contacta con PlayFab para autenticar y habilitar las API que requieren una entidad.Estrategia 1: vinculación obligatoria de la identidad principal
Con el fin de ilustrar esta estrategia, vamos a hablar de un juego de primera parte de XBOX publicado en Steam. El juego usa XBOX/MSA como identidad de vinculación principal. Requiere que todos los jugadores inicien sesión con su cuenta de XBOX/MSA antes de cualquier partida. Sigue usando un LocalUserHandle basado en la identidad de Steam, pero bloquea el inicio de sesión real hasta que el jugador haya creado y vinculado una identidad de XBOX. En los lanzamientos posteriores, puede continuar directamente con la identidad de Steam, ya que se ha comprobado que está vinculada.Resumen de alto nivel
- El jugador debe iniciar sesión con la identidad multiplataforma (XBOX/MSA) antes de jugar.
- Cree un jugador local a partir de la cuenta de la plataforma (Steam), pero retenga el juego en línea hasta que se complete el inicio de sesión de XBOX/MSA.
- Después del inicio de sesión de XBOX/MSA, vincule la cuenta de la plataforma a la cuenta multiplataforma.
- Actualice el perfil local de la plataforma para que esté conectado a la cuenta multiplataforma.
- Los lanzamientos futuros son fluidos: el jugador puede ir directamente a jugar porque el vínculo está establecido.
Explicación detallada
Cree un identificador de usuario local de Steam- Llame a
PFLocalUserCreateHandleWithSteamUser(serviceConfigHandle, customContext, outLocalUserHandle). - Resultado:
PFLocalUserHandle; todavía no hay autenticación.
- Llame a
PFLocalUserLoginAsync(localUserHandle, /*createAccount*/ false, async). - Al finalizar, si
PFLocalUserLoginGetResultfalla conE_PF_ACCOUNT_NOT_FOUND, desencadene el inicio de sesión de XBOX para arrancar la cuenta. - Si
PFLocalUserLoginGetResultse realiza correctamente, ya tenemos una cuenta en el estado deseado y está en línea. Flujo de trabajo completado.
Si su título requiere que la identidad multiplataforma permanezca vinculada al usuario actual (por ejemplo, el juego requiere el inicio de sesión de XBOX y espera que el vínculo de XBOX de la entidad coincida con la cuenta de XBOX con la sesión iniciada actualmente), un inicio de sesión correcto en la plataforma por sí solo no es suficiente. Llame a
PFAccountManagementClientGetAccountInfoAsync después del inicio de sesión para comprobar que el vínculo multiplataforma coincide con el usuario actual. Si no coincide, la entidad puede estar vinculada a una identidad multiplataforma obsoleta: siga los pasos de Inicio de sesión mediante XBOX y Vinculación de Steam que se indican a continuación para realinearla.- Cree
PFAuthenticationLoginWithXUserRequest:- Establezca
createAccount=truepara crear la cuenta de PlayFab si es necesario. - Proporcione el
XUserHandlede su usuario de XBOX con sesión iniciada en el PC.
- Establezca
- Llame a
PFAuthenticationLoginWithXUserAsync(serviceConfigHandle, request, async). - Complete con
PFAuthenticationLoginWithXUserGetResultSize(...)yPFAuthenticationLoginWithXUserGetResult(...)para obtenerPFEntityHandle. - Nota: Use
PFAuthenticationLoginWithXboxsi la variante LoginWithXUser no está disponible. Esto requiere que extraiga usted mismo el token XSTS delXUserHandle.
- Cree una solicitud de vinculación de cliente con el vale de autenticación de Steam actual (de
ISteamUser::GetAuthTicketForWebApio su equivalente en su integración; confirme el nombre exacto de la función en su código). - Llame a
PFAccountManagementClientLinkSteamAccountAsync(entityHandle, linkRequest, async). - Nota: “LinkSteamAccount” está en Account Management, no en Authentication.
- Después de que se realice correctamente, la identidad de Steam del jugador queda vinculada a la cuenta de PlayFab respaldada por XBOX.
- Llame de nuevo a
PFLocalUserLoginAsync(steamLocalUserHandle, /*createAccount*/ false, async). PFLocalUserLoginGetResultahora se realiza correctamente; elPFEntityHandleresultante queda enlazado al usuario local de Steam.
- Game Saves y otras API en línea usan el
PFEntityHandleautenticado. - Los lanzamientos posteriores del juego pueden ir directamente a jugar porque toda la vinculación está establecida.
PFLocalUserCreateHandleWithSteamUserno inicia sesión por sí solo, pero intentar llamar aPFGameSaveFilesAddUserWithUiAsyncgenera un intento de inicio de sesión. Asegúrese de haber pasado por el flujo de vinculación de cuentas antes de esa llamada.
Control de conflictos de vinculación
Pueden surgir dos conflictos distintos al vincular Steam a la entidad respaldada por XBOX. Cada uno requiere una solución diferente:
Flujo recomendado:
- Después del inicio de sesión de XBOX, llame a
PFAccountManagementClientGetAccountInfoAsync(xboxEntity, getInfoRequest, async)para obtener la información de la cuenta e inspeccionar las identidades vinculadas. - Si la entidad ya tiene vinculada una cuenta de Steam diferente:
- Advierta al jugador de que continuar quita la asociación antigua de Steam de esta entidad. Obtenga el consentimiento.
- Llame a
PFAccountManagementClientUnlinkSteamAccountAsync(xboxEntity, unlinkRequest, async)para quitar el vínculo de Steam existente. - Luego llame a
PFAccountManagementClientLinkSteamAccountAsynccon el vale de Steam actual.
- Si la llamada de vinculación devuelve
E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED(la cuenta de Steam pertenece a otra entidad):- Advierta al jugador de que esta cuenta de Steam está asociada a una cuenta de PlayFab diferente y de que vincularla aquí elimina esa asociación.
- Reintente con
forceLink=trueprevio consentimiento.
Flujo de ejemplo en C++ (barrera inicial de Steam, arranque con XBOX, vinculación de Steam, nuevo inicio de sesión con Steam):
Este ejemplo usa variables
static XAsyncBlock para simplificar la administración de la duración. El código de producción debe asignar los bloques asincrónicos dinámicamente (por ejemplo, como parte de la estructura de contexto) para admitir llamadas simultáneas o reentrantes.- Use
E_PF_ACCOUNT_NOT_FOUNDpara decidir la vía de arranque de XBOX; controle los demás errores por separado. - Siga usando el
PFLocalUserHandlede Steam; el inicio de sesión de XBOX específico del proveedor devuelve unentityHandleque se usa solo para vincular Steam. - Después de vincular, inicie sesión de nuevo con Steam para enlazar la entidad al LocalUser.
- Asegúrese de obtener un vale de Steam nuevo para la vinculación.
- Cierre los identificadores cuando ya no los necesite (
PFLocalUserCloseHandle,PFEntityCloseHandle).
Estrategia 2: vinculación opcional de la identidad principal
En este escenario, el juego se ejecuta en Steam y usa XBOX/MSA como identidad de vinculación principal. Los jugadores pueden empezar a jugar sin iniciar sesión inmediatamente en XBOX/MSA. El juego fomenta la vinculación temprana con ventajas y advertencias claras, pero el juego inicial no está bloqueado.Resumen de alto nivel
- Cree un jugador local con la cuenta de la plataforma (Steam) e intente jugar en línea sin crear una cuenta nueva.
- Si la conexión funciona, continúe; si no, ofrezca una elección:
- Iniciar sesión con la identidad multiplataforma (XBOX/MSA) para crear una cuenta unificada, o
- Crear ahora una cuenta solo de plataforma y empezar a jugar inmediatamente.
- Fomente la vinculación temprana con XBOX/MSA explicando las ventajas y los riesgos.
- Cuando el jugador elija vincular:
- Si la vinculación se realiza correctamente de forma directa, siga jugando con una cuenta unificada.
- Si la cuenta de XBOX/MSA ya tiene progreso en otro lugar, haga una pausa y pregunte qué progreso conservar (conciliación):
- Conservar el progreso de XBOX/MSA y asociar la cuenta de la plataforma actual.
- Conservar el progreso de la plataforma actual y aplazar la vinculación.
- Después de vincular, actualice el perfil local de la plataforma para que esté conectado a la cuenta unificada.
- Los lanzamientos futuros son fluidos: el jugador puede ir directamente a jugar (suponiendo que la vinculación no se haya aplazado).
Explicación detallada
Cree un identificador de usuario local de Steam- Llame a
PFLocalUserCreateHandleWithSteamUser(serviceConfigHandle, customContext, outLocalUserHandle). - Resultado:
PFLocalUserHandle; todavía no hay autenticación.
- Llame a
PFLocalUserLoginAsync(localUserHandle, /*createAccount*/ false, async). - Al finalizar:
- Si
PFLocalUserLoginGetResultse realiza correctamente, use elPFEntityHandleresultante y continúe en línea.- Compruebe si la cuenta respaldada por Steam ya está vinculada a XBOX/MSA. Llame a
PFAccountManagementClientGetAccountInfoAsync(entityHandle, getInfoRequest, async)e inspeccione las identidades vinculadas. Si no está vinculada, pida al jugador que vincule XBOX con el flujo que se indica a continuación (sin bloqueo), para que la progresión cruzada futura funcione sin problemas.
- Compruebe si la cuenta respaldada por Steam ya está vinculada a XBOX/MSA. Llame a
- Si
PFLocalUserLoginGetResultfalla conE_PF_ACCOUNT_NOT_FOUND, el jugador permanece sin conexión hasta que se cree una cuenta. Ofrezca dos opciones:- Crear ahora una cuenta de PlayFab respaldada por XBOX: inicie sesión con XBOX/MSA (por ejemplo,
PFAuthenticationLoginWithXUserAsync). - Iniciar sesión con Steam ahora y empezar a jugar: llame a
PFLocalUserLoginAsync(localUserHandle, /*createAccount*/ true, async)para crear una cuenta de PlayFab respaldada por Steam enlazada al identificador local; si se realiza correctamente, use elPFEntityHandleresultante para continuar en línea inmediatamente.
- Crear ahora una cuenta de PlayFab respaldada por XBOX: inicie sesión con XBOX/MSA (por ejemplo,
- Para otros errores, contrólelos correctamente (reintento/retroceso).
- Si
- Presente las ventajas de vincular (progresión cruzada, portabilidad de derechos).
- Ofrezca el inicio de sesión con XBOX/MSA.
- Si el jugador inicia la vinculación de XBOX más tarde (ya tiene un
PFEntityHandlerespaldado por Steam de la sesión actual):- No cree una cuenta respaldada por XBOX nueva.
- Intente vincular la identidad de XBOX directamente a la cuenta respaldada por Steam actual llamando a la API de vinculación adecuada (por ejemplo,
PFAccountManagementClientLinkXboxAccountAsync(currentSteamEntity, linkRequest, async)). - Si la vinculación se realiza correctamente, la identidad de XBOX/MSA queda vinculada; continúe con el funcionamiento normal.
- Si la vinculación falla con un error de vínculo preexistente/conflicto (la identidad de XBOX ya está vinculada en otro lugar), entre en el modo de conciliación de cuentas. Realice inmediatamente el inicio de sesión de XBOX/MSA con
createAccount=false(por ejemplo,PFAuthenticationLoginWithXUserAsync) para obtener elPFEntityHandlerespaldado por XBOX y luego recupere los metadatos del perfil para dar contexto antes de preguntar al jugador. Tras el consentimiento, continúe con las decisiones de vinculación.
- Si el jugador no tiene una cuenta existente para XBOX (vía de arranque):
- Primero intente el inicio de sesión de XBOX/MSA con
createAccount=falsemediantePFAuthenticationLoginWithXUserAsync(oPFAuthenticationLoginWithXboxAsynccuandoLoginWithXUserno esté disponible).- Si el inicio de sesión se realiza correctamente: la cuenta de XBOX/MSA ya tiene una cuenta de PlayFab y probablemente un progreso existente. Entre en el modo de conciliación de cuentas para elegir qué progreso conservar.
- Si el inicio de sesión falla con
E_PF_ACCOUNT_NOT_FOUND: continúe con la creación de la cuenta de PlayFab iniciando sesión de nuevo concreateAccount=true.
- Complete con
PFAuthenticationLoginWithXUserGetResultSize(...)yPFAuthenticationLoginWithXUserGetResult(...)para obtenerPFEntityHandle.
- Primero intente el inicio de sesión de XBOX/MSA con
- Aplicable cuando acaba de crear una cuenta de PlayFab respaldada por XBOX nueva (sin vínculos de Steam existentes).
- Si entró antes en la conciliación de cuentas, las decisiones de vinculación y las acciones de
forceLinknecesarias se controlan allí; omita este paso. - Cree una solicitud de vinculación de cliente con el vale de autenticación de Steam actual (de
ISteamUser::GetAuthTicketForWebApio su integración). - Llame a
PFAccountManagementClientLinkSteamAccountAsync(entityHandle, linkRequest, async)conforceLink=false(valor predeterminado). Se espera que esto se realice correctamente para una cuenta nueva. - Si la vinculación falla, trátela como una condición de error (conflicto inesperado o error de autenticación). Muestre un error al jugador y considere pedirle que inicie sesión de nuevo antes de reintentar.
- Después de que se realice correctamente, la identidad de Steam del jugador queda vinculada a la cuenta de PlayFab respaldada por XBOX.
- Llame de nuevo a
PFLocalUserLoginAsync(steamLocalUserHandle, /*createAccount*/ false, async). PFLocalUserLoginGetResultahora se realiza correctamente; elPFEntityHandleresultante queda enlazado al usuario local de Steam.
- Game Saves y otras API en línea usan el
PFEntityHandleautenticado. - Los lanzamientos posteriores del juego podrán ir directamente a jugar porque toda la vinculación está establecida.
- No bloquee el juego inicial con el inicio de sesión de XBOX/MSA; pídalo pronto, pero permita que los jugadores lo aplacen.
PFLocalUserCreateHandleWithSteamUserno inicia sesión por sí solo. Asegúrese de que los flujos de vinculación se completan antes de llamar a las API que desencadenan el inicio de sesión, comoPFGameSaveFilesAddUserWithUiAsync.
Conciliación de cuentas (progreso existente en XBOX/MSA)
Cuando un jugador inicia sesión con una cuenta de XBOX/MSA que ya tiene progreso (por ejemplo, de una consola u otra plataforma), debe evitar crear a ciegas una cuenta nueva o anular los vínculos existentes. Use un enfoque prudente en dos fases para detectar y conciliar.Fase de detección
- Se puede entrar en la conciliación por dos vías:
- Se detecta una cuenta de XBOX/MSA existente: intente el inicio de sesión de XBOX/MSA con
createAccount=false.- Si el inicio de sesión se realiza correctamente, la identidad de XBOX/MSA ya tiene una cuenta de PlayFab y probablemente un progreso existente: entre en la conciliación.
- Si el inicio de sesión falla con
E_PF_ACCOUNT_NOT_FOUND, continúe con el arranque (createAccount=true). No es necesario entrar en la conciliación.
- Se detecta un conflicto de vinculación tardía: al vincular XBOX/MSA a la cuenta respaldada por Steam actual, la vinculación falla con un error de vínculo preexistente/conflicto (la identidad de XBOX ya está vinculada a una identidad de Steam diferente).
- Realice inmediatamente el inicio de sesión de XBOX/MSA con
createAccount=false(por ejemplo,PFAuthenticationLoginWithXUserAsync) para obtener elPFEntityHandlerespaldado por XBOX. - Recupere los metadatos del perfil (por ejemplo, progresión reciente, ranuras de guardado, marcas de tiempo) para presentar contexto.
- Entre en la conciliación para decidir qué progreso conservar.
- Realice inmediatamente el inicio de sesión de XBOX/MSA con
- Se detecta una cuenta de XBOX/MSA existente: intente el inicio de sesión de XBOX/MSA con
Fase de conciliación
- Recomiende la opción sencilla: conservar el progreso de XBOX/MSA (identidad de vinculación principal) y abandonar el progreso local de Steam. Esto preserva el ancla multiplataforma y evita fusiones complejas.
- Los jugadores tienen en la práctica tres opciones (los juegos pueden decidir ofrecer solo 1 o 2 de ellas):
- Conservar el progreso de XBOX/MSA (recomendado): proceda a vincular la cuenta de Steam actual a la cuenta de PlayFab respaldada por XBOX existente.
- Conservar el progreso de Steam actual y cancelar la vinculación: continúe con la cuenta respaldada por Steam por ahora; no vincule ni anule los datos de XBOX/MSA. Ofrezca la vinculación de nuevo la próxima vez.
- Conservar el progreso de Steam actual y abandonar el progreso de XBOX: cambie a la cuenta respaldada por Steam y descarte intencionadamente el progreso de XBOX/MSA. Esta vía requiere una consideración explícita de diseño del juego y no debe intentarse a la ligera, especialmente si otras identidades nativas de la plataforma ya están asociadas a la cuenta de XBOX. En este documento no cubrimos los detalles de implementación de este escenario.
- Antes de confirmar:
- Llame a
PFAccountManagementClientGetAccountInfoAsyncpara la entidad de XBOX a fin de inspeccionar los vínculos de proveedor existentes y comprobar si ya existe un vínculo de Steam. - Si la entidad tiene vinculada una cuenta de Steam diferente, advierta al jugador de que esta asociación de Steam existente se quita de la entidad antes de poder agregar la nueva. Esto requiere llamar a
PFAccountManagementClientUnlinkSteamAccountAsyncantes de vincular la cuenta de Steam actual.forceLinkno resuelve este escenario. - Si la cuenta de Steam actual está vinculada a una entidad diferente, llamar a
PFAccountManagementClientLinkSteamAccountAsyncdevuelveE_PF_LINKED_ACCOUNT_ALREADY_CLAIMED. Advierta de que la vinculación aleja la identidad de Steam de la otra entidad y luego reintente conforceLink=trueprevio consentimiento.
- Llame a
Acciones de confirmación (según la elección del jugador)
- El jugador elige el progreso de XBOX/MSA:
- Asegúrese de haber obtenido la entidad de inicio de sesión de XBOX (realice
PFAuthenticationLoginWithXUserAsyncconcreateAccount=falsesi no se hizo ya durante la detección). - Si la entidad de XBOX ya tiene vinculada una cuenta de Steam diferente, llame primero a
PFAccountManagementClientUnlinkSteamAccountAsyncpara quitarla. - Vincule la cuenta de Steam actual a la cuenta respaldada por XBOX. Si la llamada devuelve
E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED(Steam está en otra entidad), reintente conforceLink=trueprevio consentimiento. - Inicie sesión de nuevo con el usuario local de Steam (
PFLocalUserLoginAsync(..., /*createAccount*/ false, ...)) para enlazar la entidad.
- Asegúrese de haber obtenido la entidad de inicio de sesión de XBOX (realice
- El jugador elige el progreso de Steam:
- Si todavía no existe una cuenta de PlayFab para Steam, créela/enlácela mediante
PFLocalUserLoginAsync(..., /*createAccount*/ true, ...). - Aplace el vínculo de XBOX; permita jugar inmediatamente. Ofrezca la vinculación de nuevo la próxima vez.
- Si todavía no existe una cuenta de PlayFab para Steam, créela/enlácela mediante
Notas
- Recupere y muestre siempre contexto suficiente para informar la decisión del jugador.
- Registre telemetría de los resultados de la conciliación para mejorar los avisos y los valores predeterminados con el tiempo.
