Я использую сеанс запросов с аутентификацией oauth2. Все работает отлично, когда я загружаю небольшие файлы, но для файла размером 4 ГБ я получаю ошибку истечения срока действия токена, похоже, что файл был загружен, но при закрытии сеанса токен был еще раз проверен.

Есть ли шанс справиться с этой ситуацией? Загрузить большой файл с обновленным токеном до закрытия сеанса или что-то в этом роде?

Образец кода ниже, большое спасибо за любую помощь. Ваше здоровье!

import requests
from io import StringIO

from requests_toolbelt.multipart.encoder import MultipartEncoder


TOKEN_PAYLOAD = {
    'grant_type': 'password',
    'client_id': '###',
    'client_secret': '###',
    'username': '###',
    'password': '####'
}


def get_token():
    response = requests.post(
        'https://oauth/token',
        params=TOKEN_PAYLOAD)
    response_data = response.json()
    token = response_data.get('access_token')
    return token


# Create test file
MB = 1024 ** 2
GB = MB * 1024

encoded_string = 'x' * 4 * GB
file_test = StringIO()
file_test.write(encoded_string)

# Get token
token = get_token()

# Create form
multipart_data = MultipartEncoder(
    fields={
        '--': ('4GB_test.txt', file_test, 'text/plain'),
        'id': '2217',
        'fileFieldDefId': '4258',
    }
)

# Create headers
headers = {
    "Authorization": "Bearer {}".format(token),
    'Content-Type': multipart_data.content_type
}

session = requests.Session()

response = session.post(
    'https://oauth2/rest/external/item/multipartUpdate/byId',
    headers=headers,
    data=multipart_data,
)

print(response)
# <Response [401]>

print(response.content)
# b'{"error":"invalid_token","error_description":"Access token expired: 0f7f6bd9-4e21-407f-4a78347711a9"}'


# response.close()  ? with refreshed token
# session.close() ? with refreshed token
6
k.rozycki 28 Июл 2017 в 13:07
Можете ли вы изменить серверную часть логики загрузки или вы не можете ее контролировать?
 – 
Ján Halaša
31 Июл 2017 в 11:50
Нет, у меня нет доступа к серверу, только к конечным точкам API
 – 
k.rozycki
31 Июл 2017 в 12:08

1 ответ

Лучший ответ

Если вы хотите иметь действительные токены доступа на большее время, вы также можете запросить токены обновления и использовать их для создания новых токенов доступа по истечении срока действия старого. Обычно токены доступа действительны в течение 1 часа, вы можете поддерживать таймер и генерировать новый токен доступа каждый раз, когда ваш таймер достигает 60 минут. Таким образом, у вас может быть действующий токен доступа для более длительных сеансов.

Вам необходимо использовать grant_type=refresh_token https: //www.rfc-editor .org / rfc / rfc6749 # section-6

1
Community 7 Окт 2021 в 13:58
Да, это может быть так, мне нужно проверить, что с поддержкой клиентского API, закрою это, если это решит проблему. Спасибо.
 – 
k.rozycki
31 Июл 2017 в 12:07
Отлично, спасибо за вашу помощь, которая решила проблему :), на этой неделе они выпускают обновленную функциональность токенов :)
 – 
k.rozycki
1 Авг 2017 в 14:08