Atualização de tokens OAuth 2

Este guia pressupõe que você já criou um aplicativo OAuth2

Se ainda não fez isso, consulte este guia e retorne aqui depois de capturar o access_token e o refresh_token de uma concessão bem-sucedida de credenciais OAuth 2.

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:

1{
2 "access_token":"BEARER_TOKEN",
3 "expires_in":3600,
4 "refresh_token":"REFRESH_TOKEN",
5 "scope":"account.read offline",
6 "token_type":"bearer"
7}

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 é 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
1def callback():
2 # Where `request` refers to our initial call to the auth URL
3 state = request.args.get('state')
4 scope = request.args.get('scope')
5 code = request.args.get('code')
6 error = request.args.get('error')
7
8 if error:
9 return "Error: " + error
10
11 # Set up for client authorization and set up the data you need to send.
12 client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET)
13
14 post_data = {
15 "grant_type": "authorization_code",
16 "code": code,
17 "redirect_uri": REDIRECT_URI,
18 "state": state,
19 "scope": SCOPE
20 }
21
22 # Send a POST request with the data you need to receive an access token.
23 response = requests.post(TOKEN, auth=client_auth, data=post_data)
24 # Stash the refresh token for later
25 os.environ['REFRESH_TOKEN'] = response.json()["refresh_token"]
26
27 return response.text

Com PKCE

Python
1def callback():
2 # Where `request` refers to our initial call to the auth URL
3 state = request.args.get('state')
4 scope = request.args.get('scope')
5 code = request.args.get('code')
6 error = request.args.get('error')
7
8 if error:
9 return "Error: " + error
10
11 # If using PKCE, you must include the CLIENT_ID in your request body
12 post_data = {
13 "grant_type": "authorization_code",
14 "code": code,
15 "redirect_uri": REDIRECT_URI,
16 "state": state,
17 "scope": SCOPE
18 "client_id": CLIENT_ID
19 }
20
21 # Send a POST request with the data you need to receive an access token.
22 # If using PKCE, use the below request with no auth
23 response = requests.post(TOKEN_URL, data=post_data)
24 # Stash the refresh token for later
25 os.environ['REFRESH_TOKEN'] = response.json()["refresh_token"]
26
27 return response.text

Executar uma atualização

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

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

  • grant_type: refresh_token
  • scope: <scopes>
  • refresh_token: <refresh_token>

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 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
1def refresh():
2 # Fetch the refresh token, assuming we have it
3 REFRESH_TOKEN = os.environ.get('REFRESH_TOKEN')
4
5 client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID,CLIENT_SECRET)
6 post_data = {
7 "grant_type": "refresh_token",
8 "scope": SCOPE,
9 "refresh_token": REFRESH_TOKEN
10 # if using PKCE, you will need to include your client_id as below
11 # "client_id": CLIENT_ID
12 }
13
14 response = requests.post(TOKEN_URL, auth=client_auth, data=post_data)
15 # Catch + stash a new Refresh Token
16 os.environ['REFRESH_TOKEN'] = response.json()["refresh_token"]
17
18 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
1def refresh():
2 # Fetch the refresh token, assuming we have it
3 REFRESH_TOKEN = os.environ.get('REFRESH_TOKEN')
4
5 post_data = {
6 "grant_type": "refresh_token",
7 "scope": SCOPE,
8 "refresh_token": REFRESH_TOKEN
9 "client_id": CLIENT_ID
10 }
11
12 response = requests.post(TOKEN_URL, data=post_data)
13 # Catch + stash a new Refresh Token
14 os.environ['REFRESH_TOKEN'] = response.json()["refresh_token"]
15
16 return response.text

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