Аутентификация пользователя третьей стороны с помощью Electron

#node.js #authentication #oauth-2.0 #electron

#node.js #аутентификация #oauth-2.0 #electron

Вопрос:

Я искал ресурсы о том, как реализовать аутентификацию пользователя в приложении Electron.

Я хотел бы использовать сторонние сервисы, такие как Github, чтобы разрешить пользователям входить в систему и регистрироваться. С «обычным» Node.js приложение, я бы, скорее всего, использовал что-то вроде passport.js или что-то подобное, чтобы реализовать это.

Моя путаница возникает из-за того, что приложения Electron являются клиентскими, поэтому наличие таких вещей, как секретные ключи вашего клиента, в коде на стороне клиента кажется неправильным. Итак, каков процесс реализации аутентификации стороннего пользователя в приложениях Electron?

Комментарии:

1. На данный момент вам нужно будет иметь секретные ключи вашего клиента на стороне клиента, и да, это действительно неправильно, но так оно и есть на данный момент.

Ответ №1:

Подумайте о приложении electron как о стандартной странице браузера. Тогда у вас будет стандартный поток oauth2.

Прежде всего, вам нужен сервер промежуточного программного обеспечения, где вы будете хранить ClientID и clientSecret для сторонних сервисов.

Вам нужно создать что-то вроде сеанса между приложением electron и сервером промежуточного программного обеспечения (ниже я покажу пример).

Ниже я покажу пример процесса авторизации на github.

Вам нужно использовать https.

Предположим, что ваш сервер промежуточного программного обеспечения доступен на example.com . Вам нужны минимум две конечные точки :

  1. ПОЛУЧАЕМ: https://example.com/initAuth /
  2. ПОЛУЧАЕМ: https://example.com/oauth/token

Github client_id и client_secret хранятся только на этом сервере.

Ваше приложение electron отправляет запрос на https://example.com/initAuth/ получение. И ваш сервер должен сгенерировать два uuid. Которые должны храниться как пара (например, в redis). Один uuid используется для state параметра в ссылке авторизации на github, а второй — как простой сеанс / токен для идентификации вашего электронного приложения. Ваш сервер должен создать URL-адрес для доступа к github github access:
GET https://github.com/login/oauth/authorize
где

  1. redirect_uri будет вашей второй конечной точкой — https://example.com/oauth/token
  2. state будет вашим первым uuid
  3. остальные параметры как обычно.

Теперь вы возвращаетесь с этой конечной точки к uuid сеанса / токена electron и встроенному URL.

Ваша электронная ссылка на показ с target =»_blank» — она должна быть открыта в отдельной вкладке / окне. Electron должен помнить uuid сеанса / токена.

Когда пользователь нажимает на ссылку, он попадает в процесс oauth, где он принимает ваше приложение. И затем он будет перенаправлен на вторую конечную точку вашего сервера промежуточного программного обеспечения (https://example.com/oauth/token )

Ваш сервер попадет в эту конечную code точку и state . Ваш сервер должен проверить, зарегистрировал ли он приложение electron с этим state . И если она существует, то серверу нужен обмен code и client_secret для access_token (я не буду это объяснять — это стандартный поток oauth). Теперь сохраните его во временном хранилище (redis) access_token и оба uuid. И в качестве ответа отобразите html-представление с помощью скрипта, который закроет эту вкладку, или просто обычный html-просмотр с некоторым сообщением.

Вашему приложению electron необходимо знать, имеет ли сервер промежуточного программного обеспечения access_token.

  1. Electron может время от времени опрашивать сервер промежуточного программного обеспечения, отправляя на третью конечную точку uuid сеанса / токена. И если есть access_token, сервер вернет его.
  2. Вы можете использовать websockets
  3. Ваше главное окно может проверить, закрыто ли второе окно «oauth», а затем отправить запрос на сервер промежуточного программного обеспечения для access_token.

Или, альтернативно, вы можете сохранить access_token на своем сервере промежуточного программного обеспечения, и ваш electron не будет отправлять запросы на github, а только на ваш сервер, и ваш сервер будет отправлять запросы на github, а ответы возвращаются на electron.

Комментарии:

1. Очень четкий ответ. Но я не понимаю одной вещи: после того, как пользователь предоставил доступ к GitHub через ваш сервер промежуточного программного обеспечения, разве сервер промежуточного программного обеспечения теперь не открыт для атак? Например. если тот же пользователь переходит на вредоносный веб-сайт, который вызывает JavaScript на вашем сервере промежуточного программного обеспечения, не может ли он получить токен GitHub иесть доступ к учетной записи пользователя? Я думаю, что CORS здесь даже не поможет, потому что сервер промежуточного программного обеспечения должен разрешать подстановочные знаки origins, чтобы позволить приложениям electron вызывать его.

2. Спасибо. Пожалуйста, проверьте последний абзац. Это показывает более безопасный метод. Прежде всего, нет способа получить токен доступа к github из промежуточного программного обеспечения. У промежуточного программного обеспечения нет метода, который вернет его. Промежуточное программное обеспечение отправляет запросы на github на основе полученных запросов от electron. В худшем случае вредоносный код может обмануть промежуточное программное обеспечение для выполнения определенных действий. Но этого не должно произойти, потому что промежуточное программное обеспечение будет выполнять только действия, если electron отправляет запросы с uuid сеанса.

3. Но как промежуточное программное обеспечение узнает, что именно приложение electron инициализирует сеанс, а не какое-либо другое вредоносное приложение? Должно быть, я что-то упускаю.

4. вы никогда не сможете доверять своему интерфейсному приложению (в данном случае electron). Вы никогда не можете быть уверены, что прямо сейчас звоните из вашего приложения. Если другое приложение делает все правильно, оно должно получить такой же правильный результат. Но этот результат должен повлиять только на одного пользователя, который его использовал. Больше никто. Если кто-то использует взломанную версию вашего приложения, то в худшем случае он пострадает. Вам необходимо предоставить надежный источник вашего приложения (например, Google, mac, юридические магазины Windows). Если клиент использует правильную / легальную версию вашего приложения и выполняет аутентификацию, его учетные данные должны быть безопасными, а не уязвимыми для атак.

5. если у вас есть более настраиваемый случай, возможно, вам следует описать его более подробно, и, возможно, мы что-нибудь придумаем