Je recréer un service dans Python/Flask et je rencontre un problème avec la façon dont les clients existants s'authentifient. Je dois faire correspondre le schéma des clients existants pour des raisons de compatibilité.Forcer Content-Type ou exposer request.data dans Flask pour un type de contenu connu
Les clients existants prennent le nom d'utilisateur, mot de passe et base64 l'encoder. Ce n'est pas l'authentification de base HTTP, malgré son semblable. Voici un exemple de code qui créerait cette demande de connexion.
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)
Du côté du serveur, je prends les données POST et base64 décodent pour obtenir le nom d'utilisateur et mot de passe.
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')
Le problème est le type de contenu. Si je spécifie un type de contenu inconnu dans le client (application/gooblygop), Flask expose les données POST à request.data et je peux décoder la chaîne base64. Si je laisse le Content-Type par défaut (application/x-www-form-urlencoded), les données brutes ne sont pas exposées à request.data et je ne sais pas comment récupérer la chaîne encodée en base64 et en faire usage.
Le logiciel client existant est à peu près par défaut x-www-form-urlencoded, mais je ne peux pas m'attendre à ce que cela soit toujours le cas. Fondamentalement, j'ai besoin d'une méthode fiable côté serveur pour accéder à cette chaîne codée quel que soit le type de contenu indiqué par le programme client.
Autres notes: Je suis très nouveau sur Python, venant d'un arrière-plan PHP. Je suis donc très ouvert aux suggestions. En outre, ce projet est principalement pour un usage personnel.