Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с Azure SQL Database через ODBC в Delphi с аутентификацией OAuth 2

Delphi , Графика и Игры , Canvas

Работа с Azure SQL Database через ODBC в Delphi с аутентификацией OAuth 2

При работе с базами данных Azure SQL Database в Delphi с использованием FireDAC и ODBC 18 может возникнуть необходимость в аутентификации с помощью OAuth 2. К счастью, Microsoft предоставляет возможность подключения к Azure SQL Database с помощью маркера доступа OAuth 2, но FireDAC не поддерживает этот метод аутентификации непосредственно. В этой статье мы рассмотрим, как добавить поддержку аутентификации с помощью маркера доступа OAuth 2 в FireDAC для подключения к Azure SQL Database через ODBC в Delphi.

Проблема

Разработчик получил маркер доступа OAuth 2 для аутентификации в Azure SQL Database и успешно подключился к нему через консоль портала Azure. Теперь он хочет использовать этот маркер для подключения из своего приложения Delphi с помощью FireDAC через ODBC 18. Однако FireDAC не поддерживает данный метод аутентификации, и разработчик пытался добавить эту функциональность самостоятельно, отредактировав процедуру SetupConnection в единице FireDAC.Phys.ODBCBase. При попытке подключения он получает ошибку:

[FireDAC][Phys][ODBC][Microsoft][ODBC Driver 18 for SQL Server][SQLServer]Login failed for user ''

Решение

Для корректной передачи маркера доступа OAuth 2 в Azure SQL Database через ODBC в Delphi необходимо учитывать правильную структуру данных маркера. В документации Microsoft по аутентификации с помощью маркера доступа в ODBC указано, что строка маркера должна быть преобразована в формат Unicode с каждым символом, за которым следует нулевой символ (0).

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

Ниже приведен пример кода, демонстрирующий правильную обработку маркера доступа OAuth 2 в процедуре SetupConnection:

type
  PAccessToken = ^TAccessToken;
  TAccessToken = packed record
    dataSize: DWORD;
    data: TBytes;
  end;

var
  A: PAccessToken = nil;

procedure TFDPhysODBCConnectionBase.SetupConnection;
const
  SQL_COPT_SS_ACCESS_TOKEN = 1256;

var
  lPrevIgnoreErrors: Boolean;
  size: DWORD;
  S: UnicodeString;
begin
  if ConnectionDef.HasValue(S_FD_ConnParam_Common_LoginTimeout) then begin
    // Old informix versions (at least 9.4 and less) do not support LOGIN_TIMEOUT
    lPrevIgnoreErrors := ODBCConnection.IgnoreErrors;
    ODBCConnection.IgnoreErrors := True;
    try
      ODBCConnection.LOGIN_TIMEOUT := ConnectionDef.AsInteger[S_FD_ConnParam_Common_LoginTimeout];
    finally
      ODBCConnection.IgnoreErrors := lPrevIgnoreErrors;
    end;
  end;

  if ConnectionDef.HasValue('AuthToken') then begin
    lPrevIgnoreErrors := ODBCConnection.IgnoreErrors;
    ODBCConnection.IgnoreErrors := True;
    try
      S := ConnectionDef.AsString['AuthToken'];
      size := Length(S) * 2;

      if Assigned(A) then
        Dispose(A);

      New(A);
      A.dataSize := size + 2; // +2 для дополнительного нулевого символа в конце
      SetLength(A.data, A.dataSize);
      ZeroMemory(@(A.data[0]), A.dataSize);
      Move(S[1], A.data[0], Length(S) * 2);
      A.data[A.dataSize - 1] := 0; // Добавляем дополнительный нулевой символ в конце

      ODBCConnection.Lib.SQLSetConnectAttr(ODBCConnection.Handle, SQL_COPT_SS_ACCESS_TOKEN, SQLPointer(A), SQL_IS_POINTER);
    finally
      ODBCConnection.IgnoreErrors := lPrevIgnoreErrors;
    end;
  end;
end;

После внесения этих изменений в код FireDAC.Phys.ODBCBase, маркер доступа OAuth 2 должен быть корректно передан Azure SQL Database, и подключение должно успешно выполниться без ошибки аутентификации.

Альтернативный ответ

В качестве альтернативы можно использовать библиотеку Microsoft.Data.SqlClient для подключения к Azure SQL Database с помощью аутентификации OAuth 2 в Delphi. Библиотека Microsoft.Data.SqlClient поддерживает аутентификацию с помощью маркера доступа OAuth 2, и ее можно использовать вместо FireDAC и ODBC для подключения к базе данных. Однако это потребует внесения изменений в существующий код и может привести к дополнительным затратам времени на разработку и тестирование.

Заключение

В этой статье мы рассмотрели, как добавить поддержку аутентификации с помощью маркера доступа OAuth 2 в FireDAC для подключения к Azure SQL Database через ODBC в Delphi. Мы обнаружили, что для корректной передачи маркера необходимо добавить дополнительный нулевой символ в конце строки маркера после преобразования ее в формат Unicode. После внесения этих изменений в код FireDAC.Phys.ODBCBase, разработчики смогут успешно подключаться к Azure SQL Database с помощью аутентификации OAuth 2 в своих приложениях Delphi.

Создано по материалам из источника по ссылке.

Контекст: "Работа с Azure SQL Database через ODBC в Delphi с аутентификацией OAuth 2"


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Canvas ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:25:33/0.013535976409912/1