Я воссоздаю службу в Python / Flask и сталкиваюсь с проблемой способа аутентификации существующих клиентов.Я должен соответствовать существующей схеме клиентов по причинам совместимости.
Существующие клиенты принимают имя пользователя, пароль и base64 кодируют его.Это не базовая аутентификация HTTP, несмотря на то, что звучит похоже.Ниже приведен пример кода, который может создать этот запрос на вход.
credentials = {
'username': 'test@example.com',
'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')
Проблема в типе контента.Если я указываю неизвестный Content-Type в клиенте (application / gooblygop), Flask предоставляет данные POST для request.data, и я могу декодировать строку base64.Если я оставлю Content-Type по умолчанию (application / x-www-form-urlencoded), необработанные данные не будут доступны для request.data, и я не знаю, как извлечь закодированную строку base64 и использовать ее.
В существующем клиентском программном обеспечении по умолчанию используется x-www-form-urlencoded, но я не могу полагаться на то, что это всегда так.
По сути, мне нужен надежный серверный метод для доступа к этой зашифрованной строке, независимо от того, какой тип содержимого указывает клиентская программа.
Другие примечания: я очень новичок в Pythonиз фона PHP.Так что я очень открыт для предложений.Также этот проект предназначен в первую очередь для личного пользования.