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

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

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

Сейчас я пытаюсь запросить 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 и принудительной базовой аутентификации?


person alexduf    schedule 08.10.2016    source источник


Ответы (1)


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

this._httpSession.add_feature(authManager)

вместо этого он работает, если вызывается так:

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

наконец, API github отклоняет любой вызов без пользовательского агента, поэтому я добавил следующее:

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() {...});
person alexduf    schedule 11.10.2016