如何通过 Gjs 将 Basic Auth 与 libsoup 一起使用

How to use Basic Auth with libsoup via Gjs

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

如果在没有授权的情况下进行调用,API 不会 return HTTP 401,这意味着如果想使用 Basic Auth 查询他们的 api,则必须填写 header pre-emptively 而不是往返。

我现在正在尝试使用 libsoup 和 Gjs 查询 API。

我注意到 SoupAuthManager 有一个功能似乎完全符合我的需要 (soup_auth_manager_use_auth here),但找不到调用它的方法。

This can be used to "preload" manager 's auth cache, to avoid an extra HTTP round trip in the case where you know ahead of time that a 401 response will be returned

这是我目前使用的,但它不起作用,因为 SoupAuthManager 是 session 的私有 object;因此对程序的实际行为没有影响

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, ...);

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

我找到了解决办法。要link 对会话的授权,可以使用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() {...});