Получен отказ в аутентификации как ответ при попытке получить токен доступа (для Cloudhub.io) с библиотекой запросов

Я пытаюсь получить данные из API Cloudhub, который находится в Mulesoft.

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

Но когда я попытался сделать то же самое с библиотекой Python requests, у меня возникли проблемы. Вот мой фрагмент кода:

import requests
import json, os
CLIENT_ID = os.environ['CLIENT_ID']
CLIENT_SECRET = os.environ['CLIENT_SECRET']
grant_type = 'client_credentials'
body_params = {'grant_type' : grant_type}
headers = {'Accept': '*/*',
           'Cache-Control':'no-cache',
           'Accept-Encoding': 'gzip, deflate',
           'Content-Type':'application/json, application/x-www-form-urlencoded',
           'Connection': 'keep-alive'}
url='https://<domain-name>-api.us-w2.cloudhub.io/api/token'
response = requests.post(url, data=body_params, auth = (CLIENT_ID, CLIENT_SECRET), headers= headers)
token_raw = json.loads(response.text)
print(token_raw)

Результат: {'ошибка': 'Аутентификация отклонена.'}

Все, что мне нужно знать, это то, как это работает с Postman, но почему я не могу подключиться к коду Python?

Есть ли что-то, что я должен изменить в своем коде или какая-либо дополнительная информация, необходимая для этого запроса? или я передаю правильную конечную точку при получении токена доступа для Cloudhub API?

Пожалуйста, опубликуйте свои предложения или любую документацию, на которую мне нужно сослаться. Надеюсь, что информация, которую я дал, понятна и заранее спасибо!


person Parvathirajan Natarajan    schedule 25.12.2019    source источник
comment
Вы пытаетесь получить токен из своего приложения, развернутого в CloudHub, или токен платформы Anypoint для использования с REST API CloudHub? Ваш пример, похоже, подразумевает первое, но в вашем комментарии упоминается API CloudHub. Просьба уточнить. Также прикрепите пример Postman, но не в виде снимка экрана, который обычно бесполезен, а с использованием функции «Код» для создания эквивалента Python. Вы уверены, что учетные данные в порядке?   -  person aled    schedule 26.12.2019


Ответы (2)


Я нашел ответ на свой вопрос. Я могу получить его у самого почтальона.

Вот мой код для вызова API с Python.

import http.client
import os
conn = http.client.HTTPSConnection("<domain-name>-api.us-w2.cloudhub.io")
payload = ''
headers = {
  'client_id': os.environ['CLIENT_ID'],
  'client_secret': os.environ['CLIENT_SECRET']
}
conn.request("GET", "/api/<Query that you want to pass - endpoint>", payload, headers)
response = conn.getresponse()
resp_data = response.read()
print(resp_data.decode("utf-8"))
person Parvathirajan Natarajan    schedule 26.12.2019
comment
Обратите внимание, что это не токен платформы Anypoint для использования с CloudHub API. Это запрос к некоторому приложению, развернутому в CloudHub с использованием идентификатора клиента и секрета. Заголовок Authentication следует игнорировать, так как он не имеет значения токена после строки Bearer. Токена нет вообще. - person aled; 27.12.2019
comment
Проголосовал! спасибо за обновление и вклад, будет работать, как вы упомянули. - person Parvathirajan Natarajan; 27.12.2019

Неверный URL-адрес. Чтобы вызвать CloudHub REST API, вам необходимо получить токен носителя из REST API Anypoint Platform. Упомянутый URL-адрес указывает на какое-то приложение, развернутое в CloudHub, а не на платформе API. Это тот же метод, что и для получения токена-носителя для использования в Anypoint MQ Admin API. Похоже, вы пытаетесь использовать API Anypoint MQ Broker, который является специальным токеном Anypoint MQ.

Пример в Curl для получения токена Anypoint Platform:

$ curl -H "Content-Type: application/json" -X POST -d '{"username":"joe.blogs","password":"sample.password"}' https://anypoint.mulesoft.com/accounts/login
{
"access_token": "f648eea2-3704-4560-bb46-bfff79712652",
"token_type": "bearer",
"redirectUrl": "/home/"
}

Кроме того, Content-type вашего примера кажется неверным, потому что он имеет 2 значения.

Я уверен, что запрос Postman отличается для его работы, или, может быть, он работает только для API Anypoint MQ Broker.

person aled    schedule 26.12.2019
comment
Я тоже пробовал, но это не сработало! Даже я сослался на то же самое. - person Parvathirajan Natarajan; 27.12.2019