【问题标题】:Azure SQL Server connection using MSI - Django使用 MSI 的 Azure SQL Server 连接 - Django
【发布时间】:2020-10-08 11:37:00
【问题描述】:

我已经使用 pyodbc 中的AccessToken 成功连接了 Azure SQL Server。这里我没有使用usernamepassword连接数据库。取而代之的是,我使用attrs_before 传递token。这里我自动生成令牌。

令牌生成:

identity_endpoint = os.environ["IDENTITY_ENDPOINT"]
identity_header = os.environ["IDENTITY_HEADER"]

def get_bearer_token(resource_uri): #Automattically token will generate
    token_auth_uri = f"{identity_endpoint}?resource={resource_uri}&api-version=2019-08-01"
    head_msi = {'X-IDENTITY-HEADER': identity_header}

    resp = requests.get(token_auth_uri, headers=head_msi)
    access_token = resp.json()['access_token']
    return access_token

Pyodbc 连接:

accessToken = bytes(get_bearer_token("https://database.windows.net/"), 'utf-8');
exptoken = b"";
for i in accessToken:
    exptoken += bytes({i});
    exptoken += bytes(1);
tokenstruct = struct.pack("=i", len(exptoken)) + exptoken;

conn = pyodbc.connect(
      "Driver={ODBC Driver 17 for SQL Server};Server=yoursqlserver.database.windows.net,1433;Database=dbName",
      attrs_before={1256: bytearray(tokenstruct)});

现在的问题是如何在 Django 框架中使用这个来连接数据库?使用 azure token 时,我们无法使用 usernamepassword 连接数据库。

请帮帮我。

【问题讨论】:

  • 哪个 OS django prod 和 dev 将是?
  • Linux环境
  • 我也遇到了同样的问题,你找到解决办法了吗?

标签: python django azure-sql-database


【解决方案1】:

解决方案:

在终端中(如果尚未安装)

pip3 install django-pyodbc-azure
pip3 install django-azure-sql-backend

在 Azure 门户中,您必须检查什么是tenant_id 和 client_id。由于您是从 pyodbc 连接的,因此我假设您拥有这些。空端口表示默认

在 settings.py 中:

    DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'your_database',
        'HOST': 'yourserver.database.example.net',
        'PORT': '',
        'AAD-AUTH': {
            'tenant_id': 'tenant_id',
            'client_id': 'client_id',
            'secret': "SECRET_KEY",
        },
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
        },
    },
}

如果您想关闭 pyodbc 的连接池,请将其设置为 False

DATABASE_CONNECTION_POOLING = False

如果 ODBC 驱动程序 17 失败,请尝试:

'driver': 'ODBC Driver 13 for SQL Server'

如果您没有 SECRET_KEY,您可以在应用注册时获取它。 (是的,要获得钥匙,你必须把它变成一个应用程序)

  1. 登录 Azure 门户。
  2. 在顶部搜索栏中,键入“Azure Active Directory”并单击 Active Directory 或单击左侧的更多服务,然后选择 Azure Active Directory
  3. 点击应用注册,然后点击“新应用注册”
  4. 提供应用程序的名称和 URL。
  5. 从 Azure Active Directory 中的应用注册中,选择您的应用。
  6. 复制应用程序 ID
  7. 在同一窗口中单击“设置”。
  8. 要生成身份验证密钥,请单击“密钥”。
  9. 更新密钥说明、持续时间和密码值,选择“保存”。

告诉我们进展如何?

【讨论】:

  • 感谢您的努力。我已经更新了我的代码,请你检查一下。在这里,即使我自动获得令牌。这个库使用密钥,实际上我的代码使用令牌。
  • 尝试删除 'secret': "SECRET KEY" 行。让我们测试一下
  • 在底部我包含了如何创建 SECRET_KEY 的信息
【解决方案2】:

使用这个包来处理这个特性。

pip install azure-msi-mssql-django

然后配置settings.py

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'mydb',
        'HOST': 'myserver.database.windows.net',
        'PORT': '',
        'IS_AZURE_BASED_TOKEN': True
        'OPTIONS': {
            'driver': 'ODBC Driver 13 for SQL Server',
        },
    },
}

如果您使用的是本地 SQL 服务器,请使用此配置。

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'mydb',
        'USER': 'user@myserver',
        'PASSWORD': 'password',
        'HOST': 'myserver.database.windows.net',
        'PORT': '',
        'IS_AZURE_BASED_TOKEN': False

        'OPTIONS': {
            'driver': 'ODBC Driver 13 for SQL Server',
        },
    },
}

更多详情:https://pypi.org/project/azure-msi-mssql-django/

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 2018-08-08
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多