问题描述
我在弄清楚如何认证和授权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中执行相同的步骤,并且可以实现自己的目标。