Обработка перенаправления 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
});
});