Как я должен реализовать аутентификацию пользователя / роли для настольного приложения Electron?

#authentication #oauth-2.0 #electron #openid-connect #desktop-application

#аутентификация #oauth-2.0 #electron #OpenID-connect #desktop-приложение

Вопрос:

Я разрабатываю архитектуру для проекта колледжа, и я не знаю, как справиться с частью аутентификации пользователя и авторизации. Проект представляет собой настольное приложение Electron, которому потребуется два типа (отсюда и роли) пользователей. Они оба должны быть аутентифицированы, чтобы использовать приложение, и в зависимости от их личности у них будут разные авторизации. Поскольку проект предназначен для использования преподавателями и студентами как часть лабораторного занятия после его завершения, я не думаю, что более 30 человек будут использовать его одновременно.

Моей первой мыслью было использовать для этого базу данных PostrgeSQL в AWS и реализовать аутентификацию самостоятельно, но это означает, что пользователям придется зарегистрироваться и создать новый профиль, что означает запоминание еще одного <имя пользователя / адрес электронной почты, пароль>. Пытаясь избежать этого, я немного прочитал об OAuth 2.0 и OIDC и о том, как его можно использовать для аутентификации и авторизации пользователей, не выполняя ни одну из этих задач самостоятельно, а скорее делегируя задачу OIDC. Я создал бесплатную учетную запись с Auth0 и думал об использовании ее для интеграции с OIDC, но после прочтения около 40 страниц «Руководства по интеграции с OIDC», которое они предлагают бесплатно, я не мог знать, смогу ли я различать свою пользовательскую базу по этим ролям или тегам, как я упоминал. Я просто следовал инструкциям в учебном руководстве и пытался понять, как работает поток аутентификации, но это не дало мне никакой информации по моему вопросу.

Итак, в целом, что я хочу знать: возможно ли реализовать это с помощью Auth0 (бесплатная учетная запись) без использования стороннего решения для баз данных (такого как PostgreSQL с AWS)? Если нет, на что бы вы порекомендовали мне обратить внимание? Предпочтительно решение, которое позволит мне различать два типа пользователей, но в то же время использовать преимущества реализации OIDC, например, Google.

Ответ №1:

Здесь есть 2 отдельных решения:

АУТЕНТИФИКАЦИЯ НА РАБОЧЕМ СТОЛЕ

Двумя стандартными требованиями являются:

  • Используйте поток кода авторизации (PKCE)
  • Войдите в систему через системный браузер

Вы прослушиваете ответ на вход с помощью одного из этих механизмов (я предпочитаю последний):

  • Веб-сервер с обратной связью
  • Уведомление операционной системы о закрытой схеме URI

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

АВТОРИЗАЦИЯ API С ПОМОЩЬЮ РОЛЕЙ

Вам нужно сделать роли доступными для API через утверждения. Это может быть сделано любым из этих механизмов (я предпочитаю последний):

  • Включение ролей в токены доступа через Auth0
  • Заставьте API считывать роли пользователей из собственной базы данных

В моем сообщении в блоге авторизации обсуждается создание объекта claims простым в расширении способом. Основная цель обычно заключается в том, чтобы обработка API OAuth привела к созданию объекта, подобного этому:

 class UserPrincipal {

  // The technical user id from the access token 
  string sub;

  // The user id from your own database
  string userId;

  // The user's roles
  string[] roles;

}
  

Учитывая этот объект, вы можете делать подобные вещи:

  • При необходимости используйте авторизацию на основе ролей
  • Предоставляйте пользовательские ресурсы после входа в систему из данных вашего приложения

ПОДВОДЯ ИТОГ

Auth0 будет соответствовать некоторым вашим требованиям и может быть всем, что вам нужно в первые дни. Однако в какой-то момент вам, вероятно, потребуется управлять пользовательскими данными, отличными от OAuth, в вашем API.

Рад ответить на любые последующие вопросы..

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

1. Спасибо! Я обязательно проверю предоставленные вами ссылки и пометю их как разрешенные, если они решат мою проблему 🙂