2015-04-22 14 views
5

Sto cercando di creare un test con il resto quadro Django:Base64 intestazioni codificare HTTP_AUTHORIZATION DRF

self.api = APIClient() 
self.api.credentials(HTTP_AUTHORIZATION='client_id ' + str(self.client_id) + ' client_secret ' + str(self.client_secret)) 
response = self.api.post(url, payload) 

ma ottengo questo errore con quanto sopra:

valido intestazione di base. Le credenziali non sono codificate in base64.

Devo codificare in base64 l'intestazione? Ho pensato che questo sia fatto per te? testare la stessa cosa con l'arricciatura funziona senza problemi cioè

curl -X POST -d "stuff=stuff" http://RqePZpAwyyVqal9D:[email protected]:8000/api/test/ 
+0

Quale metodo di autenticazione si utilizza? Sembra OAuth, ma non lo specifichi mai da nessuna parte. –

risposta

1

Tu, infatti, necessario base64 codificare le stringhe auth da soli. In questo caso, credo che dovrebbe essere simile:

import base64 

auth = 'client_id %s client_secret %s' % (base64.b64encode(self.client_id), 
              base64.b64encode(self.client_secret)) 
self.api.credentials(HTTP_AUTHORIZATION=auth) 
+0

Quindi questo significa che arricciatura fa questo per te visto che non vedo lo stesso errore quando lo uso? Sarebbe utile se DRF lo aggiungesse ai documenti: http://www.django-rest-framework.org/api-guide/testing/ – Prometheus

1

Non si può mai specificare che tipo di metodo di autenticazione che si sta utilizzando, quindi per ora darò per scontato che si sta utilizzando una qualche forma di OAuth (a causa della client_id e client_secret).

Quando si inviano le credenziali OAuth using the Authorization header, è necessario inviarle come credenziali Basic access authentication. Ciò significa che devono essere inviati sotto forma di client_id:client_secret e codificati Base64 prima di essere inviati.

import base64 

credentials = '%s:%s' % (self.client_id, self.client_secret) 
authorization = 'Basic %s' % (base64.b64encode(credentials),) 

self.api = APIClient() 
self.api.credentials(HTTP_AUTHORIZATION=authorization) 

response = self.api.post(url, payload) 
Problemi correlati