как аутентифицировать IBM Cloud Function для использования IBM Cloud Foundry API

Мне сложно понять, как я могу аутентифицировать и авторизовать IBM Cloud Function для использования IBM Cloud Foundry API для управления некоторыми маршрутами в одном из моих приложений Cloud Foundry.

Cloud Foundry API говорит, что нужно действительный маркер носителя, и что я могу получить маркер с помощью сервера Cloud Foundry UAA. Я не думаю, что использование OAuth2 подходит для моего варианта использования, потому что я не получаю доступ к чужим ресурсам от их имени.

Как я могу аутентифицировать и авторизовать свою облачную функцию для доступа к Cloud Foundry API?

РЕДАКТИРОВАТЬ:

Я только что обнаружил создание токена IBM Cloud IAM с помощью ключа API. Совместим ли токен IAM с Cloud Foundry API? Я вижу в этом документе, что ответ https описывает тип токена как Bearer.

2 ответа

Я создал пример в Node.js, основанный на шагах из моего предыдущего ответа на этот вопрос.

Первое действие ожидает действительного апикея в params.apikey в качестве входного параметра и возвращает токен на предъявителя:

         /**
 *
 * main() will be run when you invoke this action
 *
 * @param Cloud Functions actions accept a single parameter, which must be a JSON object.
 *
 * @return The output of this action, which must be a JSON object.
 *
 */


function main(params) {

  const axios = require('axios');
  const querystring = require('querystring');

  return axios.post('https://iam.cloud.ibm.com/cloudfoundry/login/us-south/oauth/token',
      querystring.stringify({
        grant_type: "password",
        username: "apikey",
        password: params.apikey
      }), {
        auth: {
          username: 'cf'
        }
      })
    .then(res => {
      console.log(`statusCode: ${res.status}`);
      console.log(res.data);

      return {
        token: res.data.access_token
      };
    })
    .catch(error => {
      console.error(error);
      return {
        error: err.message
      };
    })
}

Второе действие ожидает действительный токен на предъявителя в params.tokenа затем выполняет вызов API к общедоступному API IBM Cloud CF. В этом примере запрос на получение от /v2/organization:

         /**
 *
 * main() will be run when you invoke this action
 *
 * @param Cloud Functions actions accept a single parameter, which must be a JSON object.
 *
 * @return The output of this action, which must be a JSON object.
 *
 */


function main(params) {

  const axios = require('axios');
  axios.defaults.headers.common['Authorization'] = "bearer " + params.token;
  const querystring = require('querystring');

  return axios.get('https://api.us-south.cf.cloud.ibm.com/v2/organizations')
    .then(res => {
      console.log(`statusCode: ${res.status}`);
      console.log(res.data);

      return {
        organizations: res.data.resources
      };
    })
    .catch(error => {
      console.error(error);
      return {
        error: error.message
      };
    })
}

Теперь вы можете поместить оба действия в последовательность, чтобы результат первого действия (токен-носитель) использовался как токен во втором действии.

Я не могу направить вас полностью прямо сейчас, но надеюсь, что информация, которую я могу предоставить, направит вас в правильном направлении.

Сначала вам нужно определить конечную точку авторизации:

curl http://api.us-south.cf.cloud.ibm.com/info

С этим и действующим токеном IAM API для вашей учетной записи вы можете получить токен на предъявителя, который будет работать с IBM Cloud CF Public API:

curl -v -X POST "https://iam.cloud.ibm.com/cloudfoundry/login/us-south/oauth/token" -d "grant_type=password&scope=&username=apikey&password=<yourApiKey>" --user "cf:"

Обратите внимание, что вам нужно добавить /oauth/token к конечной точке авторизации, полученной на шаге 1.

Ответ содержит нужный токен доступа. В этом примере просто поместите его в переменную окружения:

export TOKEN=<yourAccessToken>

Затем попробуйте выполнить команду для публичного API IBM Cloud CF:

curl "https://api.us-south.cf.cloud.ibm.com/v2/organizations" -X GET -H "Authorization: bearer $TOKEN"

Я надеюсь, что, выполнив эти шаги в командной строке, вы сможете выполнить те же действия в своей IBM Cloud Function и достигнете своей цели.

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