0

gnome-shell 拡張機能の一部として、xmlrpc を使用して Web サービスを使用しようとしています。Web サービスは基本認証ヘッダーを想定しています。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 を保持していました。指定された資格情報が正しくありません。これを修正した後、呼び出しは成功しました。ただし、この方法では常にプロバイダーへの 2 つの呼び出しが必要です。1 つ目は BasicAuth を使用する情報を取得するため、2 つ目は実際に呼び出しを行うためです。

最初の呼び出しで認証情報を直接提供する方法はありますか?

4

1 に答える 1

0

承認をリクエストヘッダーに直接追加することが可能です

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

これにより、認証ヘッダーのない最初のリクエストが防止され、不正なリクエストに対して正しいステータス コードを返さず、代わりにログイン ページに転送する REST サービスの使用も許可されます。

于 2016-02-13T16:03:50.047 に答える