如何通过Gjs使用libsoup进行Basic Auth

时间:2016-10-08 16:05:26

标签: gnome gobject gnome-shell-extensions gjs libsoup

我试图用令牌查询github的api。 Github的api接受生成的令牌,前提是它们作为基本身份验证头发送。

如果没有使用auth进行调用,则API不返回HTTP 401,这意味着如果想要使用Basic Auth查询其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, ...);

我是否可以使用其他方法在第一次旅行中强制使用Basic Auth?或者是否有其他库可以从gjs中使用来调用github的API并强制执行基本身份验证?

1 个答案:

答案 0 :(得分: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() {...});