2016-02-11 5 views
0

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

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, а второй для фактического вызова.

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

ответ

0

Можно добавить разрешение непосредственно в заголовок запроса

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

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