У меня есть рабочий сервер REST (Сидней), который использует специальный заголовок (AuthToken: «Token») для авторизации пользователей.
Когда я пытаюсь использовать «Авторизация: носитель 'токен'» в качестве заголовка в запросе POST, я получаю исключение на своем сервере отдыха, как показано ниже.
Похоже, мне нужно назначить процедуру TIdHTTPParseAuthenticationEvent, но я не могу найти, где это сделать.
Я не настраивал TIdHTTPServer специально. Я использовал мастер в IDE для создания нового сервера REST Datasnap. У меня есть группа проектов, совместно использующая TWebModuleUnit, который я могу использовать для создания автономного exe-файла для отладки, а затем создать DLL, которую я запускаю под IIS.





Когда вы создаете проект сервера REST Datasnap, он создает для вас объект TIdHTTPWebBrokerBridge по умолчанию, который является потомком TIdCustomHTTPServer. Вы можете назначить обработчик его событию OnParseAuthentication в коде (поскольку это не визуальный компонент формы), например:
procedure TForm1.FormCreate(Sender: TObject);
begin
FServer := TIdHTTPWebBrokerBridge.Create(Self);
FServer.OnParseAuthentication := ParseAuthentication; // <-- here
end;
procedure TForm1.ParseAuthentication(AContext: TIdContext;
const AAuthType, AAuthData: String;
var VUsername, VPassword: String;
var VHandled: Boolean);
begin
if TextIsSame(AAuthType, 'Bearer') then begin
// process AAuthData and assign VUsername and VPassword as needed...
VHandled := True;
end;
end;
ОБНОВЛЕНИЕ: начиная с Indy v10.6.3.3, метод TIdCustomHTTPServer.DoParseAuthentication() теперь называется virtual, поэтому вы можете альтернативно получить новый класс из TIdHTTPWebBrokerBridge и переопределить его, например:
type
TMyHTTPWebBrokerBridge = class(TIdHTTPWebBrokerBridge)
protected
function DoParseAuthentication(ASender: TIdContext;
const AAuthType, AAuthData: String;
var VUsername, VPassword: String): Boolean; override;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//FServer := TIdHTTPWebBrokerBridge.Create(Self);
FServer := TMyHTTPWebBrokerBridge.Create(Self);
end;
function TMyHTTPWebBrokerBridge.DoParseAuthentication(ASender: TIdContext;
const AAuthType, AAuthData: String;
var VUsername, VPassword: String): Boolean;
begin
if TextIsSame(AAuthType, 'Bearer') then begin
// process AAuthData and assign VUsername and VPassword as needed...
Result := True;
end else
Result := inherited DoParseAuthentication(ASender, AAuthType, AAuthData, VUsername, VPassword);
end;
Спасибо за быстрый ответ.
Да, вам нужен обработчик событий
OnParseAuthenticationдля схем аутентификации, отличных отBasic. Как вы вообще настроилиTIdHTTPServer, чтобы можно было назначить обработчикOnCommandPost, но не обработчикOnParseAuthentication?