Actualizar tokens de OAuth 2

En esta guía se asume que ya ha creado una aplicación de OAuth 2

Si no lo ha hecho, consulte esta 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.

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:

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}

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, 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
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

Con 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

Ejecutar una actualización

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

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

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

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