Actualisation des jetons OAuth 2

Ce guide part du principe que vous avez déjà créé une app OAuth2

Si ce n’est pas le cas, consultez ce guide et revenez ici une fois que vous avez capturé le access_token et le refresh_token d’un octroi d’informations d’identification OAuth 2 réussi.

Principes de base de l’actualisation de jeton

En supposant que vous ayez inclus la portée offline dans votre demande d’informations d’identification OAuth2.0, une authentification réussie via l’application Accounts de Frame.io renverra une charge utile qui ressemble à ceci :

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}

Le access_token est un jeton porteur qui peut être utilisé pour agir au nom de l’utilisateur authentifié ; il expirera après 3600 secondes (une heure) ; et après cela, le refresh_token peut être utilisé pour récupérer un nouveau access_token. Le jeton d’actualisation expirera ensuite après 30 jours, moment où vous devrez demander à l’utilisateur de se connecter depuis le début, produisant une nouvelle paire de jetons d’accès/actualisation ; et ainsi de suite. Si vous ne demandez pas explicitement la portée offline, vous ne recevrez pas de refresh_token, et par conséquent après une heure, vous devrez réauthentifier complètement l’utilisateur.

Capture du jeton d’actualisation lors d’une authentification réussie

Il va sans dire que vous ne pouvez pas utiliser un refresh_token que vous n’avez pas, alors assurez-vous dans votre app de :

  • Demander la portée offline
  • Capturer le refresh_token qui est renvoyé dans un rappel réussi.

Pour plus de commodité, le rappel de nos Guides d’app OAuth 2 est reproduit ici, avec un appel os pour stocker le jeton d’actualisation. Veuillez noter que deux exemples sont fournis : un avec PKCE configuré (n’inclut pas d’en-tête d’authentification de base), et un sans (inclut un en-tête d’authentification de base).

Sans 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

Avec 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

Exécution d’une actualisation

L’actualisation elle-même est un seul appel à l’URL de jeton de Frame.io :

Une actualisation inclura toujours au moins les trois attributs suivants dans les données du formulaire :

  • grant_type : refresh_token
  • scope : \
  • refresh_token : \

Si vous utilisez PKCE, vous devrez inclure le client_id de votre application dans ces données de formulaire ; sinon, vous devrez inclure un en-tête d’authentification basique avec le client_id et le client_secret de votre application comme nom d’utilisateur et mot de passe, respectivement.

Sans PKCE

Comme pour effectuer le rappel d’authentification initial sans PKCE, cette actualisation standard nécessitera de fournir votre client_id et client_secret comme nom d’utilisateur et mot de passe dans un en-tête d’authentification basique.

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

Avec PKCE

Encore une fois, nous reproduisons les règles de notre cycle /callback initial :

  • Nous n’incluons pas d’en-tête Authorization
  • Nous devons inclure le client_id dans notre charge utile
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

Félicitations !Vous pouvez maintenant gérer l’ensemble du cycle de vie des jetons d’une application cliente OAuth2.0.” ] } ```