> This page is for Plataforma, version Herdado.
> 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
> - Herdado: 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.

# Atualização de tokens OAuth 2

<Warning title="Este guia pressupõe que você já criou um aplicativo OAuth2">
  Se ainda não fez isso, consulte [este](/oauth-2-applications/building-an-oauth-2-app) guia e retorne aqui depois de capturar o `access_token` e o `refresh_token` de uma concessão bem-sucedida de credenciais OAuth 2.
</Warning>


## Noções básicas de atualização de token

Supondo que você incluiu o escopo ***offline*** na solicitação de credenciais OAuth2.0, a autenticação bem-sucedida via aplicativo de contas do Frame.io retornará um conteúdo semelhante ao seguinte:

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

O `access_token` é um bearer token que pode ser usado para agir em nome do usuário autenticado; expirará após 3.600 segundos (uma hora) e, depois disso, o `refresh_token` poderá ser usado para buscar um novo `access_token`.O refresh token expirará após 30 dias, momento em que será necessário que o usuário faça login do zero, produzindo um novo par de tokens de acesso/atualização e assim por diante.Se você não solicitar o escopo *offline* explicitamente, não receberá um `refresh_token` e, portanto, após uma hora, terá que reautenticar completamente o usuário.

### Captura do refresh token na autenticação bem-sucedida

É desnecessário dizer que você não pode usar um `refresh_token` que não tem, então certifique-se de que seu aplicativo:
* Solicite o escopo **offline**
* Capture o `refresh_token` retornado em um callback bem-sucedido.

Para conveniência, o callback dos nossos [Guias do aplicativo OAuth 2](/oauth-2-applications/building-an-oauth-2-app) é reproduzido aqui, com uma chamada `os` para armazenar o Refresh token.Observe que dois exemplos são fornecidos: um com PKCE configurado (não inclui cabeçalho de autenticação básica) e um sem (inclui cabeçalho de autenticação básica).

### Sem 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
```





### Com 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
```




## Executar uma atualização




A atualização em si é uma única chamada para o URL de token do Frame.io:



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




Uma atualização sempre incluirá pelo menos os três atributos a seguir nos dados do formulário:



* `grant_type`: *refresh_token*
* `scope`: &lt;scopes&gt;
* `refresh_token`: &lt;refresh_token&gt;

Se você estiver usando PKCE, precisará incluir o `client_id` do aplicativo nos dados deste formulário; caso contrário, precisará incluir um cabeçalho de autenticação básica com o `client_id` e o `client_secret` do aplicativo como nome de usuário e senha, respectivamente.

### Sem PKCE

Semelhante a [fazer o callback de autenticação inicial](/oauth-2-applications/building-an-oauth-2-app#the-callback) sem PKCE, esta atualização padrão exigirá o fornecimento do `client_id` e do `client_secret` como nome de usuário e senha em um cabeçalho de autenticação 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
```




### Com PKCE

Novamente, estamos seguindo as regras do ciclo `/callback` inicial:
* Não incluímos um cabeçalho `Authorization`
* Devemos incluir o `client_id` no conteúdo




**`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
```




Parabéns!Agora você pode gerenciar todo o ciclo de vida do token de um aplicativo cliente OAuth2.0.