2015-03-27 1 views
2

Я пытаюсь написать программу python, которая добавит нового пользователя на openfire-сервер. Я включил запросы пользовательского обслуживания и http basic auth. Я получаю ответ 401. Это мой кодсоздать новых пользователей в openfire через плагин пользовательского сервиса с использованием запросов python

import requests 
from requests.auth import HTTPDigestAuth 
def add_controller(name,password): 
    xml = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<user> 
    <username>""" + name + """</username> 
    <password>""" + password + """<password> 
</user>""" 
    headers = {'Content-Type': 'application/xml','Authorization':'Basic YWRtaW46MTIzNDU='} 
    r = requests.post(url='http://192.168.200.115:9090/plugins/userService/users', data=xml, headers=headers ,auth=HTTPDigestAuth('admin','admin')) 
    print r 

add_controller("[email protected]","test") 
+0

Похоже, что ваше микширование Basic и Digest auth. Я предполагаю, что это победа auth = HTTPDigestAuth ('admin', 'admin'). – dudeman

+0

@iamads как вы получаете данные (сообщения) с сервера openfire с помощью python? –

+0

@AvinashRaj Я использовал sleekxmpp для подключения к openfire https://github.com/fritzy/SleekXMPP – iamads

ответ

1

Вы не должны устанавливать два заголовка Authorization. Вы можете сделать Basic или Дайджест авторизации, и аргумент auth может обрабатывать либо. Выберите тот или другой.

Использование базовой аутентификации:

headers = {'Content-Type': 'application/xml'} 
r = requests.post(
    url='http://192.168.200.115:9090/plugins/userService/users', 
    data=xml, headers=headers, 
    auth=('admin', '12345')) 

или с помощью переваривать AUTH:

headers = {'Content-Type': 'application/xml'} 
r = requests.post(
    url='http://192.168.200.115:9090/plugins/userService/users', 
    data=xml, headers=headers, 
    auth=HTTPDigestAuth('admin', '12345')) 

См dedicated Authentication chapter документации.

Openfire user service endpoint должен отлично работать с базовым параметром auth.

Вы можете легко создать документ XML с помощью шаблонов, и вы должны действительно использовать xml.sax.saxutils.escape() function, чтобы обеспечить ваши данные пригодны для включения в документ:

from xml.sax.saxutils import escape 

xml = """\ 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<user> 
    <username>{}</username> 
    <password>{}<password> 
</user>""".format(escape(name), escape(password)) 
+0

@Matijn Я пробовал, как вы сказали, но я все еще получаю ответ 400, любые идеи? – iamads

+0

@iamads: Не знаю. Изменения, которые я предлагаю, делают правильную информацию POSTed для опубликованной спецификации. Есть ли что-нибудь в стороне от Openfire? –

+0

Наконец-то он работал, пришлось добавить заголовок авторизации. Спасибо – iamads

1

Это для моей будущей ссылки, Openfire требует заголовок авторизации. Мой рабочий код выглядит следующим образом: Он добавляет тестового пользователя с паролем в качестве теста

import requests 
from xml.sax.saxutils import escape 

def add_controller(name,password): 
    xml = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<user> 
    <username>{}</username> 
    <password>{}</password> 
</user>""".format(escape(name), escape(password)) 

    headers = {'Content-Type': 'application/xml','Authorization': 'Basic YWRtaW46MTIzNDU='} 
    r = requests.post(
     url='http://192.168.200.105:9090/plugins/userService/users', 
     data=xml, headers=headers, 
     auth=('admin', 'admin') 
    ) 
    print r 

add_controller("test","test") 
+0

Ваш заголовок 'Authorization' делает то же самое, что' auth = ('admin', '12345') '. Ваш кортеж 'auth' использует' ('admin', 'admin') * вместо *. Таким образом, похоже, что вы просто ввели неправильный пароль здесь; заголовок 'Authorization' * не нужен *, если вы используете' auth = (имя пользователя, пароль) ', но вам нужно указать правильное имя пользователя и пароль. –

+0

Вы можете проверить это самостоятельно: декодировать символы после 'Basic' в качестве Base64; вы увидите, что он декодирует 'admin: 12345'; имя пользователя и пароль, разделенные символом ':'. –