Identidade de vinculação principal
O primeiro requisito de qualquer estratégia de progressão entre plataformas é determinar qual identidade do jogador abrangerá as plataformas de jogo. O jogador precisa conseguir entrar com essa identidade em qualquer dispositivo em que o jogo esteja disponível. Para um título first-party, geralmente é a conta Microsoft (MSA)/conta XBOX. Para muitos terceiros, provavelmente é uma identidade do publicador exposta por meio de uma implementação do OpenID Connect. Os dois requisitos para essa identidade do jogador são:- Estar disponível para os jogadores em todas as plataformas nas quais eles possam jogar o jogo
- Ter suporte de uma chamada de login existente do PlayFab, como
LoginWithXboxouLoginWithOpenIdConnect
Identidade nativa da plataforma
Uma identidade nativa da plataforma é o sistema de contas fornecido pela plataforma na qual o jogador está executando o jogo. Os exemplos incluem:- Steam: conta da Steam e tíquete de autenticação (
ISteamUser::GetAuthTicketForWebApi) - XBOX no PC/console:
XUserHandleda MSA/XBOX e token XSTS - PlayStation: ID online/conta da PSN
- Nintendo: Nintendo Service Account/ID do dispositivo
PFLocalUserHandle para o jogador ativo em um determinado dispositivo (por exemplo, PFLocalUserCreateHandleWithSteamUser ou encapsulando um XUserHandle). Elas também podem ser usadas para autenticar por meio de APIs de login do PlayFab específicas do provedor (por exemplo, LoginWithSteam, LoginWithXbox), quando apropriado.
Em cenários de progressão entre plataformas, as identidades nativas da plataforma são vinculadas à identidade de vinculação principal, para que o progresso e os direitos acompanhem o jogador entre plataformas. Os fluxos de trabalho recomendados neste documento usam a identidade nativa da plataforma como contexto do usuário local e a identidade de vinculação principal como âncora entre plataformas.
Opções de estratégia de vinculação
Este documento explora duas estratégias relacionadas:- Todos os jogadores são obrigados a vincular sua identidade nativa da plataforma à sua identidade de vinculação principal antes de jogar.
- A vinculação entre a identidade nativa da plataforma e a identidade de vinculação principal é opcional, mas fortemente incentivada antes de jogar.
Estado desejado
Independentemente da estratégia, o objetivo final é colocar todos os jogadores no mesmo estado. A identidade de vinculação principal deles deve estar vinculada à identidade nativa da plataforma em todos os dispositivos em que eles jogam. Nesse estado, o progresso fica consistentemente ligado à identidade de vinculação principal, e as identidades nativas da plataforma também podem ser usadas como uma identidade substituta eficaz da identidade principal em todas as plataformas. Em algumas plataformas, é possível que a identidade de vinculação principal seja a identidade nativa da plataforma (jogos first-party em execução em um XBOX). Nesses casos, atingir o estado desejado se torna trivial. Este documento não explora esses casos em profundidade, pois as orientações existentes de entrada e vinculação são adequadas.LocalUser versus login
É importante diferenciar dois conceitos relacionados, mas separados, que existem no SDK do PlayFab. Uma chamada LocalUserCreate constrói um objeto de usuário local e retorna um PFLocalUserHandle sem realizar nenhuma autenticação. Ela identifica e armazena em cache o usuário por uma ID local específica da plataforma ou persistida (por exemplo, encapsulando um XUserHandle), para que você possa reutilizar o mesmo contexto local entre operações e instâncias do jogo. Essa operação é puramente local: ela não faz solicitações de rede, não obtém um token de entidade nem cria uma conta do PlayFab. Por outro lado, uma chamada de login autentica o usuário local no PlayFab e estabelece uma entidade autenticada, incluindo tokens e IDs. A chamada de login faz solicitações de rede (como /Client/LoginWithXbox) e respeita sinalizadores como createAccount; depois de bem-sucedida, o resultado é armazenado em cache para que as chamadas subsequentes possam reutilizar o estado autenticado. Em resumo, criar um usuário local configura a identidade local e o gerenciamento de identificadores necessários para o PlayFab Game Saves, enquanto o login é a etapa que entra em contato com o PlayFab para autenticar e habilitar as APIs que exigem uma entidade.Estratégia 1: vinculação obrigatória da identidade principal
Para ilustrar essa estratégia, vamos discutir um jogo first-party do XBOX lançado na Steam. O jogo usa XBOX/MSA como sua identidade de vinculação principal. Ele exige que todos os jogadores entrem com sua conta XBOX/MSA antes de qualquer jogabilidade. Ele ainda usa um LocalUserHandle baseado na identidade da Steam, mas bloqueia o login real até que o jogador tenha criado e vinculado uma identidade XBOX. Nas próximas inicializações, ele pode prosseguir diretamente usando a identidade da Steam, pois ela foi verificada como vinculada.Resumo de alto nível
- O jogador deve entrar com a identidade entre plataformas (XBOX/MSA) antes de jogar.
- Crie um jogador local a partir da conta da plataforma (Steam), mas suspenda o jogo online até que a entrada com XBOX/MSA seja concluída.
- Após a entrada com XBOX/MSA, vincule a conta da plataforma à conta entre plataformas.
- Atualize o perfil local da plataforma para que ele fique conectado à conta entre plataformas.
- As próximas inicializações são contínuas: o jogador pode ir direto para o jogo porque o vínculo está estabelecido.
Passo a passo detalhado
Criar um identificador de usuário local da Steam- Chame
PFLocalUserCreateHandleWithSteamUser(serviceConfigHandle, customContext, outLocalUserHandle). - Resultado:
PFLocalUserHandle; ainda sem autenticação.
- Chame
PFLocalUserLoginAsync(localUserHandle, /*createAccount*/ false, async). - Na conclusão, se
PFLocalUserLoginGetResultfalhar comE_PF_ACCOUNT_NOT_FOUND, dispare a entrada com o XBOX para inicializar a conta. - Se
PFLocalUserLoginGetResulttiver êxito, já temos uma conta no estado desejado e ela está online. Fluxo de trabalho concluído.
Se o seu título exigir que a identidade entre plataformas permaneça vinculada ao usuário atual (por exemplo, o jogo exige a entrada com o XBOX e espera que o vínculo XBOX da entidade corresponda à conta XBOX conectada no momento), um login bem-sucedido na plataforma por si só não é suficiente. Chame
PFAccountManagementClientGetAccountInfoAsync após o login para verificar se o vínculo entre plataformas corresponde ao usuário atual. Se não corresponder, a entidade pode estar ligada a uma identidade entre plataformas desatualizada; siga as etapas Entrar via XBOX e Vincular a Steam abaixo para realinhar.- Crie
PFAuthenticationLoginWithXUserRequest:- Defina
createAccount=truepara criar a conta do PlayFab, se necessário. - Forneça o
XUserHandledo seu usuário XBOX conectado no PC.
- Defina
- Chame
PFAuthenticationLoginWithXUserAsync(serviceConfigHandle, request, async). - Conclua com
PFAuthenticationLoginWithXUserGetResultSize(...)ePFAuthenticationLoginWithXUserGetResult(...)para obterPFEntityHandle. - Observação: use
PFAuthenticationLoginWithXboxse a variante LoginWithXUser não estiver disponível. Isso exige que você mesmo extraia o token XSTS doXUserHandle.
- Crie uma solicitação de vínculo de cliente com o tíquete de autenticação atual da Steam (de
ISteamUser::GetAuthTicketForWebApiou equivalente na sua integração; confirme o nome exato da função no seu código). - Chame
PFAccountManagementClientLinkSteamAccountAsync(entityHandle, linkRequest, async). - Observação: “LinkSteamAccount” fica em Account Management, não em Authentication.
- Após o êxito, a identidade da Steam do jogador estará vinculada à conta do PlayFab baseada no XBOX.
- Chame
PFLocalUserLoginAsync(steamLocalUserHandle, /*createAccount*/ false, async)novamente. PFLocalUserLoginGetResultagora tem êxito; oPFEntityHandleresultante fica associado ao usuário local da Steam.
- O Game Save e outras APIs online usam o
PFEntityHandleautenticado. - As próximas inicializações do jogo podem ir direto para o jogo, pois toda a vinculação está estabelecida.
PFLocalUserCreateHandleWithSteamUsernão faz login sozinho, mas tentar chamarPFGameSaveFilesAddUserWithUiAsyncresulta em uma tentativa de login. Verifique se você passou pelo fluxo de vinculação de contas antes dessa chamada.
Tratamento de conflitos de vínculo
Dois conflitos distintos podem surgir ao vincular a Steam à entidade baseada no XBOX. Cada um exige uma solução diferente:
Fluxo recomendado:
- Após a entrada com o XBOX, chame
PFAccountManagementClientGetAccountInfoAsync(xboxEntity, getInfoRequest, async)para buscar as informações da conta e inspecionar as identidades vinculadas. - Se a entidade já tiver uma conta da Steam diferente vinculada:
- Avise o jogador que prosseguir removerá a antiga associação da Steam desta entidade. Obtenha o consentimento.
- Chame
PFAccountManagementClientUnlinkSteamAccountAsync(xboxEntity, unlinkRequest, async)para remover o vínculo existente da Steam. - Em seguida, chame
PFAccountManagementClientLinkSteamAccountAsynccom o tíquete atual da Steam.
- Se a chamada de vínculo retornar
E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED(a conta da Steam pertence a outra entidade):- Avise o jogador que esta conta da Steam está associada a uma conta do PlayFab diferente e que vinculá-la aqui removerá essa associação.
- Tente novamente com
forceLink=trueapós o consentimento.
Exemplo de fluxo em C++ (bloqueio inicial com Steam, inicialização com XBOX, vinculação da Steam, novo login com Steam):
Este exemplo usa variáveis
static XAsyncBlock para simplificar o gerenciamento do tempo de vida. O código de produção deve alocar os blocos assíncronos dinamicamente (por exemplo, como parte do struct de contexto) para dar suporte a chamadas simultâneas ou reentrantes.- Use
E_PF_ACCOUNT_NOT_FOUNDpara decidir o caminho de inicialização com o XBOX; trate os outros erros separadamente. - Continue usando o
PFLocalUserHandleda Steam; o login específico do provedor XBOX retorna umentityHandleusado apenas para vincular a Steam. - Após a vinculação, faça login com a Steam novamente para associar a entidade ao LocalUser.
- Obtenha um tíquete novo da Steam para a vinculação.
- Feche os identificadores quando não forem mais necessários (
PFLocalUserCloseHandle,PFEntityCloseHandle).
Estratégia 2: vinculação opcional da identidade principal
Neste cenário, o jogo é executado na Steam e usa XBOX/MSA como a identidade de vinculação principal. Os jogadores podem começar a jogar sem entrar imediatamente com XBOX/MSA. O jogo incentiva a vinculação antecipada com benefícios e avisos claros, mas a jogabilidade inicial não é bloqueada.Resumo de alto nível
- Crie um jogador local usando a conta da plataforma (Steam) e tente jogar online sem criar uma nova conta.
- Se o modo online funcionar, continue; caso contrário, ofereça uma escolha:
- Entrar com a identidade entre plataformas (XBOX/MSA) para criar uma conta unificada, ou
- Criar agora uma conta somente da plataforma e começar a jogar imediatamente.
- Incentive a vinculação antecipada ao XBOX/MSA explicando os benefícios e os riscos.
- Quando o jogador optar por vincular:
- Se a vinculação tiver êxito diretamente, continue jogando com uma conta unificada.
- Se a conta XBOX/MSA já tiver progresso em outro lugar, pause e pergunte qual progresso manter (reconciliação):
- Manter o progresso do XBOX/MSA e anexar a conta atual da plataforma.
- Manter o progresso atual da plataforma e adiar a vinculação.
- Após a vinculação, atualize o perfil local da plataforma para que ele fique conectado à conta unificada.
- As próximas inicializações são contínuas: o jogador pode ir direto para o jogo (supondo que a vinculação não tenha sido adiada).
Passo a passo detalhado
Criar um identificador de usuário local da Steam- Chame
PFLocalUserCreateHandleWithSteamUser(serviceConfigHandle, customContext, outLocalUserHandle). - Resultado:
PFLocalUserHandle; ainda sem autenticação.
- Chame
PFLocalUserLoginAsync(localUserHandle, /*createAccount*/ false, async). - Na conclusão:
- Se
PFLocalUserLoginGetResulttiver êxito, use oPFEntityHandleresultante e prossiga online.- Verifique se a conta baseada na Steam já está vinculada ao XBOX/MSA. Chame
PFAccountManagementClientGetAccountInfoAsync(entityHandle, getInfoRequest, async)e inspecione as identidades vinculadas. Se não estiver vinculada, solicite que o jogador vincule o XBOX usando o fluxo abaixo (sem bloqueio), para que a progressão entre plataformas futura funcione perfeitamente.
- Verifique se a conta baseada na Steam já está vinculada ao XBOX/MSA. Chame
- Se
PFLocalUserLoginGetResultfalhar comE_PF_ACCOUNT_NOT_FOUND, o jogador permanecerá offline até que uma conta seja criada. Ofereça duas opções:- Criar agora uma conta do PlayFab baseada no XBOX: entrar com XBOX/MSA (por exemplo,
PFAuthenticationLoginWithXUserAsync). - Entrar com a Steam agora e começar a jogar: chame
PFLocalUserLoginAsync(localUserHandle, /*createAccount*/ true, async)para criar uma conta do PlayFab baseada na Steam associada ao identificador local; em caso de êxito, use oPFEntityHandleresultante para prosseguir online imediatamente.
- Criar agora uma conta do PlayFab baseada no XBOX: entrar com XBOX/MSA (por exemplo,
- Para outros erros, trate-os adequadamente (nova tentativa/retirada).
- Se
- Apresente os benefícios da vinculação (progressão entre plataformas, portabilidade dos direitos).
- Ofereça a entrada com XBOX/MSA.
- Se o jogador estiver iniciando a vinculação do XBOX mais tarde (ele já tem um
PFEntityHandlebaseado na Steam da sessão atual):- Não crie uma nova conta baseada no XBOX.
- Tente vincular a identidade XBOX diretamente à conta atual baseada na Steam chamando a API de vínculo apropriada (por exemplo,
PFAccountManagementClientLinkXboxAccountAsync(currentSteamEntity, linkRequest, async)). - Se a vinculação tiver êxito, a identidade XBOX/MSA agora estará vinculada; continue a operação normal.
- Se a vinculação falhar com um erro de vínculo/conflito preexistente (identidade XBOX já vinculada em outro lugar), entre no modo de reconciliação de contas. Execute imediatamente a entrada com XBOX/MSA com
createAccount=false(por exemplo,PFAuthenticationLoginWithXUserAsync) para obter oPFEntityHandlebaseado no XBOX e, em seguida, busque os metadados do perfil para dar contexto antes de perguntar ao jogador. Após o consentimento, prossiga para as decisões de vinculação.
- Se o jogador não tiver uma conta existente para o XBOX (caminho de inicialização):
- Primeiro, tente entrar com XBOX/MSA com
createAccount=falseusandoPFAuthenticationLoginWithXUserAsync(ouPFAuthenticationLoginWithXboxAsync, quandoLoginWithXUsernão estiver disponível).- Se a entrada tiver êxito: a conta XBOX/MSA já tem uma conta do PlayFab e provavelmente progresso existente. Entre no modo de reconciliação de contas para escolher qual progresso manter.
- Se a entrada falhar com
E_PF_ACCOUNT_NOT_FOUND: prossiga para criar a conta do PlayFab entrando novamente comcreateAccount=true.
- Conclua com
PFAuthenticationLoginWithXUserGetResultSize(...)ePFAuthenticationLoginWithXUserGetResult(...)para obterPFEntityHandle.
- Primeiro, tente entrar com XBOX/MSA com
- Aplicável quando você acabou de criar uma nova conta do PlayFab baseada no XBOX (sem vínculos existentes da Steam).
- Se você entrou no modo de reconciliação de contas anteriormente, as decisões de vinculação e quaisquer ações de
forceLinknecessárias são tratadas lá; ignore esta etapa. - Crie uma solicitação de vínculo de cliente com o tíquete de autenticação atual da Steam (de
ISteamUser::GetAuthTicketForWebApiou da sua integração). - Chame
PFAccountManagementClientLinkSteamAccountAsync(entityHandle, linkRequest, async)comforceLink=false(padrão). Espera-se que isso tenha êxito para uma conta nova. - Se a vinculação falhar, trate isso como uma condição de erro (conflito inesperado ou falha de autenticação). Exiba um erro ao jogador e considere solicitar que ele entre novamente antes de tentar outra vez.
- Após o êxito, a identidade da Steam do jogador estará vinculada à conta do PlayFab baseada no XBOX.
- Chame
PFLocalUserLoginAsync(steamLocalUserHandle, /*createAccount*/ false, async)novamente. PFLocalUserLoginGetResultagora tem êxito; oPFEntityHandleresultante fica associado ao usuário local da Steam.
- O Game Save e outras APIs online usam o
PFEntityHandleautenticado. - As próximas inicializações do jogo poderão ir direto para o jogo, pois toda a vinculação está estabelecida.
- Não bloqueie a jogabilidade inicial com a entrada com XBOX/MSA; solicite cedo, mas permita que os jogadores adiem.
PFLocalUserCreateHandleWithSteamUsernão faz login sozinho. Verifique se os fluxos de vinculação foram concluídos antes de chamar APIs que disparam o login, comoPFGameSaveFilesAddUserWithUiAsync.
Reconciliação de contas (progresso existente no XBOX/MSA)
Quando um jogador entra com uma conta XBOX/MSA que já tem progresso (por exemplo, do console ou de outra plataforma), você deve evitar criar cegamente uma nova conta ou substituir os vínculos existentes. Use uma abordagem cautelosa em duas fases para detectar e reconciliar.Fase de detecção
- A reconciliação pode ser iniciada por dois caminhos:
- Conta XBOX/MSA existente detectada: tente entrar com XBOX/MSA com
createAccount=false.- Se a entrada tiver êxito, a identidade XBOX/MSA já tem uma conta do PlayFab e provavelmente progresso existente; entre na reconciliação.
- Se a entrada falhar com
E_PF_ACCOUNT_NOT_FOUND, prossiga com a inicialização (createAccount=true). Não é necessário entrar na reconciliação.
- Conflito de vinculação posterior detectado: ao vincular XBOX/MSA à conta atual baseada na Steam, a vinculação falha com um erro de vínculo/conflito preexistente (identidade XBOX já vinculada a uma identidade da Steam diferente).
- Execute imediatamente a entrada com XBOX/MSA com
createAccount=false(por exemplo,PFAuthenticationLoginWithXUserAsync) para obter oPFEntityHandlebaseado no XBOX. - Busque os metadados do perfil (por exemplo, progressão recente, slots de salvamento, carimbos de data/hora) para apresentar o contexto.
- Entre na reconciliação para decidir qual progresso manter.
- Execute imediatamente a entrada com XBOX/MSA com
- Conta XBOX/MSA existente detectada: tente entrar com XBOX/MSA com
Fase de reconciliação
- Recomende a opção direta: manter o progresso do XBOX/MSA (identidade de vinculação principal) e abandonar o progresso local da Steam. Isso preserva a âncora entre plataformas e evita mesclagens complexas.
- Na prática, os jogadores têm três opções (os jogos podem optar por oferecer apenas 1 ou 2 delas):
- Manter o progresso do XBOX/MSA (recomendado): prossiga para vincular a conta atual da Steam à conta do PlayFab existente baseada no XBOX.
- Manter o progresso atual da Steam e cancelar a vinculação: continue com a conta baseada na Steam por enquanto; não vincule nem substitua os dados do XBOX/MSA. Ofereça a vinculação novamente na próxima vez.
- Manter o progresso atual da Steam e abandonar o progresso do XBOX: mude para a conta baseada na Steam e descarte intencionalmente o progresso do XBOX/MSA. Esse caminho exige uma consideração explícita do design do jogo e não deve ser tentado levianamente, especialmente se outras identidades nativas da plataforma já estiverem anexadas à conta XBOX. Este documento não aborda os detalhes de implementação desse cenário.
- Antes de confirmar:
- Chame
PFAccountManagementClientGetAccountInfoAsyncpara a entidade XBOX para inspecionar os vínculos de provedores existentes e verificar se já existe um vínculo da Steam. - Se a entidade tiver uma conta da Steam diferente vinculada, avise o jogador que essa associação existente da Steam será removida da entidade antes que a nova possa ser adicionada. Isso exige chamar
PFAccountManagementClientUnlinkSteamAccountAsyncantes de vincular a conta atual da Steam.forceLinknão resolve esse cenário. - Se a conta atual da Steam estiver vinculada a uma entidade diferente, chamar
PFAccountManagementClientLinkSteamAccountAsyncretornaráE_PF_LINKED_ACCOUNT_ALREADY_CLAIMED. Avise que a vinculação moverá a identidade da Steam para longe da outra entidade e tente novamente comforceLink=trueapós o consentimento.
- Chame
Ações de confirmação (com base na escolha do jogador)
- O jogador escolhe o progresso do XBOX/MSA:
- Garanta que a entidade da entrada com XBOX seja obtida (execute
PFAuthenticationLoginWithXUserAsynccomcreateAccount=false, se ainda não tiver sido feito durante a detecção). - Se a entidade XBOX já tiver uma conta da Steam diferente vinculada, chame
PFAccountManagementClientUnlinkSteamAccountAsyncpara removê-la primeiro. - Vincule a Steam atual à conta baseada no XBOX. Se a chamada retornar
E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED(a Steam está em outra entidade), tente novamente comforceLink=trueapós o consentimento. - Faça login novamente com o usuário local da Steam (
PFLocalUserLoginAsync(..., /*createAccount*/ false, ...)) para associar a entidade.
- Garanta que a entidade da entrada com XBOX seja obtida (execute
- O jogador escolhe o progresso da Steam:
- Se ainda não existir uma conta do PlayFab para a Steam, crie/associe via
PFLocalUserLoginAsync(..., /*createAccount*/ true, ...). - Adie o vínculo do XBOX; permita a jogabilidade imediatamente. Ofereça a vinculação novamente na próxima vez.
- Se ainda não existir uma conta do PlayFab para a Steam, crie/associe via
Observações
- Sempre busque e exiba contexto suficiente para embasar a decisão do jogador.
- Registre telemetria dos resultados da reconciliação para melhorar os prompts e os padrões ao longo do tempo.
