我正在Python/Flask中重新創建服務,並且遇到了現有客戶端驗證方式的問題。出於兼容性原因,我必須匹配現有的客戶端方案。強制內容類型或在Flask中顯示已知內容類型的request.data
現有客戶端接受用戶名,密碼和base64編碼。儘管聽起來類似,但這不是HTTP基本認證。以下是一些將創建此登錄請求的示例代碼。
credentials = {
'username': '[email protected]',
'password': 'password'
}
data = b64encode(urlencode(credentials))
request = urllib2.Request(loginURL)
request.add_data(data)
# request.add_header('Content-Type', 'application/gooblygop')
# 'application/x-www-form-urlencoded' seems to be a default Content-Type
login = urllib2.urlopen(request)
在服務器端,我把POST數據和解碼的base64其再次獲得的用戶名和密碼信息。
flask server:
@app.route('/login', methods=['POST'])
def login():
error = None
if request.method == 'POST':
# post data: cGFzc3dvcmQ9ZGVmYXVsdCZlbWFpbD10ZXN0JTQwZXhhbXBsZS5jb20=
data = b64decode(request.data)
# decoded data: password=default&email=test%40example.com
return('ok')
的問題是內容類型。如果我在客戶端(應用程序/ gooblygop)中指定了未知的Content-Type,Flask將POST數據公開給request.data,並且我可以解碼base64字符串。如果我將Content-Type保留爲默認值(application/x-www-form-urlencoded),則原始數據不會暴露給request.data,我不知道如何檢索base64編碼的字符串並使用它。
現有的客戶端軟件幾乎都默認使用x-www-form-urlencoded,但我不能依賴於這種情況。
本質上,無論Content-Type客戶端程序狀態如何,我都需要一個可靠的服務器端方法來訪問編碼的字符串。
其他說明:我對Python很新,來自PHP背景。所以我非常樂於提供建議。此外,該項目主要供個人使用。