> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Control de la expiración del token

> Controle la expiración del token de entidad de PlayFab, la actualización del token en segundo plano y el reinicio de sesión manual en el SDK de C, incluidos los flujos de suspensión y reanudación del GDK.

El SDK de PlayFab Services incluye un mecanismo de actualización del token en segundo plano que ayuda a mantener activa la sesión del jugador. Es importante comprender cómo funciona este mecanismo, y cuándo el juego debe tomar medidas, especialmente en el caso de los títulos del Game Development Kit (GDK) que admiten la suspensión y la reanudación.

## Cómo funciona la actualización automática del token

El SDK ejecuta un proceso de trabajo en segundo plano que comprueba periódicamente el token de entidad del jugador. Si el token **sigue siendo válido pero se acerca a su expiración** (dentro de la hora previa a expirar), el SDK vuelve a autenticarse automáticamente con las credenciales de la llamada de inicio de sesión original. Si esta actualización se realiza correctamente, el token se actualiza de forma transparente y el **PFEntityHandle** sigue siendo válido. No se requiere ninguna acción por parte del juego.

Puede observar estas actualizaciones silenciosas del token registrando una devolución de llamada [**PFEntityRegisterTokenRefreshedEventHandler**](/services/playfab/api-references/c/pfentity/functions/pfentityregistertokenrefreshedeventhandler) (consulte [Actualización transparente](#transparent-refresh)).

## Cuándo debe controlar el juego la expiración del token

Hay escenarios en los que el SDK **no puede** actualizar automáticamente el token:

* **El token ya ha expirado.** La actualización automática solo funciona cuando el token sigue siendo válido. Si el token ha expirado por completo (por ejemplo, después de un ciclo largo de suspensión y reanudación), el SDK no intenta un reinicio de sesión automático. En su lugar, se lo notifica al juego mediante el **TokenExpiredHandler**.
* **Las credenciales de inicio de sesión originales ya no son válidas.** Si el identificador o el token proporcionados originalmente en la solicitud de inicio de sesión ya no son válidos, la actualización automática produce un error y se invoca el **TokenExpiredHandler**.

<Info>
  Se recomienda registrar un [**PFEntityTokenExpiredEventHandler**](/services/playfab/api-references/c/pfentity/functions/pfentitytokenexpiredeventhandler) para todos los títulos y es **esencial** para los títulos del GDK que admiten la suspensión y la reanudación. Sin este controlador, el juego no tiene forma de recuperarse de un token expirado.
</Info>

### Registro del TokenExpiredHandler

Use [**PFEntityRegisterTokenExpiredEventHandler**](/services/playfab/api-references/c/pfentity/functions/pfentityregistertokenexpiredeventhandler) para registrarse para una devolución de llamada y **PFAuthenticationReLoginWith\*Async** para volver a autenticarse cuando el token expire.

```cpp theme={null}
    PFRegistrationToken registrationTokenExpired{};
    hr = PFEntityRegisterTokenExpiredEventHandler(nullptr, nullptr, [](void* ctx, PFEntityKey const* entityKey)
    {
        PFAuthenticationLoginWithXUserRequest request{};
        request.createAccount = true;
        request.user = user; // An XUserHandle obtained from XUserAddAsync

        XAsyncBlock async{};
        HRESULT hr = PFAuthenticationReLoginWithXUserAsync(GlobalState()->entityHandle, &request, &async); // This assumes the entity handle was stored in the game's global state
        hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage

        // After login we could potentially get back a new player entity with a new entity key
        PFEntityKey const* pEntityKey{};
        std::vector<char> entityKeyBuffer;
        size_t size{};
        hr = PFEntityGetEntityKeySize(GlobalState()->entityHandle, &size); // Add your own error handling when FAILED(hr) == true

        entityKeyBuffer.resize(size);
        hr = PFEntityGetEntityKey(GlobalState()->entityHandle, entityKeyBuffer.size(), entityKeyBuffer.data(), &pEntityKey, nullptr);
    }, &registrationTokenExpired);
```

## GDK: suspensión, reanudación y Reanudación rápida

En las plataformas del GDK (consolas XBOX y Windows con el GDK), un juego se puede suspender durante un período prolongado, por ejemplo, cuando el jugador cambia a otro juego y vuelve más tarde mediante Reanudación rápida. Durante la suspensión, el token de entidad puede expirar. Como no se ejecuta código durante la suspensión, la actualización periódica en segundo plano del SDK no puede mantener activo el token.

### Qué ocurre al reanudar

Cuando el juego se reanuda, el SDK detecta **inmediatamente** el estado de reanudación y comprueba el token de entidad. No espera al siguiente ciclo de actualización periódica. Si el token expiró durante la suspensión:

1. El SDK detecta el token expirado.
2. Se invoca la devolución de llamada del **TokenExpiredHandler**.
3. El juego debe llamar a **PFAuthenticationReLoginWith\*Async** desde el controlador para adquirir un token nuevo.

<Note>
  La comprobación del token al reanudar se desencadena en cuanto se restaura la conectividad de red. Si la red tarda un momento en reinicializarse después de la reanudación, el SDK espera a que haya conectividad antes de comprobar el token. No se pierde ninguna comprobación del token.
</Note>

## Actualización transparente

Si desea que el juego sepa cuándo el SDK actualiza automáticamente el token de entidad del jugador, puede registrarse para una devolución de llamada. Este controlador se invoca cuando el SDK actualiza correctamente un token que se acercaba a su expiración; no se requiere ninguna acción por parte del juego.

```cpp theme={null}
    PFRegistrationToken registrationTokenRefreshed{};
    hr = PFEntityRegisterTokenRefreshedEventHandler(nullptr, nullptr, [](void* ctx, PFEntityKey const* entityKey, const PFEntityToken* newToken)
    {
        // Perform any logging or other desired actions on token refresh
    }, &registrationTokenRefreshed);
```

## Anulación del registro de los controladores

Al cerrar PlayFab o cuando quiera dejar de recibir devoluciones de llamada de expiración y actualización del token, llame a la función de anulación de registro correspondiente.

```cpp theme={null}
    PFEntityUnregisterTokenExpiredEventHandler(registrationTokenExpired);
    PFEntityUnregisterTokenRefreshedEventHandler(registrationTokenRefreshed);
```

## Referencia

[Documentación de referencia de la API](/services/playfab/api-references/c/pfauthentication/pfauthentication_members)


## Related topics

- [Inicio rápido del GDK](/es/services/playfab/sdks/c/quickstart-gdk.md)
- [Identificadores de entidad](/es/services/playfab/sdks/c/entity-handles.md)
- [Notas de la versión de PlayFab Party](/es/services/playfab/multiplayer/networking/release-notes.md)
- [Autenticación de los servicios de XBOX para servicios de título](/es/services/xbox-services/fundamentals/s2s-auth-calls/service-authentication/live-title-service-authentication.md)
- [Autenticación de XBOX services](/es/services/xbox-services/fundamentals/s2s-auth-calls/service-authentication/live-xbox-live-authentication.md)
