pyodbc 将支持使用 AD 访问令牌而不是用户/密码连接到 Azure SQL DB?

Pan*_*nda 3 azure azure-active-directory azure-sql-database

目前,我使用设备代码凭据来访问 Azure AD。

device_code_credential = DeviceCodeCredential(
        azure_client_id,
        tenant_id=azure_tenant_id,
        authority=azure_authority_uri)
Run Code Online (Sandbox Code Playgroud)

但我仍然需要使用 Azure 帐户用户名/密码来连接到 Azure SQL 服务器

driver = 'ODBC Driver 17 for SQL Server'
db_connection_string = f'DRIVER={driver};SERVER={server};' \
    f'DATABASE={database};UID={user_name};PWD={password};'\
    f'Authentication=ActiveDirectoryPassword;'\
    'Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;'
connector = pyodbc.connect(db_connection_string)
Run Code Online (Sandbox Code Playgroud)

linux/MacOS 下的 python 有什么方法可以允许我使用 device_code_credential 和 access_token 连接到 Azure SQL 服务器吗?

https://github.com/mkleehammer/pyodbc/issues/228

我只得到了这个链接,但似乎不起作用。

有人有完整的工作样本吗?

Leo*_*Yue 6

您可以参考本教程:AzureAD/azure-activedirectory-library-for-python:连接到 Azure SQL 数据库

可以通过 ADAL Python 从 Azure Active Directory (AAD) 获取令牌来连接到 Azure SQL 数据库。我们目前没有维护它的完整示例,但本文概述了一些关键要素。

  1. 您按照使用访问令牌连接的说明来配置您的应用程序。这里还有另一篇类似的博客文章。
  2. 您的 SQL 管理员需要将应用程序注册权限添加到您尝试访问的特定数据库。请参阅 Mirek H Sztajno 撰写的这篇博客文章《使用 Azure AD 身份验证对 Azure SQL DB 进行基于令牌的身份验证支持》中的详细信息。
  3. 在上面的两个文档中都没有特别强调它,但您需要将其用作https://database.windows.net/资源字符串。请注意,您需要保留尾部斜杠,否则发行的令牌将不起作用。
  4. 将上述配置输入 ADAL Python 的客户端凭据示例
  5. 获得访问令牌后,在 pyodbc 中以这种方式使用它来连接到 SQL 数据库。

这适用于 AAD 访问令牌。在 Python 2.x 中扩展令牌并添加长度的示例代码,如上面链接的页面中所述:

token = "eyJ0eXAiOi...";
exptoken = "";
for i in token:
    exptoken += i;
    exptoken += chr(0);
tokenstruct = struct.pack("=i", len(exptoken)) + exptoken;
conn = pyodbc.connect(connstr, attrs_before = { 1256:bytearray(tokenstruct) });
Run Code Online (Sandbox Code Playgroud)

由于烦人的字符/字节分割,3.x 只是稍微复杂一些:

token = b"eyJ0eXAiOi...";
exptoken = b"";
for i in token:
    exptoken += bytes({i});
    exptoken += bytes(1);
tokenstruct = struct.pack("=i", len(exptoken)) + exptoken;
conn = pyodbc.connect(connstr, attrs_before = { 1256:tokenstruct });
Run Code Online (Sandbox Code Playgroud)

(SQL_COPT_SS_ACCESS_TOKEN 为 1256;它特定于 msodbcsql 驱动程序,因此 pyodbc 没有定义它,而且很可能也不会。)

希望这可以帮助。