2014-12-24 11 views
8

Sto postando alcuni dati JSON e aggiungendo un'intestazione Authorization. Tuttavia, l'oggetto richiesta non ha la proprietà di autorizzazione corretta. HTTP_AUTHORIZATION e headers entrambi mostrano i dettagli di autorizzazione appropriati.Flask werkzeug request.authorization è nient'altro che intestazioni di autorizzazione presenti

{'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

Si prega di aggiungere l'errore della console/visualizzazione web effettiva –

+0

@Ondeckshooting - Nessun errore. Si prega di leggere la domanda. Il problema è che la proprietà di autorizzazione è Nessuno, ma le intestazioni corrette sono lì. –

risposta

8

L'intestazione autorizzazione ('Authorization', 'testkey:') deve essere Base64 codificato e comprendono Basic.

in python:

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

in javascript impostare il colpo di testa con btoa:

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

Nel tuo caso, il questo si tradurrà nell'intestazione venire come:

('Authorization', 'Basic dGVzdGtleTo=')

+0

** Ha bisogno di essere codificato Base64 e include Basic ** è cruciale, sample: '{" Authorization ":" Basic dGVzdGtleTo = '"}' altrimenti verrà visualizzato in 'request.environ [' HTTP_AUTHORIZATION ']' – Abhijeet

+0

** Il token bearer ** può anche essere inviato allo stesso modo ma qui non c'è alcun requisito di codifica Base64 sebbene '{" Autorizzazione ":" Bearer AbCdEf123456 "}' – Abhijeet

9

L'attributo request.authorization viene impostato solo quando si dispone di una valida Basic Authorization o Digest Authorization intestazione; l'intestazione Authorization ha formati specifici in cui la prima parola nel valore dell'intestazione imposta il tipo e l'attributo gestisce solo questi due tipi specifici (contrassegnati dalle parole chiave tipo Basic o Digest).

Dal AuthorizationMixin.authorization attribute documentation

Il autorizzazione oggetto in forma analizzato.

successivo alla Authorization object docs:

Rappresenta un'intestazione di autorizzazione inviata dal client. Non dovresti creare questo tipo di oggetto ma usarlo quando viene restituito dalla funzione parse_authorization_header.

che è documented as:

analizzare un HTTP di base/digest intestazione autorizzazione trasmesso dal browser web. Il valore restituito è Nessuno se l'intestazione non è valida o non viene fornita, altrimenti un oggetto Authorization.

Bold enfasi miniera.

L'intestazione non è un'intestazione valida; non ha l'indicatore di tipo Basic o Digest. Se fatto dispone di un tale colpo di testa la funzione restituisce qualcosa di diverso 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' 

ho usato un colpo di testa Basic tipo lì, dove il resto del valore di intestazione è un nome utente e una password coppia di base-64 codificato separati da un colon :.

Se si desidera implementare il proprio schema di autenticazione, è sufficiente accedere all'intestazione stessa e analizzarlo manualmente.

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

Quando si utilizza apache + WSGI, non farlo per ottenere la direttiva WSGIPassAuthorization On.

Problemi correlati