2016-10-08 20 views
1

githubのapiにトークンを照会しようとしています。 Githubのapiは、生成されたトークンを、基本的な認証ヘッダーとして送信されることを条件に受け入れます。Basic Auth with libsoup with Gjs

APIは、認証なしで呼び出しが行われた場合はHTTP 401を返しません。これは、基本認証を使用してAPIにクエリを実行する場合、往復を行うのではなく先行してヘッダーを入力する必要があることを意味します。

私は今、libsoupとGjsを使用してAPIをクエリしようとしています。

私はSoupAuthManagerが必要とするもの(soup_auth_manager_use_auth here)と完全に一致するように見えるが、それを呼び出す方法が見つからないことに気付きました。これは、あなたが401応答が

これを返されることを事前に知っている場合は、余分なHTTPラウンドトリップを回避するために、「プリロード」マネージャーの認証キャッシュに使用することができます

私が現在使っているものですが、SoupAuthManagerはセッションのプライベートオブジェクトなので動作しません。したがって、プログラムの実際の動作には影響

let httpSession = new Soup.Session(); 
let authUri = new Soup.URI(url); 
authUri.set_user(this.handle); 
authUri.set_password(this.token); 
let message = new Soup.Message({method: 'GET', uri: authUri}); 

let authManager = new Soup.AuthManager(); 
let auth = new Soup.AuthBasic({host: 'api.github.com', realm: 'Github Api'}); 

authManager.use_auth(authUri, auth); 
httpSession.queue_message(message, ...); 

は、私が最初にroud旅行に基本認証を強制するために使用することができますが、他の方法はありますか?またはgjsからgithubのAPIを呼び出して基本認証を強制するために使用できる他のライブラリがありますか?

答えて

0

解決策が見つかりました。承認をセッションにリンクするには、add_feature関数を使用します。さて、これはhere定義されていますが、代わりにそのように呼ばれる場合に動作するようです

this._httpSession.add_feature(authManager) 

を動作しませんそれを直接呼び出すことが判明:

Soup.Session.prototype.add_feature.call(httpSession, authManager); 

最後に、githubのAPIはせずに任意のコールを拒否しますユーザエージェントは、私は、次の追加:

httpSession.user_agent = 'blah' 

最終的なコードは次のようになります。

let httpSession = new Soup.Session(); 
httpSession.user_agent = 'blah' 
let authUri = new Soup.URI(url); 
authUri.set_user(this.handle); 
authUri.set_password(this.token); 
let message = new Soup.Message({method: 'GET', uri: authUri}); 

let authManager = new Soup.AuthManager(); 
let auth = new Soup.AuthBasic({host: 'api.github.com', realm: 'Github Api'}); 

Soup.Session.prototype.add_feature.call(httpSession, authManager); 
httpSession.queue_message(message, function() {...});