> This page is for Plataforma, version Heredado.
> For other versions, use one of these documentation indexes:
> - V4 (default): https://next.developer.frame.io/platform/v4/llms.txt
> - V4 experimental: https://next.developer.frame.io/platform/v4-experimental/llms.txt
> - Heredado: https://next.developer.frame.io/platform/v2/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://next.developer.frame.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://next.developer.frame.io/_mcp/server.

# Actualizar tokens de OAuth 2

<Warning title="En esta guía se asume que ya ha creado una aplicación de OAuth 2">
  Si no lo ha hecho, consulte [esta](/oauth-2-applications/building-an-oauth-2-app) guía y vuelva aquí una vez que haya capturado el `access_token` y el `refresh_token` de una concesión de credenciales de OAuth 2 correcta.
</Warning>


## Conceptos básicos de la actualización de tokens

Suponiendo que haya incluido el ámbito ***sin conexión*** en su solicitud de credenciales de OAuth 2.0, la autenticación correcta mediante la aplicación de cuentas de Frame.io devolverá una carga útil que tiene un aspecto similar al siguiente:

```json
{
  "access_token":"BEARER_TOKEN",
  "expires_in":3600,
  "refresh_token":"REFRESH_TOKEN",
  "scope":"account.read offline",
  "token_type":"bearer"
}
```

El `access_token` es un token de portador que se puede usar para actuar en nombre del usuario autenticado; caducará después de 3600 segundos (una hora); después de eso, se puede usar el `refresh_token` para recuperar un `access_token` nuevo. El token de actualización caducará después de 30 días, momento en el que tendrá que hacer que el usuario inicie sesión desde cero mediante la creación de un nuevo par de tokens de acceso/actualización; y así sucesivamente. Si no solicita explícitamente el ámbito *sin conexión*, no recibirá ningún `refresh_token` y, por lo tanto, después de una hora tendrá que volver a autenticar completamente al usuario.

### Capturar el token de actualización en una autenticación correcta

Obviamente, no puede usar un `refresh_token` que no tiene, así que asegúrese en su aplicación de:
* Solicitar el ámbito **sin conexión**
* Capturar el `refresh_token` que se devuelve en una devolución de llamada correcta.

Para mayor comodidad, aquí se reproduce la devolución de llamada de nuestras [guías de aplicaciones de OAuth 2](/oauth-2-applications/building-an-oauth-2-app), con una llamada `os` para almacenar el token de actualización. Tenga en cuenta que se proporcionan dos ejemplos: uno con PKCE configurada (no incluye el encabezado de autorización básica) y otro sin ella (incluye el encabezado de autorización básica).

### Sin PKCE




**`Python`**

```python title="Python"
def callback():
  # Where `request` refers to our initial call to the auth URL
  state = request.args.get('state')
  scope = request.args.get('scope')
  code = request.args.get('code')
  error = request.args.get('error')

  if error:
    return "Error: " + error

  # Set up for client authorization and set up the data you need to send.
  client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET)

  post_data = {
    "grant_type": "authorization_code",
    "code": code,
    "redirect_uri": REDIRECT_URI,
    "state": state,
    "scope": SCOPE
  }

  # Send a POST request with the data you need to receive an access token. 
  response = requests.post(TOKEN, auth=client_auth, data=post_data)    
	# Stash the refresh token for later
  os.environ['REFRESH_TOKEN'] = response.json()["refresh_token"]

  return response.text
```





### Con PKCE




**`Python`**

```python title="Python"
def callback():
  # Where `request` refers to our initial call to the auth URL
  state = request.args.get('state')
  scope = request.args.get('scope')
  code = request.args.get('code')
  error = request.args.get('error')

  if error:
    return "Error: " + error

  # If using PKCE, you must include the CLIENT_ID in your request body  
  post_data = {
    "grant_type": "authorization_code",
    "code": code,
    "redirect_uri": REDIRECT_URI,
    "state": state,
    "scope": SCOPE
    "client_id": CLIENT_ID 
  }

  # Send a POST request with the data you need to receive an access token.
  # If using PKCE, use the below request with no auth
  response = requests.post(TOKEN_URL, data=post_data)
  # Stash the refresh token for later
  os.environ['REFRESH_TOKEN'] = response.json()["refresh_token"]

  return response.text
```




## Ejecutar una actualización




La actualización en sí es una sola llamada a la URL de token de Frame.io:



* Método: POST
* URL: **https://applications.frame.io/oauth2/token**
* `Content-Type`: *application/x-www-form-urlencoded*




Una actualización siempre incluirá al menos los siguientes tres atributos en los datos de su formulario:



* `grant_type`: *refresh_token*
* `scope`: \<scopes></scopes>
* `refresh_token`: \<refresh_token></refresh_token>

Si está usando PKCE, deberá incluir el `client_id` de su aplicación en estos datos de formulario; si no, deberá incluir un encabezado de autenticación básica con el `client_id` y el `client_secret` de su aplicación como nombre de usuario y contraseña, respectivamente.

### Sin PKCE

De manera similar al método de [realizar la devolución de llamada de autenticación inicial](/oauth-2-applications/building-an-oauth-2-app#the-callback) sin PKCE, esta actualización estándar requerirá que proporcione su `client_id` y su `client_secret` como nombre de usuario y contraseña en un encabezado de autenticación básica.

**`Python`**

```python title="Python"
def refresh():
  # Fetch the refresh token, assuming we have it
  REFRESH_TOKEN = os.environ.get('REFRESH_TOKEN')

  client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID,CLIENT_SECRET)
  post_data = {
    "grant_type": "refresh_token",
    "scope": SCOPE,
    "refresh_token": REFRESH_TOKEN
    # if using PKCE, you will need to include your client_id as below
    # "client_id": CLIENT_ID 
  }

  response = requests.post(TOKEN_URL, auth=client_auth, data=post_data)
  # Catch + stash a new Refresh Token
  os.environ['REFRESH_TOKEN'] = response.json()["refresh_token"]

  return response.text
```




### Con PKCE

De nuevo, estamos imitando las reglas de nuestro ciclo inicial `/callback`:
* No incluimos ningún encabezado `Authorization`
* Debemos incluir el `client_id` en nuestra carga útil




**`Python`**

```python title="Python"
def refresh():
  # Fetch the refresh token, assuming we have it
  REFRESH_TOKEN = os.environ.get('REFRESH_TOKEN')

  post_data = {
    "grant_type": "refresh_token",
    "scope": SCOPE,
    "refresh_token": REFRESH_TOKEN
    "client_id": CLIENT_ID 
  }

  response = requests.post(TOKEN_URL, data=post_data)
  # Catch + stash a new Refresh Token
  os.environ['REFRESH_TOKEN'] = response.json()["refresh_token"]

  return response.text
```




Enhorabuena. Ahora puede gestionar todo el ciclo de vida del token de una aplicación cliente de OAuth 2.0.