【问题标题】:tedious: Azure AD with accessToken Connection lost - read ECONNRESET乏味:Azure AD with accessToken Connection lost - 读取 ECONNRESET
【发布时间】:2020-11-28 04:25:58
【问题描述】:

我正在开发一个应用程序,该应用程序使用 Azure AD 对用户进行身份验证,提取他的 accessToken,然后使用此令牌使用以下设置连接到 Azure SQL 服务器。

但不幸的是,我立即收到 ESOCKET“连接丢失 - 读取 ECONNRESET”,

const config = {
          server: 'db-server-name.database.windows.net',
          authentication: {
            type: 'azure-active-directory-access-token',
            options: {
              token: cloudAccessToken
            }
          },
          options: {
            debug: {
              packet: true,
              data: true,
              payload: true,
              token: false,
              log: true
            },
            database: 'DBNAME',
            encrypt: true,
            packetSize: 8192,
            keepAlive:true,
            requestTimeout: 300000,
            connectionTimeout: 32000,
          }
        };

        const connection = new Connection(config);

        connection.on('connect', function (err) {
          if (err) {
            console.log(err);
          }
          executeStatement();
        });

        connection.on('debug', function (text) {
          console.log(text);
        });

        connection.on('error', function (err) {
          console.error(err); // --> this gets trigger with error ESOCKET right away
        });

【问题讨论】:

标签: azure-active-directory azure-web-app-service azure-sql-database azure-sql-server tedious


【解决方案1】:

你一定错过了什么。代码在下面提供给您。具体操作可以参考Jim的回答。

我已经测试过了,它对我有用。我认为它对你有用。更多详情可以参考这篇文章。

Connecting to Azure SQL using Service Principal in NodeJS, but token is rejected

var msrestAzure = require("ms-rest-azure");
var { Connection, Request } = require("tedious");

let clientSecret = "xxx";
let serverName = "xxx.database.windows.net";
let databaseName = "xxx";
let clientId = "xxx";
let tenantId = "xxx";

async function getConnect() {
  // way for Azure Service Principal
  let databaseCredentials = await msrestAzure.loginWithServicePrincipalSecret(
    clientId,
    clientSecret,
    tenantId,
    {
      tokenAudience: "https://database.windows.net/",
    },
  );

  // getting access token
  let databaseAccessToken = await new Promise((resolve, reject) => {
    databaseCredentials.getToken((err, results) => {
      if (err) return reject(err);
      resolve(results.accessToken);
    });
  });
  var config = {
    server: serverName,
    authentication: {
      type: "azure-active-directory-access-token",
      options: {
        token: databaseAccessToken,
      },
    },
    options: {
      debug: {
        packet: true,
        data: true,
        payload: true,
        token: false,
        log: true,
      },
      database: databaseName,
      encrypt: true,
    },
  };

  var connection = new Connection(config);
  connection.connect();
  connection.on("connect", function (err) {
    if (err) {
      console.log(err);
    }
    executeStatement(connection);
  });

  connection.on("debug", function (text) {
    console.log(text);
  });
}
function executeStatement(connection) {
  request = new Request("select * from CSVTest", function (err, rowCount) {
    if (err) {
      console.log(err);
    } else {
      console.log(rowCount + " rows");
    }

    connection.close();
  });

  request.on("row", function (columns) {
    columns.forEach(function (column) {
      if (column.value === null) {
        console.log("NULL");
      } else {
        console.log(column.value);
      }
    });
  });

  request.on("done", function (rowCount, more) {
    console.log(rowCount + " rows returned");
  });

  connection.execSql(request);
}

getConnect()
  .then(() => {
    console.log("run successfully");
  })
  .catch((err) => {
    console.log(err);
});

【讨论】:

  • 你认为我在 Azure 门户中缺少一些 Azure SQL 设置/权限吗?
  • @rohit12sh 还是别的?你仔细阅读吉姆的回答了吗?它真的很有用。我希望你能按照步骤告诉我结果。
  • @rohit12sh 如果您需要进一步的帮助,请告诉我。
  • 我浏览了这个例子。我认为我的用例在这里有所不同。您发布的示例很棒,但如果我创建/使用服务主体帐户,它将起作用。但我正在尝试让普通 AD 用户进入我的应用程序,然后使用他们的 accessToken 建立 SQL Server 连接,假设他们所属的组具有分配的权限。目的是让行级安全性为不同的用户工作。
猜你喜欢
  • 2019-11-23
  • 1970-01-01
  • 2017-10-23
  • 2021-03-02
  • 2022-12-27
  • 2018-09-11
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多