我无法让我的 NodeJS 应用程序使用服务主体连接到 Azure SQL 数据库。但是,当我尝试用 C# 代码段做同样的事情时,它工作得很好。我注意到两种语言的身份验证返回的令牌有点不同,如果我从 C# 中获取正确的令牌并将其硬编码到 NodeJS 中,我的 SQL 连接现在成功了。
我首先使用 ms-rest-azure 执行身份验证,并提供我的 clientId、tenantId 和 clientSecret。这将返回一个有效的凭证,我从中提取 accessToken。
然后,我使用繁琐的方法尝试连接到 *.database.windows.net 上的 Azure SQL 并在配置中提供 accessToken 值。
我只是让用户“<token-identified principal>”登录失败
我在 ms-rest-azure 登录中做错了什么给我一个被 Azure SQL 拒绝的令牌?我看到的一件事是工作令牌的受众是database.windows.net,其中来自 ms-rest-azure 的是management.core.windows.net。
我已经被困了几天,如果有人在这里有任何线索,那就太棒了。ms-rest-azure 上的文档似乎不存在,只是为您提供了 Azure 销售页面的解决方法。
const msRestAzure = require('ms-rest-azure');
const { reject } = require('async');
let clientSecret = "xxx";
let serverName = "xxx.database.windows.net";
let databaseName = "xxx";
let clientId = "xxx";
let tenantId = "xxx";
azureCredentials = msRestAzure.loginWithServicePrincipalSecret(clientId, clientSecret, tenantId, function(err, credentials) {
if (err) return console.log(err);
credentials.getToken((err, results) => {
if(err) return reject(err);
let accessToken = results.accessToken;
var Connection = require('tedious').Connection;
var Request = require('tedious').Request;
var config = {
server: serverName,
authentication: {
type: 'azure-active-directory-access-token',
options: {
token: accessToken
}
}
,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.on('debug', function(text) {
console.log(text);
}
);
function executeStatement() {
request = new Request("select * from Text", 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);
}
});
})