Как использовать 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() {...});