Использование токенов на предъявителя вместе с azure -sdk-for- js - PullRequest
0 голосов
/ 16 января 2020

Мы создаем сервер nodejs, который аутентифицирует пользователя, используя AAD . Мы получаем JWT accessToken от конечной точки входа Microsoft, когда пользователь входит в наше приложение.

Как мы используем это маркер для звонков для получения больших двоичных объектов / контейнеров с использованием этого javascript API? Я не хочу делать прямые ajax запросы к API с помощью вызовов (Authorization: Bearer accessToken).

Мне удалось использовать почтальон, как этот совершать звонки? Как мне сделать это программно, используя blobServiceClient?

enter image description here

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Согласно моим исследованиям, если мы используем SDK @ azure / storage-blob версии V10, мы можем напрямую использовать Azure AD токен доступа для управления azure службой BLOB-объектов. Потому что SDK предоставляет класс TokenCredential. Мы можем использовать код const tokenCredential = new azure.TokenCredential("token") для инициализации учетных данных, а затем использовать его для получения BLOB-объектов.

, например

const azure = require("@azure/storage-blob"); 

async function getBlobContent(){

    const tokenCredential = new azure.TokenCredential("")
    const pipeline =  azure.StorageURL.newPipeline(tokenCredential)
    const serviceURL = new azure.ServiceURL(`https://jimtestperfdiag516.blob.core.windows.net`, pipeline);
    const containerURL = azure.ContainerURL.fromServiceURL(serviceURL, "test");
    const blockBlobURL = azure.BlockBlobURL.fromContainerURL(containerURL, "test.csv");
    const aborter=azure.Aborter.timeout(30* 60 * 1000)
    const downloadResponse = await blockBlobURL.download(aborter, 0);
    const downloadedContent = await streamToString(downloadResponse.readableStreamBody);
    console.log(`Downloaded blob content: "${downloadedContent}"`);



}

async function streamToString(readableStream) {
    return new Promise((resolve, reject) => {
      const chunks = [];
      readableStream.on("data", data => {
        chunks.push(data.toString());
      });
      readableStream.on("end", () => {
        resolve(chunks.join(""));
      });
      readableStream.on("error", reject);
    });
}

getBlobContent()
  .then(() => {
    console.log("Successfully executed sample.");
  })
  .catch((err) => {
    console.log(err.message);
  });

Для получения более подробной информации см. https://www.npmjs.com/package/@azure / storage -blob / v / 10.5.0 и https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-nodejs-legacy.

Кроме того, обратите внимание, что если вы хотите получить доступ к azure blob с Azure AD, нам нужно назначить роль RABS (владелец данных хранилища BLOB-объектов, хранилище данных BLOB-объектов хранилища или устройство чтения данных BLOB-объектов хранилища) для пользователя или участника службы: https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad

0 голосов
/ 18 апреля 2020

Для v12 Storage JS SDK вы бы реализовали интерфейс TokenCredential из @azure/core-auth

/**
 * Represents a credential capable of providing an authentication token.
 */
export interface TokenCredential {
  /**
   * Gets the token provided by this credential.
   *
   * @param scopes The list of scopes for which the token will have access.
   * @param options The options used to configure any requests this
   *                TokenCredential implementation might make.
   */
  getToken(scopes: string | string[], options?: GetTokenOptions): Promise<AccessToken | null>;
}

Простой пример:

const { ContainerClient } = require("@azure/storage-blob");

const url = "<url to container>";

function TestTokenCredential() {
  return {
    getToken: function (_scope, _opts) {
      return {
        token: "<access token>",
        expiresOnTimestamp: Date.now() + 60 * 60 * 1000,
      };
    },
  };
}

const containerClient = new ContainerClient(url, new TestTokenCredential());

async function main() {
  for await (const blob of containerClient.listBlobsFlat()) {
    console.log(blob.name);
  }
}

main().catch((error) => {
  console.error(error);
});
...