2016-10-08 5 views
1

Я пытаюсь запросить api github с помощью токена. Api Github принимает сгенерированные токены при условии, что они отправляются как основной заголовок auth.Как использовать Basic Auth с libsoup через Gjs

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

Теперь я пытаюсь запросить API с помощью libsoup и Gjs.

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

Это может быть использован для «предварительной нагрузки» кэш аутентификации менеджера «s, чтобы избежать дополнительного 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, ...); 

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

ответ

0

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

this._httpSession.add_feature(authManager) 

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

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

наконец, 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() {...});