1

我无法弄清楚如何验证和授权 IBM Cloud Function 以使用 IBM Cloud Foundry API 来管理我的一个 Cloud Foundry 应用程序上的一些路由。

Cloud Foundry API说我需要一个有效的不记名令牌,并且我可以使用 Cloud Foundry UAA 服务器获取一个令牌。我认为使用 OAuth2 不适合我的用例,因为我没有代表他们访问任何其他人的资源。

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

编辑:

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

4

2 回答 2

2

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

第一个操作需要一个有效的 apikeyparams.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 的获取请求:

/**
 *
 * 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
      };
    })
}

现在您可以将这两个动作放入一个序列中,以便第一个动作的输出(不记名令牌)用作第二个动作中的令牌。

于 2020-10-03T15:33:22.470 回答
1

我现在不能完全指导你,但我希望我能提供的信息能引导你走向正确的方向。

首先,您需要确定授权端点:

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

有了它和您帐户的有效 IAM API 令牌,您可以获得将针对 IBM Cloud CF 公共 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 中执行相同的步骤,并且您将实现您的目标。

于 2020-10-02T15:22:41.530 回答