2017-07-28 40 views
5

我正在使用oauth2身份驗證的請求會話。 當我上傳小文件時,一切正常,但對於4GB文件,我得到令牌過期錯誤,它看起來像文件已上傳,但在關閉會話部分令牌再次驗證。令牌在文件上傳前到期

有沒有機會處理這種情況? 在會話關閉之前上傳帶有令牌刷新的大文件或其他內容?

代碼示例如下,非常感謝您的幫助。乾杯!

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

可以修改上傳邏輯的服務器端,或者你有沒有對其進行控制? –

+0

不,我沒有訪問服務器,只有API端點 –

回答

1

如果你想有更多的時間,你也可以請求刷新令牌,並使用它們,每當舊的到期產生新的訪問令牌有效的訪問令牌。通常訪問令牌有效期爲1小時,每當計時器達到60分鐘時,您都可以維護計時器並生成新的訪問令牌。這樣你可以擁有一個有效的訪問令牌,用於更長的會話。

你必須使用grant_type=refresh_tokenhttps://tools.ietf.org/html/rfc6749#section-6

+0

是的,這可能是,我需要檢查與客戶端API支持,將關閉此,如果這將解決問題。謝謝。 –

+0

太棒了,thx爲您的幫助,解決了問題:),他們本週發佈令人耳目一新的令牌功能:) –