2014-12-24 19 views
8

Bazı JSON verilerini alıyorum ve Authorization üstbilgisini ekliyorum. Ancak, istek nesnesinin doğru yetkilendirme özelliği yoktur. HTTP_AUTHORIZATION ve headers her ikisi de uygun yetkilendirme ayrıntılarını gösterir.Flask werkzeug request.authorization hiçbiri değil ama Yetkilendirme üstbilgileri mevcut

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

Gerçek konsol/web görünümü hatalarını ekleyiniz –

+0

@Ondeckshooting - Hata yok. Lütfen soruyu okuyun. Sorun, yetkilendirme özelliğinin Yok'dur, ancak uygun üstbilgiler var. –

cevap

8

yetkiniz başlığı Base64 kodlanmış ve Basic dahil edilecek.Python

: set

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

javascript da başlık btoa kullanarak: Senin durumunda

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

, bu şekilde gelen başlığında neden olacaktır:

('Authorization', 'Basic dGVzdGtleTo=')

+0

** Base64 kodlu olması gerekiyor & Basic dahil olmak üzere temel **, örnek: '{" Yetkilendirme ":" Temel dGVzdGtleTo = '"}' aksi takdirde' request.environ ['HTTP_AUTHORIZATION'] 'altında görünecektir – Abhijeet

+0

** Taşıyıcı jetonu ** aynı şekilde de gönderilebilir, ancak burada "{" Yetkilendirme "olmasına rağmen Base64 kodlaması gerekmez:" Bearer AbCdEf123456 "} – Abhijeet

9

geçerli bir Basic Authorization veya Digest Authorization başlık varken request.authorization niteliği yalnızca ayarlanmış; Authorization başlığı, başlık değerindeki ilk sözcüğün türünü belirlediği ve yalnızca özniteliğin (bu Basic veya Digest tür anahtar kelimelerle işaretlenen) iki özel türü işlediği belirli biçimlere sahiptir. AuthorizationMixin.authorization attribute documentation

çözümlenen formda Yetkilendirme nesne itibaren

.

Authorization object docs o aşağıdaki:

istemci tarafından gönderilen bir Yetkilendirme başlığını temsil eder. Bu tür bir nesneyi kendiniz yaratmamalısınız, ancak parse_authorization_header işlevi tarafından döndürüldüğünde kullanın. documented as olan

:

Ayrıştırma bir HTTP/temel web tarayıcısı tarafından iletilen yetkilendirme başlığını sindirimi. Dönüş değeri, üstbilgi geçersizse veya verilmediyse Yok, aksi halde Authorization nesnesidir.

Koyu vurgu benim.

Başlığınız böyle bir başlık değil; Basic veya Digest tip göstergesine sahip değildir. Eğer böyle bir başlık var mı ise fonksiyon None dışında bir şey verir:

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

Ben başlık değeri kalanı ayrılmış bir taban-64 kodlanmış adı ve şifre çifti orada bir Basic tip başlık kullanıldı : kolon tarafından.

Kendi kimlik doğrulama planınızı uygulamak istiyorsanız, yalnızca başlığın kendisine erişin ve el ile ayrıştırın. ihtiyacı ('Authorization', 'testkey:')

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

Apache + WSGI kullanırken, için yapma WSGIPassAuthorization On yönergesini edinin.

İlgili konular