validar usuario solicitar programa para nombre ingresar contraseña algoritmo alfanumerico python unit-testing flask http-basic-authentication flask-restful

python - solicitar - ¿Cómo enviar un nombre de usuario: contraseña a la solicitud de apptest() de unittest?



programa de usuario y contraseña en python (3)

Esto es parte de mi prueba de unidad en Flask-RESTful.

self.app = application.app.test_client() rv = self.app.get(''api/v1.0/{0}''.format(ios_sync_timestamp)) eq_(rv.status_code,200)

Dentro de la línea de comando podría usar curl para enviar el nombre de usuario: contraseña al servicio:

curl -d username:password http://localhost:5000/api/v1.0/1234567

¿Cómo logro lo mismo dentro de get () de mi prueba unitaria?

Como mi get / put / post requiere autenticación, de lo contrario la prueba fallaría.


De RFC 1945, Protocolo de transferencia de hipertexto - HTTP / 1.0

11.1 Esquema básico de autenticación

...

Para recibir autorización, el cliente envía el ID de usuario y la contraseña, separados por un solo carácter de dos puntos (":") dentro de una cadena codificada en base64 [5] en credentials.string.

...

Si el agente de usuario desea enviar el ID de usuario "Aladdin" y la contraseña abrir el sésamo ", usaría el siguiente campo de encabezado:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Entonces, si realmente usas la autenticación HTTP básica, puedes solucionarlo a continuación, aunque tu uso de curl sugiere algún otro esquema de autenticación.

from base64 import b64encode headers = { ''Authorization'': ''Basic '' + b64encode("{0}:{1}".format(username, password)) } rv = self.app.get(''api/v1.0/{0}''.format(ios_sync_timestamp), headers=headers)


Para Python 3, pruebe el siguiente ejemplo:

from base64 import b64encode headers = { ''Authorization'': ''Basic %s'' % b64encode(b"username:password").decode("ascii") } self.app.get("foo/", headers=headers)

Si desea usar variables dinámicas para nombre de usuario y contraseña, intente algo como:

''Basic %s'' % b64encode(bytes(username + '':'' + password, "utf-8")).decode("ascii")

Ver también: Python, HTTPS GET con autenticación básica


Una solución alternativa: todo el mérito recae en Doug Black

def request(self, method, url, auth=None, **kwargs): headers = kwargs.get(''headers'', {}) if auth: headers[''Authorization''] = ''Basic '' + base64.b64encode(auth[0] + '':'' + auth[1]) kwargs[''headers''] = headers return self.app.open(url, method=method, **kwargs)

y luego usa este método en tus pruebas:

resp = self.request(''GET'', ''api/v1.0/{0}''.format(ios_sync_timestamp), auth=(username, password))