我正在尝试使用 @azure/identity 中的访问令牌通过 mssql 连接到 azure sql(在幕后使用繁琐的操作)。访问令牌似乎不能按原样工作(与 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()
这非常有效。我还注意到以下几点:
所以我猜测需要完成适用于 python 的二进制填充和打包操作,节点代码才能正常工作。有什么方法可以做到这一点吗?或者是否有更好的方法将访问令牌从 azure-identity 传递到乏味?
Doh...我正在使用node-mssql,它是废弃的0.0.1 库。切换到mssql(v6.3.1)使用了最新版本的tedious,访问令牌直接起作用。
我面临着非常相似的问题。我正在尝试使用 mssql 版本 10.0.2 和 azure Identity 版本 4.0.1 。我正在尝试连接到 azure Fabric sql 端点。 出现以下错误。
err = new ConnectionError(err)
^
ConnectionError: Connection lost - socket hang up
使用 pyodbc 的相应 python 代码工作正常。