Попытка подключиться к Azure Digital Twins из кода Visual Studio: DefaultAzureCredential();ошибка getToken

# .getToken error

Вопрос:

Я пытаюсь подключиться к экземпляру Azure Digital wins из кода Visual Studio, используя Javascript API для Azure Digital Twins.

Я запустил npm install @azure/identity и npm install @azure/digital-twins-core .

Я могу войти на портал Azure, используя az login терминал Powershell в VS Code. Он находит мою учетную запись и подписку и входит в систему.

az account get-access-token --output json возвращает мой токен.

Вот код, который я пытаюсь запустить. Он должен создать две модели в экземпляре Azure Digital Twins:

     const { DefaultAzureCredential } = require("@azure/identity");
    const { DigitalTwinsClient } = require("@azure/digital-twins-core");
    const { v4 } = require("uuid");
    const { inspect } = require("util");
    
    
    async function main() {
      const modelId = `dtmi:model_${v4()
        .split("-")
        .join("")};1`;
      const componentId = `dtmi:component_${v4()
        .split("-")
        .join("")};1`;
      const digitalTwinId = `digitalTwin-${v4()}`;
    
      const temporaryComponent = {
        "@id": componentId,
        "@type": "Interface",
        "@context": "dtmi:dtdl:context;2",
        displayName: "Component1",
        contents: [
          {
            "@type": "Property",
            name: "ComponentProp1",
            schema: "string"
          }
        ]
      };
    
      const temporaryModel = {
        "@id": modelId,
        "@type": "Interface",
        "@context": "dtmi:dtdl:context;2",
        displayName: "TempModel",
        contents: [
          {
            "@type": "Property",
            name: "Prop1",
            schema: "double"
          },
          {
            "@type": "Component",
            name: "Component1",
            schema: componentId
          }
        ]
      };
    
      const temporaryTwin = {
        $dtId: digitalTwinId,
        $metadata: {
          $model: modelId
        },
        Prop1: 42,
        Component1: {
          $metadata: {},
          ComponentProp1: "value1"
        }
      };
    
      // AZURE_DIGITALTWINS_URL: The URL to your Azure Digital Twins instance
      const url = 'https://ParADIM-ADT-Dev.api.wcus.digitaltwins.azure.net';
      if (url === undefined) {
        throw new Error("Required environment variable AZURE_DIGITALTWINS_URL is not set.");
      }
    
      // DefaultAzureCredential is provided by @azure/identity. It supports
      // different authentication mechanisms and determines the appropriate
      // credential type based of the environment it is executing in. See
      // https://www.npmjs.com/package/@azure/identity for more information on
      // authenticating with DefaultAzureCredential or other implementations of
      // TokenCredential.
      const credential = new DefaultAzureCredential();
      const serviceClient = new DigitalTwinsClient(url, credential);
    
      // Create models
      const newModels = [temporaryComponent, temporaryModel];
      const models = await serviceClient.createModels(newModels);
      //console.log(`Created Models:`);
      //console.log(inspect(models));
      
    }
    
    main().catch((err) => {
      console.log("error code: ", err.code);
      console.log("error message: ", err.message);
      console.log("error stack: ", err.stack);
    });
 

Вот ошибка, которую я получаю:

 C:Program Filesnodejsnode.exe .index.js
error code:  undefined
error message:  Unexpected end of JSON input
error stack:  Error: Unexpected end of JSON input
    at AzureCliCredential.getToken (c:ADTProjectnode_modules@azureidentitydistindex.js:1529:27)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at async DefaultAzureCredential.getToken (c:ADTProjectnode_modules@azureidentitydistindex.js:1358:25)
 

Итак, неожиданное завершение ввода JSON. Эта ошибка исходит из @azureidentitydistindex.js того, что является частью azureidentity пакета, поэтому я не написал код. Код, который я использую, взят из учебника, и JSON соответствует требованиям. Кажется, он выдает ошибку при выполнении getToken функции.

Любая помощь приветствуется! Я наткнулся на стену на этом!

Ответ №1:

Поскольку код, извлеченный из документации, при просмотре полученной трассировки ошибок не удалось извлечь токен из указанных учетных данных, может возникнуть проблема в том, как мы его передаем. Ниже показано, как мы обычно подключаемся в JavaScript:

 const client = new SecretClient(keyVaultUrl, new DefaultAzureCredential());
 

Ниже приведен пример кода для связи с Cosmos и хранилищем:

 import { SecretClient } from '@azure/keyvault-secrets';
import { DefaultAzureCredential } from '@azure/identity';
import { CosmosClient } from '@azure/cosmos';

const keyVaultUrl = process.env('APP_KEY_VAULT_URI');
const credential = new DefaultAzureCredential();
let storageClient;
let cosmosClient;

async function configureClients() {
    const kvClient = new SecretClient(keyVaultUrl, credential);
    const storageUri = await client.getSecret('storageUri');
    const cosmosDbConnectionString = await client.getSecret('cosmosDb');

    cosmosClient = new CosmosClient(cosmosDbConnectonString);
    storageClient = new BlobServiceClient(storageUri, credential);
}
 

Дополнительные сведения о переменных среды, настройке keyvault см. в блоге Azure sdk, чтобы узнать об аутентификации