尝试使用请求库获取访问令牌(对于 Cloudhub.io)时收到身份验证被拒绝作为响应

Received Authentication Denied as Response while trying to get the access token (for Cloudhub.io) with requests library

我想从位于 Mulesoft 上的 Cloudhub API 获取数据。

我尝试通过 postman 访问(使用相同的客户端凭据 - Bearer 授权)并且它工作正常(我可以通过适当的 get 请求获得结果)。

但是当我 尝试对 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)

Result: {'error': 'Authentication denied.'}

我只需要知道 它如何与 Postman 一起正常工作,但为什么我无法连接 python 代码?

我的代码中是否有任何需要更改的内容或此请求所需的任何其他信息?或者我在接收 Cloudhub API 的访问令牌时是否传递了正确的端点

请 post 您的建议或我需要参考的任何文档。 希望我提供的信息清楚,在此先感谢!!

URL 不正确。要调用 CloudHub REST API,您需要 obtain a bearer token from Anypoint Platform REST API. The URL mentioned looks to for some application deployed in CloudHub, not from the platform APIs. This is the same method than to get the bearer token to use in Anypoint MQ Admin API。您似乎正在尝试使用 Anypoint MQ Broker API,它是 Anypoint MQ 特定的令牌。

在 Curl 中获取 Anypoint 平台令牌的示例:

$ 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 请求是不同的,或者它只适用于 Anypoint MQ Broker API。

我找到了我自己问题的答案。 I can get it from the postman itself.

这是我的 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"))