2014-12-24 6 views
8

Ich bin einige JSON Daten POST und eine Authorization Header hinzufügen. Das Anforderungsobjekt verfügt jedoch nicht über die richtige Berechtigungseigenschaft. HTTP_AUTHORIZATION und headers zeigen beide die richtigen Autorisierungsdetails.Flask werkzeug request.authorization ist keine aber Autorisierung Header vorhanden

{'authorization': None, 
'cookies': {}, 
'environ': {'CONTENT_LENGTH': '81', 
      'CONTENT_TYPE': u'application/json', 
      'HTTP_AUTHORIZATION': 'testkey:', 
      'HTTP_CONTENT_LENGTH': '81', 
      'HTTP_CONTENT_TYPE': 'application/json', 
      'HTTP_HOST': 'test', 
      'PATH_INFO': '/v1/test', 
      'QUERY_STRING': '', 
      'REQUEST_METHOD': 'POST', 
      'SCRIPT_NAME': '', 
      'SERVER_NAME': 'test', 
      'SERVER_PORT': '80', 
      'SERVER_PROTOCOL': 'HTTP/1.1', 
      'flask._preserve_context': False, 
      'werkzeug.request': <Request 'http://test/v1/test' [POST]>, 
      'wsgi.errors': <open file '<stderr>', mode 'w' at 0x10d5471e0>, 
      'wsgi.input': <_io.BytesIO object at 0x11074c410>, 
      'wsgi.multiprocess': False, 
      'wsgi.multithread': False, 
      'wsgi.run_once': False, 
      'wsgi.url_scheme': 'http', 
      'wsgi.version': (1, 0)}, 
'headers': EnvironHeaders([('Authorization', testkey:'), ('Host', u'test'), ('Content-Length', u'81'), ('Content-Type', u'application/json')]), 
'shallow': False, 
'url': u'http://test/v1/test', 
'url_rule': <Rule '/v1/test' (POST, OPTIONS) -> testresource>, 
'view_args': {}} 
+0

Würden Sie bitte in der tatsächlichen Konsole/Web-Ansicht Fehler –

+0

@ Ondeckhooting hinzufügen - Es gibt keinen Fehler. Bitte lesen Sie die Frage. Das Problem ist, dass die Autorisierungseigenschaft None ist, aber die richtigen Header vorhanden sind. –

Antwort

8

Ihre Autorisierungsheader ('Authorization', 'testkey:') Base64 werden muss codiert und umfassen Basic.

in Python:

import base64 
base64.b64encode('testkey:') # 'dGVzdGtleTo=' 

in Javascript Ihren Kopf btoa mit einem:

'{"Authorization": "Basic ' + btoa('testkey:') + '"}' 
'{"Authorization": "Basic dGVzdGtleTo="}' 

In Ihrem Fall wird die dies im Header führt wie kommen:

('Authorization', 'Basic dGVzdGtleTo=')

+0

** Muss Base64-codiert sein & Include Basic ** ist der Kern davon, Beispiel: '{" Authorization ":" Basic dGVzdGtleTo = '"} sonst wird es unter' request.environ [' HTTP_AUTHORIZATION '] 'angezeigt – Abhijeet

+0

** Träger-Token ** kann auch auf die gleiche Weise gesendet werden, aber hier gibt es keine Anforderung der Base64-Codierung obwohl '{" Authorization ":" Bearer AbCdEf123456 "}' – Abhijeet

9

Das request.authorization Attribut wird nur gesetzt, wenn Sie einen gültigen Basic Authorization oder Digest Authorization Header; Der Header Authorization hat bestimmte Formate, bei denen das erste Wort im Header den Typ festlegt und das Attribut nur diese beiden spezifischen Typen behandelt (gekennzeichnet durch die Schlüsselwörter Basic oder Digest).

Vom AuthorizationMixin.authorization attribute documentation

Die Authorization Objekt in Form analysiert.

folgt, zu dem Authorization object docs:

Stellt eine Authorization-Header durch den Client gesendet. Sie sollten diese Art von Objekt nicht selbst erstellen, sondern es verwenden, wenn es von der Funktion parse_authorization_header zurückgegeben wird.

die documented as ist:

Parse ein HTTP Basic/Digest-Autorisierungsheader vom Web-Browser übertragen. Der Rückgabewert ist entweder Kein, wenn die Kopfzeile ungültig oder nicht angegeben wurde, andernfalls ein Authorization Objekt.

Fett Hervorhebung meins.

Ihre Kopfzeile ist keine solche gültige Kopfzeile; es ist nicht die Basic oder Digest Typ Anzeige. Wenn Sie haben einen solchen Header gibt die Funktion etwas anderes als None:

>>> from werkzeug.http import parse_authorization_header 
>>> parse_authorization_header('testkey:') 
>>> parse_authorization_header('testkey:') is None 
True 
>>> parse_authorization_header('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') 
{'username': 'Aladdin', 'password': 'open sesame'} 
>>> result = _ 
>>> type(result) 
<class 'werkzeug.datastructures.Authorization'> 
>>> result.username 
'Aladdin' 
>>> result.password 
'open sesame' 

Ich benutzte einen Basic Type-Header dort, wo der Rest des Header-Wert ist ein Base64-kodiert Benutzernamen und Passwort-Paar getrennt von einem : Doppelpunkt.

Wenn Sie Ihr eigenes Authentifizierungsschema implementieren möchten, greifen Sie einfach auf die Kopfzeile selbst zu und parsen Sie sie manuell.

auth = request.headers.get('authorization') 
2

Wenn Sie Apache + WSGI verwenden, nicht für Holen Sie sich die WSGIPassAuthorization On Direktive.