微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用来自 Azure Identity 的访问令牌和 nodejs 的 Azure Sql 连接

如何解决使用来自 Azure Identity 的访问令牌和 nodejs 的 Azure Sql 连接

我正在尝试使用来自@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()

这完美地工作。我还注意到以下几点:

  1. 如果我从节点版本(由console.log 打印)获取访问令牌并将其传递给access_token 中的python 代码,我会从python 收到相同的错误用户'' 登录失败)。立>
  2. 如果我从 javascript 传递访问令牌并将其传递给 token.token 的 python 代码(在 get_token 中),那么它就可以完美运行。

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

解决方法

Doh... 我使用的是废弃的 0.0.1 库 node-mssql。切换到mssql(v6.3.1)使用最新版本的繁琐,访问令牌直接生效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。