Подключение Azure Sql с использованием токена доступа из Azure Identity с помощью nodejs

Я пытаюсь использовать токены доступа из @azure / identity для подключения к azure sql с помощью mssql (который использует утомительно за кулисами). Токены доступа, похоже, не работают как есть (очень похоже на python - подробнее об этом позже).

У меня такой код:

      const identity = require("@azure/identity")
function getConfig(accessToken){
    var config = {
        "authentication": {
        "type": "azure-active-directory-access-token",
        "options": {
            "token": accessToken
            }
        },
        "server": "dbserver.database.windows.net",
        "options": {
          "encrypt": true,
          "database": "dbname",
            }
         };
            
         return config;
}
            
const cred = new identity.DefaultAzureCredential();
const token = await cred.getToken("https://database.windows.net/.default")
            
const conf = getConfig(token.token)
let pool = await sql.connect(conf)

Это всегда приводит к ошибке «Ошибка входа для пользователя ''».

У меня есть следующий код на Python, который делает то же самое:

        def get_token():
        creds = identity.DefaultAzureCredential()
        token = creds.get_token("https://database.windows.net/.default")
        tokenb = bytes(token.token, "UTF-8")
        exptoken = b''
    
        for i in tokenb:
            exptoken += bytes({i})
            exptoken += bytes(1)
            tokenstruct = struct.pack("=i", len(exptoken)) + exptoken
    
        return tokenstruct
    
  def execute_query():
    
        access_token = get_token()
        print(access_token)
        sql_server_name = "db-server"
        sql_server_db = "database_name"
    
        SQL_COPT_SS_ACCESS_TOKEN = 1256
        connString = f"Driver={{ODBC Driver 17 for SQL Server}};SERVER={sql_server_name}.database.windows.net;DATABASE={sql_server_db}"
        conn = pyodbc.connect(connString, attrs_before={
                              SQL_COPT_SS_ACCESS_TOKEN: access_token})
    
        cursor = conn.cursor()
        cursor.execute("SELECT * from SYSOBJECTS")
        row = cursor.fetchone()
    
        while row:
            print(row)
            row = cursor.fetchone()

Это прекрасно работает. Я также заметил следующее:

  1. Если я беру токен доступа из версии узла (напечатанный console.log) и передаю его коду python с помощью access_token, я получаю ту же ошибку от python (Ошибка входа для пользователя '').
  2. Если я передаю токен доступа из javascript и передаю его в код Python для token.token (в get_token), он работает отлично.

Итак, я предполагаю, что для работы кода узла необходимо выполнить двоичное заполнение и упаковку, которые работают для python. Есть ли способ сделать это? Или есть лучший способ передать токен доступа из лазурной идентификации в утомительный?

1 ответ

Дох ... Я использовал node-mssql, заброшенную библиотеку 0.0.1. При переключении на mssql (v6.3.1) используется утомительная последняя версия, и токен доступа работает напрямую.

Другие вопросы по тегам