@TotTip

Как реализовать авторизацию при запуске программы?

Здравствуйте!
Как реализовать авторизацию в программе при запуске?
При первом запуске предлагается авторизация (запрос к сайту и добавление записи в реестр винды)
При каждом последующем запуске(запускается с виндой и сразу в трей) программа будет обращаться в реестр(была ли ранее авторизация) и к сайту (проверять есть ли этот пользователь в базе данных).
Программа уже написана и работает, осталось прикрутить данный функционал.
Как это правильно сделать? Я добавил форму авторизации к основной программе, но не совсем понимаю как связать всё вместе. Сделать форму авторизации "основной", чтобы она при запуске программы была первой и из неё запускать основную форму? Или это всё как то иначе реализуется?
Со стороны сервера все просто - база данных(логин, пароль, дата добавления) и простая админка для добавления/удаления пользователей.
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
HemulGM
@HemulGM Куратор тега Delphi
Delphi Developer, сис. админ
Не надо считать, что есть "основная форма". У тебя есть много разных форм/окон. "Основным" окном считается то окно, что создано первым, но это лишь формальность.

Более того, создано оно должно быть через конструктор форм Application. А если создавать окна простым способом
TFormAuth.Create(...) то оно не будет считаться основным.

Итого, для того, чтобы по уму сделать окно авторизации, тебе нужно зайти в код программы (не в код модуля, а в код программы). Да, представь, такое место тоже есть. Делфи его прячет от новичков. Открыть его можно через контекстное меню проекта "View Source" или через меню "Project" -> "View Source".

Там ты увидишь код запуска приложения, в том числе создание форм. Этот код можно и нужно редактировать. Там ты и должен создавать окно авторизации, чтоб выполнить проверку и либо запустить приложение, либо не запускать.

UPD. Пример
program Temp;

uses
  Vcl.Forms,
  Vcl.Controls,
  Temp.Main in 'Temp.Main.pas' {FormMain},
  Temp.Auth in 'Temp.Auth.pas' {FormAuth};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  FormAuth := TFormAuth.Create(nil);
  if FormAuth.ShowModal = mrOk then
  begin
    Application.CreateForm(TFormMain, FormMain);
    Application.Run;
  end;
end.


Как ты видишь, я убрал автоматически созданную строку
Application.CreateForm(TFormAuth, FormAuth);
и создал форму сам
FormAuth := TFormAuth.Create(nil);
Дальше, я сделал простую проверку, если окно было закрыто с mrOk (т.е. нажата кнопка OK), то мы продолжаем, запускаем программу, в противном случае программа просто заканчивается.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rPman
Авторизация может выглядеть следующим образом - сервер выдает токен (некое число, секретное, временное, чье время действия может продляться при его использовании), основанный на каких то идентификационных данных клиента (идентификатор компьютера или установки приложения, сетевой ip адрес и т.п., этот вопрос не простой и ответ на него определит серьезность проверки на действия злоумышленника, который попытается украсть этот токен).

Т.е. приложение смотрит, есть ли токен в памяти,
* если нет - открывает форму авторизации, и в месте с данными из нее (точнее обработанные каким-нибудь алгоритмом криптонадежного хеширования) отправляет на сервер идентификатор клиента, сервер проверяет, можно ли давать доступ, прекращает работу выданных ранее этому же клиенту токенов, и выдает новый.
* если токен есть - приложение делает запрос с этим токеном и своими идентификаторами (так же хешированными) на сервер, а он в свою очередь проверяет, не закончилось ли время действия токена и выдает либо да либо нет.

Процесс авторизации можно воспринимать как выдачу ключа активации (например при покупке своей копии программы).

Нужно понимать что эту проверку можно обойти, убрав этот запрос из кода в принципе. Более надежным является перенос части или всего функционала приложения на серверную сторону, в этом случаее взломать так просто не получится но и работа может быть не такой комфортной из-за лагов, да и нагрузка на сервер станет выше.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы