как аутентифицировать 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 и достигнете своей цели.