Как подключиться к службе Message Hub в bluemix через приложение узла, используя службы cfenv и vcap

У меня есть экземпляр службы Message Hub в Bluemix, к которому я пытаюсь подключиться через приложение узла. Я могу подключиться через cfenv, как указано в документации:

var Cfenv = require('cfenv');
var appEnv = Cfenv.getAppEnv();
if(restEndpoint && apiKey) {
  appEnv.services = {
    "messagehub": [
       {
          "label": "messagehub",
          "credentials": {
             "api_key": apiKey,
             "kafka_rest_url": restEndpoint,
          }
       }
    ]
  };
} else {
  console.error('A REST Endpoint and API Key must be provided.');
  process.exit(1);
}

Для этого я даю ключ API и restEndpoint непосредственно в моем приложении узла, которые создаются в учетных данных службы Bluemix.

restEndpoint = "https://kafka-rest-**************"

apiKey = "*******************"

Но я не хочу давать вышеупомянутые детали в самом коде для безопасности. Так что, в любом случае, я могу предотвратить предоставление вышеуказанных учетных данных и вызвать службу? Я узнал, что мы можем использовать cfenv и VCAP_serives для достижения этой цели, но я не знаю, как это сделать. Может ли кто-нибудь помочь мне с некоторыми идеями?

Я сам редактирую свой вопрос здесь, я подключаюсь к службе концентратора сообщений из моего приложения-узла, используя cfenv, но значения жестко закодированы, как показано ниже.

restEndpoint = "https://kafka-rest-***************************"

apiKey = "******************************"


if(restEndpoint && apiKey) {
  appEnv.services = {
    "messagehub": [
       {
          "label": "messagehub",
          "credentials": {
             "api_key": apiKey,
             "kafka_rest_url": restEndpoint,
          }
       }
    ]
  };
} else {
  console.error('A REST Endpoint and API Key must be provided.');
  process.exit(1);
}
var instance = new MessageHub(appEnv.services);

Но теперь после нажатия на bluemix я получил переменные среды (службы VCAP) как

"messagehub": [
  {
     "credentials": {
        "mqlight_lookup_url": "https://mqlight*********",
        "api_key": "**************",
        "kafka_admin_url": "https://kafka-admin-***********",
        "kafka_rest_url": "https://kafka-rest-********",

        "user": "*****",
        "password": "*******"
     },
     "syslog_drain_url": null,
     "label": "messagehub",
     "provider": null,
     "plan": "standard",
     "name": "Message Hub",
     "tags": [
        "ibm_dedicated_public",
        "web_and_app",
        "ibm_created"
     ]
  }

]

Итак, как я могу подключиться к службе концентратора сообщений, используя вышеупомянутые VCAP_services, а не жестко кодировать значения в самом коде.

Благодарю.

1 ответ

Да, вы можете получить учетные данные ваших служб во время выполнения.

При работе в Bluemix с Node.js они хранятся в process.env.VCAP_SERVICES,

Вы также можете напрямую проверить этот объект JSON из пользовательского интерфейса Bluemix. Перейдите на панель инструментов вашего приложения и перейдите в Переменные среды.

Пример кода для разбора VCAP_SERVICES:

var serviceName = 'messagehub';
var opts = {};
if (process.env.VCAP_SERVICES) {
    // Running in Bluemix
    var services = JSON.parse(process.env.VCAP_SERVICES);
    for (var key in services) {
        if (key.lastIndexOf(serviceName, 0) === 0) {
            messageHubService = services[key][0];
            opts.broker = messageHubService.credentials.kafka_brokers_sasl;
            opts.user = messageHubService.credentials.user;
            opts.password = messageHubService.credentials.password;
        }
    }
    if (!opts.hasOwnProperty('broker') || !opts.hasOwnProperty('user') || !opts.hasOwnProperty('password')) {
        throw 'Error - Check your app is bound to a ' + serviceName + ' service';
    }
} else {
    // Running locally
    opts.broker = 'localhost:9093'; 
    opts.user = 'username';
    opts.password = 'password'; 
}

При локальном запуске у вас есть выбор сделать это так, как вы хотите: - Если вы также хотите запускать в Bluemix, настройка локальной переменной среды, имитирующей VCAP_SERVICES, может быть хорошей идеей, поэтому оба могут использовать одну и ту же логику. - Если нет, вы можете просто написать получатель, который получает ваши учетные данные из безопасного места.

cfenv ( https://www.npmjs.com/package/cfenv) позволяет абстрагировать некоторые из них, например, определить, запущен ли он локально или в Bluemix, проанализировать VCAP_SERVICES и т. д. Но если вы запускаете локально, вам все равно нужно дать ему свои значения.

Другие вопросы по тегам