如何对IBM Cloud Function进行身份验证以使用IBM Cloud Foundry API

问题描述

我在弄清楚如何认证和授权IBM Cloud Function使用IBM Cloud Foundry API来管理我的Cloud Foundry应用程序之一上的某些路由时遇到麻烦。

Cloud Foundry API说我需要一个有效的承载令牌,并且可以使用Cloud Foundry UAA server获得令牌。我认为使用OAuth2不适合我的用例,因为我不是代表他人访问任何人的资源。

如何认证和授权我的Cloud Function来访问Cloud Foundry API?

编辑:

我刚发现Generating an IBM Cloud IAM token by using an API key。 IAM令牌与Cloud Foundry API兼容吗?我在此文档中看到https响应将令牌类型描述为Bearer

解决方法

我已经在Node.js中创建了一个示例,该示例基于我之前对这个问题的回答的步骤。

第一个动作期望params.apikey中的有效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中有一个有效的承载令牌,然后针对IBM Cloud CF Public API执行API调用。在此示例中,针对/ v2 / organizations的get请求:

/**
 *
 * main() will be run when you invoke this action
 *
 * @param Cloud Functions actions accept a single parameter,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>

接下来尝试针对IBM Cloud CF Public API的命令:

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

我希望您在命令行中执行了这些步骤之后,就可以在IBM Cloud Function中执行相同的步骤,并且可以实现自己的目标。