web-dev-qa-db-fra.com

Gestion de la redirection oauth2 à partir de electron (ou d’autres plates-formes de bureau)

Ceci est principalement un manque de compréhension de oauth2 et probablement pas spécifique à electron. Cependant, j'essaie de comprendre pourquoi quelqu'un gérerait une URL de redirection oauth2 à partir d'une plate-forme de bureau, comme electron?

En supposant qu’il n’y ait pas de configuration de service Web dans l’application, comment une application de bureau inviterait-elle un utilisateur à fournir des informations d’identification par rapport à un service tiers oauth2, puis à les authentifier correctement?

13
mariocatch

Electron JS exécute une instance de navigateur sur votre hôte local. Par conséquent, vous pouvez gérer une URL de redirection oauth2 en fournissant une URL de rappel de https: localhost/quel que soit/chemin/vous/souhaitez. Assurez-vous simplement de le répertorier sur la page d'inscription de l'application oauth2 pour le service que vous utilisez. 

Exemple: 

var authWindow = new BrowserWindow({
    width: 800, 
    height: 600, 
    show: false, 
    'node-integration': false,
    'web-security': false
});
// This is just an example url - follow the guide for whatever service you are using
var authUrl = 'https://SOMEAPI.com/authorize?{client_secret}....'

authWindow.loadURL(authUrl);
authWindow.show();
// 'will-navigate' is an event emitted when the window.location changes
// newUrl should contain the tokens you need
authWindow.webContents.on('will-navigate', function (event, newUrl) {
    console.log(newUrl);
    // More complex code to handle tokens goes here
});

authWindow.on('closed', function() {
    authWindow = null;
});

Beaucoup d'inspiration tirée de cette page: http://manos.im/blog/electron-oauth-with-github/

14
ryankdwyer

Merci pour cette solution. J'ai également remarqué que les événements de navigation des contenus Web ne sont pas fiables lorsqu'aucun clic sur la fenêtre du navigateur ne déclenche la redirection vers la redirection d'application URI. Par exemple, la page de connexion Github ne déclenchera jamais cet événement avec l'URI de redirection si j'étais déjà connecté dans la fenêtre du navigateur. (Il utilisait probablement une certaine mémoire de session).

La solution que j'ai trouvée consistait à utiliser WebRequest à la place

const { session } = require('electron');

// my application redirect uri
const redirectUri = 'http://localhost/oauth/redirect'

// Prepare to filter only the callbacks for my redirectUri
const filter = {
  urls: [redirectUri + '*']
};

// intercept all the requests for that includes my redirect uri
session.defaultSession.webRequest.onBeforeRequest(filter, function (details, callback) {
  const url = details.url;
  // process the callback url and get any param you need

  // don't forget to let the request proceed
  callback({
    cancel: false
  });
});
0
Loudghiri Ahmed