Azure Sql连接使用访问令牌从Azure Identity与nodejs



我试图使用访问令牌从@azure/身份连接到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打印)获取访问令牌并将其传递给access_token中的python代码,我将从python获得相同的错误(Login failed for user ")。
  2. 如果我从javascript传递访问令牌并将其传递给令牌的python代码。

所以我猜二进制填充和打包的东西是为python工作需要完成节点代码的工作。有什么办法可以做到吗?或者是否有更好的方法将访问令牌从azure-identity传递给繁琐?

…我正在使用node-mssql,这是废弃的0.0.1库。切换到mssql (v6.3.1)使用了一个最新版本的繁琐,访问令牌直接工作。

最新更新