<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D1%80%D0%B5%D0%B4%D1%8B</id>
	<title>Данные удалённой среды - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D1%80%D0%B5%D0%B4%D1%8B"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D1%80%D0%B5%D0%B4%D1%8B&amp;action=history"/>
	<updated>2026-10-06T15:52:09Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D1%80%D0%B5%D0%B4%D1%8B&amp;diff=6946&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: « == Данные удалённой среды == С помощью код-плиток (в &#039;&#039;&#039;Дашбордах&#039;&#039;&#039;) и код-разделов (в &#039;&#039;&#039;Блокнотах&#039;&#039;&#039;) можно объединять данные из нескольких сред Ключ-АСТРОМ.  Для загрузки данных из удалённых сред доступны два механизма аутентификации:  * &#039;&#039;&#039;Аутентификация с п...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D1%80%D0%B5%D0%B4%D1%8B&amp;diff=6946&amp;oldid=prev"/>
		<updated>2026-09-28T20:36:41Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: « == Данные удалённой среды == С помощью код-плиток (в &amp;#039;&amp;#039;&amp;#039;Дашбордах&amp;#039;&amp;#039;&amp;#039;) и код-разделов (в &amp;#039;&amp;#039;&amp;#039;Блокнотах&amp;#039;&amp;#039;&amp;#039;) можно объединять данные из нескольких сред Ключ-АСТРОМ.  Для загрузки данных из удалённых сред доступны два механизма аутентификации:  * &amp;#039;&amp;#039;&amp;#039;Аутентификация с п...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
== Данные удалённой среды ==&lt;br /&gt;
С помощью код-плиток (в &amp;#039;&amp;#039;&amp;#039;Дашбордах&amp;#039;&amp;#039;&amp;#039;) и код-разделов (в &amp;#039;&amp;#039;&amp;#039;Блокнотах&amp;#039;&amp;#039;&amp;#039;) можно объединять данные из нескольких сред Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
Для загрузки данных из удалённых сред доступны два механизма аутентификации:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Аутентификация с помощью токена платформы&amp;#039;&amp;#039;&amp;#039;: предназначена для личного использования. Используйте, когда нужно быстро протестировать и оперативно загрузить данные из удалённых сред.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Аутентификация клиента OAuth&amp;#039;&amp;#039;&amp;#039;: предназначена для совместного использования. Используйте, чтобы обеспечить единообразную видимость данных для всех пользователей.&lt;br /&gt;
&lt;br /&gt;
=== Начните с готовой плитки или раздела в Дашбордах или Блокнотах ===&lt;br /&gt;
Можно начать с готовой плитки или раздела при создании дашборда или блокнота, использующего данные из удалённой среды Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
В дашборде или блокноте выберите &amp;#039;&amp;#039;&amp;#039;Добавить&amp;#039;&amp;#039;&amp;#039;. В верхней части меню есть поле поиска.&lt;br /&gt;
&lt;br /&gt;
Прокрутите меню вниз до раздела &amp;#039;&amp;#039;&amp;#039;Библиотека&amp;#039;&amp;#039;&amp;#039; и выберите любую из следующих готовых код-плиток или разделов, чтобы добавить её в дашборд или блокнот:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Загрузка внешних данных&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Данные удалённой среды через токен платформы&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Данные удалённой среды через OAuth&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Адаптируйте пример под свои нужды.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с помощью токена платформы ===&lt;br /&gt;
Загрузка данных из удалённых сред через токен платформы предназначена для личного использования. Этот метод идеален, когда нужно сначала быстро протестировать и оперативно загрузить данные из удалённых сред, прежде чем делиться ими с другими.&lt;br /&gt;
&lt;br /&gt;
Описанный ниже пример кода на &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; использует хранилище учётных данных для безопасного хранения токена и токен платформы для аутентификации, обеспечивая надёжный и безопасный способ загрузки данных из удалённой среды Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
==== Предварительные требования ====&lt;br /&gt;
Прежде чем создавать код для плитки дашборда или раздела блокнота:&lt;br /&gt;
&lt;br /&gt;
* Создайте токен платформы Ключ-АСТРОМ в среде, из которой хотите загружать данные. Подробнее см. &amp;#039;&amp;#039;&amp;#039;Токены платформы&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Создайте запись в хранилище учётных данных Ключ-АСТРОМ в основной среде, чтобы сохранить токен платформы, который позже будет использоваться в код-плитке или разделе для аутентификации. Подробнее см. &amp;#039;&amp;#039;&amp;#039;Хранилище учётных данных&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Разрешите внешние запросы.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Разрешите внешние запросы&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Внешние запросы включают исходящие сетевые подключения из вашей среды Ключ-АСТРОМ к внешним сервисам. Они позволяют управлять доступом к публичным конечным точкам из AppEngine с помощью функций приложений и функций в &amp;#039;&amp;#039;&amp;#039;Дашбордах&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Блокнотах&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;Автоматизациях&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
# Перейдите в &amp;#039;&amp;#039;&amp;#039;Настройки&amp;#039;&amp;#039;&amp;#039; &amp;gt; &amp;#039;&amp;#039;&amp;#039;Общие&amp;#039;&amp;#039;&amp;#039; &amp;gt; &amp;#039;&amp;#039;&amp;#039;Внешние запросы&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Выберите &amp;#039;&amp;#039;&amp;#039;Новый шаблон хоста&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Добавьте доменные имена.&lt;br /&gt;
# Выберите &amp;#039;&amp;#039;&amp;#039;Добавить&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Таким образом можно детально управлять веб-сервисами, к которым могут подключаться ваши функции.&lt;br /&gt;
&lt;br /&gt;
Например, можно добавить &amp;lt;code&amp;gt;myenv8132.apps.astromkey.com&amp;lt;/code&amp;gt;, чтобы разрешить только эту среду, или использовать подстановочный знак, например &amp;lt;code&amp;gt;*.apps.astromkey.com&amp;lt;/code&amp;gt;, чтобы разрешить все ваши среды Ключ-АСТРОМ сразу.&lt;br /&gt;
&lt;br /&gt;
Подробнее о добавлении в список разрешённых см. &amp;#039;&amp;#039;&amp;#039;Разрешение диапазонов IP, которые могут получить доступ к вашей среде&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
==== Код ====&lt;br /&gt;
Прежде чем начать программировать, ознакомьтесь с тем, как используются функции.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;async function()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это основная функция. Она вызывает &amp;lt;code&amp;gt;fetchFromAstromkey&amp;lt;/code&amp;gt; (см. выше) с необходимыми параметрами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;fetchFromAstromkey(credentialId = &amp;quot;&amp;quot;, url = &amp;quot;&amp;quot;, query = &amp;quot;&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы загрузить данные из Ключ-АСТРОМ, эта функция:&lt;br /&gt;
&lt;br /&gt;
* Извлекает учётные данные из записи хранилища учётных данных в основном тенанте на основе заданного &amp;lt;code&amp;gt;credentialId&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Выполняет вызов &amp;#039;&amp;#039;&amp;#039;API&amp;#039;&amp;#039;&amp;#039; на API вторичного/удалённого тенанта на основе учётных данных, а также параметров &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt;, предоставленных основной функцией.&lt;br /&gt;
&lt;br /&gt;
Теперь, когда вы выполнили предварительные требования и ознакомились с функциями, можно приступать к написанию кода.&lt;br /&gt;
&lt;br /&gt;
Основывайте свой код на примере ниже.&lt;br /&gt;
&lt;br /&gt;
Читайте комментарии в примере кода для деталей.&lt;br /&gt;
&lt;br /&gt;
Замените &amp;lt;code&amp;gt;CREDENTIALS_VAULT-XXXXXXXXXXXXXXXX&amp;lt;/code&amp;gt; на свой идентификатор учётных данных.&lt;br /&gt;
&lt;br /&gt;
Замените &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://remote-environment-id.apps.astromkey.com/platform/storage/query/v1/query:execute?enrich:metric-metadata&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; на свой &amp;#039;&amp;#039;&amp;#039;URL&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Настройте запрос &amp;lt;code&amp;gt;&amp;quot;fetch logs | limit 1&amp;quot;&amp;lt;/code&amp;gt; под свои нужды.&lt;br /&gt;
&lt;br /&gt;
Запустите код в код-плитке (&amp;#039;&amp;#039;&amp;#039;Дашборды&amp;#039;&amp;#039;&amp;#039;) или код-разделе (&amp;#039;&amp;#039;&amp;#039;Блокноты&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Если при запуске кода возникнут ошибки, они будут перехвачены и залогированы с префиксами &amp;lt;code&amp;gt;[AstromkeyAuthError]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[CredentialVaultError]&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;[ExecutionError]&amp;lt;/code&amp;gt; для упрощения отладки.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Начните с готовой плитки или раздела&amp;#039;&amp;#039;&amp;#039; Можно начать с готовой плитки или раздела (&amp;#039;&amp;#039;&amp;#039;Данные удалённой среды через токен платформы&amp;#039;&amp;#039;&amp;#039;) при создании дашборда или блокнота, использующего данные из удалённой среды Ключ-АСТРОМ.&amp;lt;pre&amp;gt;import { credentialVaultClient } from &amp;quot;@astromkey-sdk/client-classic-environment-v2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Execute a query against an Astromkey API with token retrieval inlined.&lt;br /&gt;
 * @param {string} credentialId - The ID of the credential vault entry.&lt;br /&gt;
 * @param {string} url - The API endpoint URL.&lt;br /&gt;
 * @param {string} query - The query to execute.&lt;br /&gt;
 * @returns {Promise&amp;lt;any&amp;gt;} - The API response data.&lt;br /&gt;
 * @throws Will throw an error if any step fails.&lt;br /&gt;
 */&lt;br /&gt;
async function fetchFromAstromkey(credentialId, url, query) {&lt;br /&gt;
  if (!credentialId || !url || !query) {&lt;br /&gt;
    throw new Error(&amp;quot;[ValidationError] Missing required parameters: credentialId, url, or query.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  try {&lt;br /&gt;
    // Retrieve the platform token from the credential vault.&lt;br /&gt;
    const { token } = await credentialVaultClient.getCredentialsDetails({&lt;br /&gt;
      id: credentialId,&lt;br /&gt;
    }).catch((error) =&amp;gt; {&lt;br /&gt;
      console.error(`[CredentialVaultError] Failed to retrieve token: ${error.message}`);&lt;br /&gt;
      throw new Error(&amp;quot;Unable to fetch platform token.&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (!token) {&lt;br /&gt;
      throw new Error(&amp;quot;[CredentialVaultError] Token is undefined or empty.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Perform the API request.&lt;br /&gt;
    const response = await fetch(url, {&lt;br /&gt;
      method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
      headers: {&lt;br /&gt;
        &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
        Accept: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
        Authorization: `Bearer ${token}`,&lt;br /&gt;
      },&lt;br /&gt;
      body: JSON.stringify({&lt;br /&gt;
        query,&lt;br /&gt;
        requestTimeoutMilliseconds: 60000,&lt;br /&gt;
        enablePreview: true,&lt;br /&gt;
      }),&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (!response.ok) {&lt;br /&gt;
      throw new Error(`[HTTPError] API call failed with status ${response.status}: ${response.statusText}`);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return await response.json();&lt;br /&gt;
  } catch (error) {&lt;br /&gt;
    console.error(`[FetchError] Query execution failed: ${error.message}`);&lt;br /&gt;
    throw new Error(&amp;quot;Unable to execute query.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Main function to fetch and return results from Astromkey.&lt;br /&gt;
 * @returns {Promise&amp;lt;any&amp;gt;} - The query result.&lt;br /&gt;
 */&lt;br /&gt;
export default async function() {&lt;br /&gt;
  const credentialId = &amp;quot;CREDENTIALS_VAULT-XXXXXXXXXXXXXXXX&amp;quot;; // Replace with your credential vault ID.&lt;br /&gt;
  const url = &amp;quot;https://remote-environment-id.apps.astromkey.com/platform/storage/query/v1/query:execute&amp;quot;; // Replace with API URL.&lt;br /&gt;
  const query = &amp;quot;fetch logs | limit 1&amp;quot;; // Replace with your query.&lt;br /&gt;
&lt;br /&gt;
  try {&lt;br /&gt;
    const { result } = await fetchFromAstromkey(credentialId, url, query);&lt;br /&gt;
    return result;&lt;br /&gt;
  } catch (error) {&lt;br /&gt;
    console.error(`[MainFunctionError] ${error.message}`);&lt;br /&gt;
    return null; // Or handle as needed.&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация клиента OAuth ===&lt;br /&gt;
Загрузка данных из удалённых сред через OAuth предназначена для совместного использования. Этот метод обеспечивает единообразную видимость данных для всех пользователей.&lt;br /&gt;
&lt;br /&gt;
Описанный ниже пример кода на &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; использует хранилище учётных данных для безопасного хранения токена и OAuth для аутентификации, обеспечивая надёжный и безопасный способ загрузки данных из удалённой среды Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
==== Предварительные требования ====&lt;br /&gt;
Прежде чем создавать код для плитки дашборда или раздела блокнота:&lt;br /&gt;
&lt;br /&gt;
* Создайте клиент OAuth. Подробнее см. &amp;#039;&amp;#039;&amp;#039;Клиенты OAuth&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Создайте запись в хранилище учётных данных Ключ-АСТРОМ в основной среде, чтобы сохранить токен OAuth, который позже будет использоваться в код-плитке или разделе для аутентификации. Подробнее см. &amp;#039;&amp;#039;&amp;#039;Хранилище учётных данных&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Разрешите внешние запросы.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Разрешите внешние запросы&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Внешние запросы включают исходящие сетевые подключения из вашей среды Ключ-АСТРОМ к внешним сервисам. Они позволяют управлять доступом к публичным конечным точкам из AppEngine с помощью функций приложений и функций в &amp;#039;&amp;#039;&amp;#039;Дашбордах&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Блокнотах&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;Автоматизациях&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
# Перейдите в &amp;#039;&amp;#039;&amp;#039;Настройки&amp;#039;&amp;#039;&amp;#039; &amp;gt; &amp;#039;&amp;#039;&amp;#039;Общие&amp;#039;&amp;#039;&amp;#039; &amp;gt; &amp;#039;&amp;#039;&amp;#039;Внешние запросы&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Выберите &amp;#039;&amp;#039;&amp;#039;Новый шаблон хоста&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Добавьте доменные имена.&lt;br /&gt;
# Выберите &amp;#039;&amp;#039;&amp;#039;Добавить&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Таким образом можно детально управлять веб-сервисами, к которым могут подключаться ваши функции.&lt;br /&gt;
&lt;br /&gt;
Например, можно добавить &amp;lt;code&amp;gt;myenv8132.apps.astromkey.com&amp;lt;/code&amp;gt;, чтобы разрешить только эту среду, или использовать подстановочный знак, например &amp;lt;code&amp;gt;*.apps.astromkey.com&amp;lt;/code&amp;gt;, чтобы разрешить все ваши среды Ключ-АСТРОМ сразу.&lt;br /&gt;
&lt;br /&gt;
Подробнее о добавлении в список разрешённых см. &amp;#039;&amp;#039;&amp;#039;Разрешение диапазонов IP, которые могут получить доступ к вашей среде&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
==== Код ====&lt;br /&gt;
Прежде чем начать программировать, ознакомьтесь с тем, как используются функции.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;async function()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это основная функция. Она вызывает &amp;lt;code&amp;gt;fetchFromAstromkey&amp;lt;/code&amp;gt; (см. выше) с необходимыми параметрами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;fetchFromAstromkey(credentialId = &amp;quot;&amp;quot;, url = &amp;quot;&amp;quot;, query = &amp;quot;&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы загрузить данные из Ключ-АСТРОМ, эта функция:&lt;br /&gt;
&lt;br /&gt;
* Извлекает учётные данные из записи хранилища учётных данных в основном тенанте на основе заданного &amp;lt;code&amp;gt;credentialId&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Получает токен доступа для вторичного тенанта через &amp;#039;&amp;#039;&amp;#039;SSO&amp;#039;&amp;#039;&amp;#039;, вызывая функцию &amp;lt;code&amp;gt;authenticateToAstromkey&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Выполняет вызов &amp;#039;&amp;#039;&amp;#039;API&amp;#039;&amp;#039;&amp;#039; на API вторичного/удалённого тенанта на основе ранее полученного значения &amp;lt;code&amp;gt;accessToken&amp;lt;/code&amp;gt;, а также параметров &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt;, предоставленных основной функцией.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;authenticateToAstromkey(clientId = &amp;#039;&amp;#039;, clientSecret = &amp;#039;&amp;#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для аутентификации через &amp;#039;&amp;#039;&amp;#039;SSO&amp;#039;&amp;#039;&amp;#039; эта функция:&lt;br /&gt;
&lt;br /&gt;
* Принимает два параметра: &amp;lt;code&amp;gt;clientId&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;clientSecret&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Запрашивает токен доступа на основе исходных параметров функции и набора областей действия, определённых внутри функции.&lt;br /&gt;
* В случае успеха возвращает полученный токен доступа из конечной точки &amp;#039;&amp;#039;&amp;#039;SSO&amp;#039;&amp;#039;&amp;#039; Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
Теперь, когда вы выполнили предварительные требования и ознакомились с функциями, можно приступать к написанию кода.&lt;br /&gt;
&lt;br /&gt;
Основывайте свой код на примере ниже.&lt;br /&gt;
&lt;br /&gt;
Читайте комментарии в примере кода для деталей.&lt;br /&gt;
&lt;br /&gt;
Замените &amp;lt;code&amp;gt;CREDENTIALS_VAULT-XXXXXXXXXXXXXXXX&amp;lt;/code&amp;gt; на свой идентификатор учётных данных.&lt;br /&gt;
&lt;br /&gt;
Замените &amp;lt;code&amp;gt;https://remote-environment-id.apps.astromkey.com/platform/storage/query/v1/query:execute?enrich:metric-metadata&amp;lt;/code&amp;gt; на свой &amp;#039;&amp;#039;&amp;#039;URL&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Настройте запрос &amp;lt;code&amp;gt;&amp;quot;fetch logs | limit 1&amp;quot;&amp;lt;/code&amp;gt; под свои нужды.&lt;br /&gt;
&lt;br /&gt;
Запустите код в код-плитке (&amp;#039;&amp;#039;&amp;#039;Дашборды&amp;#039;&amp;#039;&amp;#039;) или код-разделе (&amp;#039;&amp;#039;&amp;#039;Блокноты&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Если при запуске кода возникнут ошибки, они будут перехвачены и залогированы с префиксами &amp;lt;code&amp;gt;[AstromkeyAuthError]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[CredentialVaultError]&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;[ExecutionError]&amp;lt;/code&amp;gt; для упрощения отладки.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Начните с готовой плитки или раздела&amp;#039;&amp;#039;&amp;#039; Можно начать с готовой плитки или раздела (&amp;#039;&amp;#039;&amp;#039;Данные удалённой среды через OAuth&amp;#039;&amp;#039;&amp;#039;) при создании дашборда или блокнота, использующего данные из удалённой среды Ключ-АСТРОМ.&amp;lt;pre&amp;gt;import { credentialVaultClient } from &amp;quot;@astromkey-sdk/client-classic-environment-v2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Authenticate to Astromkey SSO using client credentials.&lt;br /&gt;
 * @param {string} clientId - The client ID for authentication.&lt;br /&gt;
 * @param {string} clientSecret - The client secret for authentication.&lt;br /&gt;
 * @returns {Promise&amp;lt;string&amp;gt;} - The access token.&lt;br /&gt;
 * @throws Will throw an error if authentication fails.&lt;br /&gt;
 */&lt;br /&gt;
async function authenticateToAstromkey(clientId, clientSecret) {&lt;br /&gt;
  if (!clientId || !clientSecret) {&lt;br /&gt;
    throw new Error(&amp;quot;[ValidationError] Missing clientId or clientSecret for SSO authentication.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const scopes = [&lt;br /&gt;
    &amp;quot;environment-api&amp;quot;,&lt;br /&gt;
    &amp;quot;storage:buckets:read&amp;quot;,&lt;br /&gt;
    &amp;quot;storage:bizevents:read&amp;quot;,&lt;br /&gt;
    &amp;quot;storage:logs:read&amp;quot;,&lt;br /&gt;
    &amp;quot;storage:metrics:read&amp;quot;,&lt;br /&gt;
    &amp;quot;storage:entities:read&amp;quot;,&lt;br /&gt;
  ].join(&amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  try {&lt;br /&gt;
    const response = await fetch(&amp;quot;https://sso.astromkey.com/sso/oauth2/token&amp;quot;, {&lt;br /&gt;
      method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
      headers: { &amp;quot;Content-Type&amp;quot;: &amp;quot;application/x-www-form-urlencoded&amp;quot; },&lt;br /&gt;
      body: `grant_type=client_credentials&amp;amp;client_id=${clientId}&amp;amp;client_secret=${clientSecret}&amp;amp;scopes=${scopes}`,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (!response.ok) {&lt;br /&gt;
      throw new Error(`[HTTPError] SSO authentication failed with status ${response.status}: ${response.statusText}`);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const { access_token: accessToken } = await response.json();&lt;br /&gt;
    if (!accessToken) {&lt;br /&gt;
      throw new Error(&amp;quot;[SSOError] Access token not received.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return accessToken;&lt;br /&gt;
  } catch (error) {&lt;br /&gt;
    console.error(`[AstromkeyAuthError] ${error.message}`);&lt;br /&gt;
    throw error;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Fetch data from Astromkey using a query.&lt;br /&gt;
 * @param {string} credentialId - The credential vault ID.&lt;br /&gt;
 * @param {string} url - The API endpoint URL.&lt;br /&gt;
 * @param {string} query - The query to execute.&lt;br /&gt;
 * @returns {Promise&amp;lt;any&amp;gt;} - The API response data.&lt;br /&gt;
 * @throws Will throw an error if any step fails.&lt;br /&gt;
 */&lt;br /&gt;
async function fetchFromAstromkey(credentialId, url, query) {&lt;br /&gt;
  if (!credentialId || !url || !query) {&lt;br /&gt;
    throw new Error(&amp;quot;[ValidationError] Missing one or more required parameters: credentialId, url, or query.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  try {&lt;br /&gt;
    // Retrieve credentials from the credential vault.&lt;br /&gt;
    const { username: clientId, password: clientSecret } = await credentialVaultClient.getCredentialsDetails({&lt;br /&gt;
      id: credentialId,&lt;br /&gt;
    }).catch(error =&amp;gt; {&lt;br /&gt;
      console.error(`[CredentialVaultError] Failed to retrieve credentials: ${error.message}`);&lt;br /&gt;
      throw new Error(&amp;quot;Unable to fetch credentials from the vault.&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (!clientId || !clientSecret) {&lt;br /&gt;
      throw new Error(&amp;quot;[CredentialVaultError] Missing clientId or clientSecret from the retrieved credentials.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Authenticate and get an access token.&lt;br /&gt;
    const accessToken = await authenticateToAstromkey(clientId, clientSecret);&lt;br /&gt;
&lt;br /&gt;
    // Perform the API request.&lt;br /&gt;
    const response = await fetch(url, {&lt;br /&gt;
      method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
      headers: {&lt;br /&gt;
        &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
        Accept: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
        Authorization: `Bearer ${accessToken}`,&lt;br /&gt;
      },&lt;br /&gt;
      body: JSON.stringify({&lt;br /&gt;
        query,&lt;br /&gt;
        requestTimeoutMilliseconds: 60000,&lt;br /&gt;
        enablePreview: true,&lt;br /&gt;
      }),&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (!response.ok) {&lt;br /&gt;
      throw new Error(`[HTTPError] API call failed with status ${response.status}: ${response.statusText}`);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return await response.json();&lt;br /&gt;
  } catch (error) {&lt;br /&gt;
    console.error(`[FetchError] ${error.message}`);&lt;br /&gt;
    throw error;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Main function to execute a query and return results from Astromkey.&lt;br /&gt;
 * @returns {Promise&amp;lt;any&amp;gt;} - The query result.&lt;br /&gt;
 */&lt;br /&gt;
export default async function fetchAstromkeyData() {&lt;br /&gt;
  const credentialId = &amp;quot;CREDENTIALS_VAULT-XXXXXXXXXXXXXXXX&amp;quot;; // Replace with your credential vault ID.&lt;br /&gt;
  const url = &amp;quot;https://remote-environment-id.apps.astromkey.com/platform/storage/query/v1/query:execute&amp;quot;; // Replace with API URL.&lt;br /&gt;
  const query = &amp;quot;fetch logs | limit 1&amp;quot;; // Replace with your query.&lt;br /&gt;
&lt;br /&gt;
  try {&lt;br /&gt;
    const { result } = await fetchFromAstromkey(credentialId, url, query);&lt;br /&gt;
    return result;&lt;br /&gt;
  } catch (error) {&lt;br /&gt;
    console.error(`[MainFunctionError] ${error.message}`);&lt;br /&gt;
    return null; // Return null or handle gracefully.&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>