2016-10-08 2 views
1

J'essaye d'interroger l'API de github avec un jeton. L'API de Github accepte les jetons générés à condition qu'ils soient envoyés en tant qu'en-tête d'authentification de base. L'API ne renvoie pas le protocole HTTP 401 si l'appel est effectué sans authentification, ce qui signifie que si l'on veut interroger son API en utilisant Basic Auth, il faut remplir l'en-tête de manière préventive plutôt que de faire un aller-retour.Comment utiliser Basic Auth avec libsoup via Gjs

J'essaie maintenant d'interroger l'API en utilisant libsoup et Gjs.

J'ai remarqué que SoupAuthManager a une fonction qui semble correspondre parfaitement à ce dont j'ai besoin (soup_auth_manager_use_auth here) mais que je ne trouve pas un moyen de l'invoquer.

Ceci peut être utilisé pour mettre en cache auth de gestionnaire « de précontrainte » pour éviter un aller-retour HTTP supplémentaire dans le cas où vous savez à l'avance qu'une réponse 401 sera retourné

Cette est ce que j'utilise actuellement, mais cela ne fonctionne pas car SoupAuthManager est un objet privé de la session; et n'a donc pas d'effet sur le comportement réel du programme

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

Y at-il d'autres méthodes que je pourrais utiliser pour forcer Basic Auth lors du premier voyage roud? ou y at-il une autre bibliothèque que je pourrais utiliser à partir de gjs pour appeler l'API de github et forcer l'authentification de base?

Répondre

0

J'ai trouvé la solution. Pour lier l'autorisation à la session, on peut utiliser la fonction add_feature. Maintenant, cela est défini here, mais il se trouve l'appelant directement ne fonctionne pas

this._httpSession.add_feature(authManager) 

à la place, il semble fonctionner si elle est appelée comme ça:

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

enfin, l'api github rejette tout appel sans agent utilisateur, donc j'ajouté ce qui suit:

httpSession.user_agent = 'blah' 

le code final ressemble à:

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() {...});