Могу ли я сделать упреждающую аутентификацию с httplib2? - PullRequest
5 голосов
/ 16 августа 2011

Мне необходимо выполнить упреждающую базовую аутентификацию на HTTP-сервере, то есть выполнить аутентификацию сразу, не ожидая ответа 401. Можно ли это сделать с помощью httplib2?

Edit:

Я решил это, добавив к запросу заголовок авторизации, как это предлагается в принятом ответе:

 headers["Authorization"] = "Basic {0}".format(
        base64.b64encode("{0}:{1}".format(username, password)))

Ответы [ 3 ]

4 голосов
/ 22 ноября 2011

Это также работает со встроенным httplib (для тех, кто хочет свернуть сторонние библиотеки / модули). Я использую его для аутентификации на нашем сервере Jenkins с помощью токена API, который Jenkins может создать для каждого пользователя.

>>> import base64, httplib
>>> headers = {}
>>> headers["Authorization"] = "Basic {0}".format(
        base64.b64encode("{0}:{1}".format('<username>', '<jenkins_API_token>')))

>>> ## Enable the job
>>> conn = httplib.HTTPConnection('jenkins.myserver.net')
>>> conn.request('POST', '/job/Foo-trunk/enable', None, headers)
>>> resp = conn.getresponse()
>>> resp.status
302

>>> ## Disable the job
>>> conn = httplib.HTTPConnection('jenkins.myserver.net')
>>> conn.request('POST', '/job/Foo-trunk/disable', None, headers)
>>> resp = conn.getresponse()
>>> resp.status
302
4 голосов
/ 16 августа 2011

Добавьте правильно сформированный заголовок «Авторизация» к вашему первоначальному запросу.

1 голос
/ 05 марта 2014

Я понимаю, что это старый, но я решил добавить решение, если вы используете Python 3 с httplib2, так как я не смог найти его где-либо еще.Я также проверяю подлинность на сервере Jenkins, используя маркер API для каждого пользователя Jenkins.Если вас не интересует Jenkins, просто замените действительный пароль пользователя на токен API.

b64encode ожидает двоичную строку символов ASCII.В Python 3 ошибка TypeError будет вызываться, если передается простая строка. Чтобы обойти это, часть заголовка «user: api_token» должна быть закодирована с использованием «ascii» или «utf-8», переданного в b64encode,затем результирующая строка байтов должна быть декодирована в обычную строку перед помещением в заголовок.Следующий код сделал то, что мне было нужно:

import httplib2, base64

cred = base64.b64encode("{0}:{1}".format(
    <user>, <api_token>).encode('utf-8')).decode()
headers = {'Authorization': "Basic %s" % cred}
h = httplib2.Http('.cache')
response, content = h.request("http://my.jenkins.server/job/my_job/enable",
    "GET", headers=headers)
...