Использовать веб-сервис с базовой аутентификацией, используя Soup

В рамках расширения оболочки gnome я пытаюсь использовать веб-сервис, используя xmlrpc. Веб-сервис ожидает базовый заголовок аутентификации. Используя Soup, я получил следующий код (в основном проект из большого расширения openweather):

function load_json_async() {

    if (_httpSession === undefined) {
       _httpSession = new Soup.Session();
    } else {
        // abort previous requests.
        _httpSession.abort();
    }

    let message = Soup.xmlrpc_message_new (
         "https://api.sipgate.net/RPC2", 
         "samurai.BalanceGet", 
         new GLib.Variant('()',1.0)
     )

    _httpSession.connect('authenticate', 
       Lang.bind(
         this,function(session,message, auth,retryFlag){
           auth.authenticate("xxxxx","xxxxx");
         }
       )
     )

    _httpSession.queue_message(
       message, 
       Lang.bind(this, 
           function(_httpSession, message) {
            try {
              if (!message.response_body.data) {
                log("hello1 "+message.response_body.status)
                return;
              } else {
                log("got message-status:"+message.status_code)
              }
              log(message.response_body.data)
            } catch (e) {
              log("exception:"+e)                
              return;
            }
       return;
    }));
    return;
}

Я использую Суп для создания связи. Сигнал проверки подлинности выполняется перед выполнением обратного вызова очереди.

Тем не менее, в начале в рамках обратного вызова, response_body удерживал код состояния 401 вместо ожидаемой авторизации. Указанные учетные данные неверны. После исправления вызов прошел. Тем не менее, вам всегда нужны два вызова для провайдера таким образом: первый, чтобы получить информацию, которую он использует BasicAuth, и второй, чтобы фактически сделать вызов.

Есть ли способ предоставить информацию для аутентификации непосредственно при первом вызове?

1 ответ

Решение

Можно добавить авторизацию прямо в заголовок запроса

let auth = new Soup.AuthBasic()
auth.authenticate("xxx","xxx");
message.request_headers.append("Authorization",auth.get_authorization(message))

Это предотвращает первый запрос без заголовка авторизации, а также позволяет использовать службы REST, которые не возвращают правильный код состояния для неавторизованных запросов и перенаправляют на страницу входа.

Другие вопросы по тегам