Как реализовать авторизацию при запуске программы?
Не надо считать, что есть "основная форма". У тебя есть много разных форм/окон. "Основным" окном считается то окно, что создано первым, но это лишь формальность.

Более того, создано оно должно быть через конструктор форм 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), то мы продолжаем, запускаем программу, в противном случае программа просто заканчивается.
Авторизация может выглядеть следующим образом - сервер выдает токен (некое число, секретное, временное, чье время действия может продляться при его использовании), основанный на каких то идентификационных данных клиента (идентификатор компьютера или установки приложения, сетевой ip адрес и т.п., этот вопрос не простой и ответ на него определит серьезность проверки на действия злоумышленника, который попытается украсть этот токен).

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

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

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