我按照here指令创建托管服务标识。所以现在在我的环境变量中,我有MSI_ENDPOINT和MSI_SECRET。
在我的typescript(node.js)项目中,我导入了以下项目:
import {KeyVaultCredentials, KeyVaultClient} from "azure-keyvault";
import {AuthenticationContext, ErrorResponse, TokenResponse} from "adal-node";
如果我没有使用MSI,我可以使用以下代码访问我的密钥保险库:
let keyVaultCredentials = new KeyVaultCredentials(KeyVault.createAuthenticator(this.clientID, this.clientKey));
let keyVaultClient = new KeyVaultClient(keyVaultCredentials);
private static createAuthenticator(clientID: string, clientKey: string){
return (challenge, callback) => {
let context = new AuthenticationContext(challenge.authorization);
return context.acquireTokenWithClientCredentials(
challenge.resource,
clientID,
clientKey,
function (err, tokenResponse:TokenResponse | ErrorResponse) {
if (err) {
CLogger.log("error", "Error occurred while acquiring token with key vault credentials: " + JSON.stringify(err));
throw new Error("Error occurred while acquiring token with key vault credentials. Check log files");
}
if(<TokenResponse>tokenResponse){
let authorizationValue = (<TokenResponse>tokenResponse).tokenType + " " + (<TokenResponse>tokenResponse).accessToken;
return callback(null, authorizationValue);
}
});
}
}
我不知道如何在启用MSI的情况下获取访问令牌,请帮忙。
答案 0 :(得分:3)
如果您使用的是WebApp并从MSI端点获取令牌,则使用ms-rest-azure中的loginWithAppServiceMSI()方法将自动检测。然后,代码就是:
import sys,os
fname = os.getcwd()+ '/simple.html'
url = QUrl.fromLocalFile(fname)
我建议您查看完整的文档here
答案 1 :(得分:1)
使用适用于js的新Azure SDK,您可以通过从包@ azure / identity中实现类DefaultAzureCredential来使用托管服务对应用程序进行身份验证。
const {DefaultAzureCredential} = require('@azure/identity');
const {SecretClient} = require('@azure/keyvault-secrets');
const credential = new DefaultAzureCredential();
const vaultName = "<key-vault-name>";
const url = `https://${vaultName}.vault.azure.net`;
const client = new SecretClient(url, credential);
client.setSecret(secretName, "MySecretValue");
........
它支持服务主体和托管身份验证。
要在本地环境上运行它,必须设置三个环境变量:AZURE_TENANT_ID,AZURE_CLIENT_ID和AZURE_CLIENT_SECRET以能够与服务主体连接。
在Azure上,如果未定义这些变量,它将尝试使用托管身份进行身份验证。
有一个快速入门指南here。