Обработка перенаправления oauth2 с электрона (или других настольных платформ)

Это в основном отсутствие понимания oauth2 и, вероятно, не специфическое для электрона, однако я пытаюсь обвести голову тем, как кто-то будет обрабатывать URL-адрес перенаправления oauth2 с настольной платформы, например, на электронном устройстве

Предполагая, что в приложении не существует настройки веб-службы, как настольное приложение запрашивает у пользователя учетные данные против службы oauth2 третьей стороны и затем правильно их аутентифицирует?

Ответ 1

Электронный JS запускает экземпляр браузера на вашем локальном хосте. Таким образом, вы можете обрабатывать URL-адрес перенаправления oauth2, предоставляя URL-адрес обратного вызова https: localhost/whatever/path/you/want. Просто убедитесь, что белый список на странице регистрации oauth2 для любой службы, которую вы используете.

Пример:

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;
});

Много вдохновения взято с этой страницы: http://manos.im/blog/electron-oauth-with-github/

Ответ 2

Спасибо за это решение. Я также заметил, что события навигации из webContents не являются надежными, когда никакие щелчки в окне браузера не вызывают перенаправление на URI перенаправления приложения. Например, страница входа в Github никогда не будет вызывать это событие с URI перенаправления, если я уже вошел в окно браузера. (Вероятно, он использовал какое-то хранилище сеансов).

Обходной путь, который я нашел, состоял в том, чтобы использовать вместо этого WebRequest

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
  });
});