Как использовать Basic Auth с libsoup через Gjs

Я пытаюсь запросить API GitHub с помощью токена. API Github принимает сгенерированные токены при условии, что они отправлены в качестве основного заголовка аутентификации.

API не возвращает HTTP 401, если вызов сделан без аутентификации, что означает, что если кто-то хочет запросить их API с помощью Basic Auth, нужно заполнить заголовок преимущественно, а не совершать обход.

Я сейчас пытаюсь запросить API с помощью libsoup и Gjs.

Я заметил, что SoupAuthManager имеет функцию, которая, как мне кажется, идеально соответствует тому, что мне нужно ( здесь soup_auth_manager_use_auth), но не может найти способ вызвать ее.

Это можно использовать для "предварительной загрузки" кеша авторизации менеджера, чтобы избежать дополнительного обхода HTTP в случае, если вы заранее знаете, что ответ 401 будет возвращен

Это то, что я сейчас использую, но это не работает, так как 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, ...);

Существуют ли другие методы, которые я мог бы использовать для принудительной базовой аутентификации при первом отключении? или есть другая библиотека, которую я мог бы использовать из gjs для вызова API github и принудительной базовой аутентификации?

1 ответ

Решение

Я нашел решение. Чтобы связать авторизацию с сеансом, можно использовать функцию add_feature. Теперь это определено здесь, но оказывается, что вызов его напрямую не работает

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() {...});
Другие вопросы по тегам