Обновление токенов OAuth 2

Это руководство предполагает, что вы уже создали приложение OAuth2

Если нет, обратитесь к этому руководству и вернитесь сюда, как только получите access_token и refresh_token после авторизации через OAuth 2.

Основы обновления токенов

Если вы включили область доступа offline в свой запрос учетных данных OAuth2.0, успешная аутентификация через приложение Accounts от Frame.io вернет полезную нагрузку, которая выглядит следующим образом:

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}

access_token — это токен Bearer, который можно использовать для действий от имени аутентифицированного пользователя; он истечет через 3600 секунд (один час); после этого refresh_token можно использовать для получения нового access_token. Срок действия токена обновления истечет через 30 дней, после чего пользователю необходимо будет войти в систему заново, создав новую пару токенов доступа/обновления и т. д. Если вы явным образом не запросите область доступа офлайн, вы не получите refresh_token, и поэтому через час вам придется полностью повторно аутентифицировать пользователя.

Получение токена обновления при выполнении аутентификации

Вы не можете использовать refresh_token, которого у вас нет, поэтому обязательно в своем приложении:

  • Запросите область доступа офлайн.
  • Получите refresh_token, который возвращается в выполненном обратном вызове.

Для удобства обратный вызов из наших руководств по приложениям OAuth 2 воспроизведен здесь, включая вызов os для сохранения токена обновления. Обратите внимание, что предоставлено два примера: один с настроенным PKCE (не включает заголовок базовой аутентификации) и один без него (включает заголовок базовой аутентификации).

Без 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

С 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

Выполнение обновления

Само обновление — это один вызов URL токена Frame.io:

Обновление всегда будет включать как минимум следующие три атрибута в данных формы:

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

Если вы используете PKCE, нужно будет включить client_id вашего приложения в эти данные формы; если нет, нужно будет включить заголовок базовой аутентификации с client_id и client_secret вашего приложения в качестве имени пользователя и пароля соответственно.

Без PKCE

Аналогично выполнению первоначального обратного вызова аутентификации без PKCE, это стандартное обновление потребует предоставления ваших client_id и client_secret в качестве имени пользователя и пароля в заголовке базовой аутентификации.

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

С PKCE

И снова мы следуем правилам нашего первоначального цикла /callback:

  • Мы не включаем заголовок Авторизация
  • Мы должны включить client_id в наши полезные данные
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

Поздравляем!Теперь вы можете управлять полным жизненным циклом токенов клиентского приложения OAuth2.0.