node.js - 使用来自 Azure Identity 的访问 token 与 Nodejs 进行 Azure Sql 连接

标签 node.js azure azure-active-directory tedious azure-sql

我正在尝试使用 @azure/identity 中的访问 token 通过 mssql (在幕后使用繁琐的操作)连接到 azure sql。访问 token 似乎不能按原样工作(与 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. 如果我从 Node 版本中获取访问 token (由 console.log 打印)并将其传递给 access_token 中的 python 代码,我会从 python 中得到相同的错误(用户“登录失败”)。<
  2. 如果我从 javascript 传递访问 token 并将其传递给 token.token 的 python 代码(在 get_token 中),那么它就可以完美运行。

所以我猜测需要完成适用于 python 的二进制填充和打包操作, Node 代码才能正常工作。有什么方法可以做到这一点吗?或者是否有更好的方法将访问 token 从 azure-identity 传递到乏味?

最佳答案

哦...我正在使用node-mssql,它是废弃的0.0.1 库。切换到mssql(v6.3.1)使用了最新版本的tedious,访问 token 直接起作用。

关于node.js - 使用来自 Azure Identity 的访问 token 与 Nodejs 进行 Azure Sql 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66359150/

相关文章:

javascript - Sequelize.js 删除查询?

node.js - 从我的 Node 服务器上的 AWS S3 获取签名 URL

node.js - Nodejs,如何检测关闭的套接字?

javascript - Nodejs json 字符串显示为 [object Object]

azure-active-directory - Microsoft Graph API - 新的委派权限删除了应用程序权限

xamarin.forms - 该应用程序无法访问 Xamarin.Forms 中的 iOS 钥匙串(keychain),但可在 Android 中使用

Azure 服务总线队列消息处理

sql-server - 查看服务器状态并查看 SQL 托管实例中的所有定义

visual-studio - 如何调试我的 Azure 项目中的其他程序集

azure-active-directory - oid 在 AAD 中的所有租户中是否唯一?