调用 CF 时出错 API 登录一次密码

Error calling CF API login one time passcode

我正在使用 CF API RESTful 服务。尝试使用 https://login..../oauth/token 网络方法从 Cloud Foundry 的 UAA API 获取访问令牌。

我已经验证 headers & body 内容是正确的,但是调用 api 总是 return 一个 400 错误代码,消息缺少授权类型。

我已经在 Objective-C、Swift 和现在 Python 中实现了这个调用。所有测试 return 结果相同。这是我在 Python:

中的代码示例
import json
import requests
import urllib

params = {"grant_type": "password",
          "passcode": "xxx"
          }
url = "https://login.system.aws-usw02-pr.ice.predix.io/oauth/token"
headers = {"Authorization": "Basic Y2Y6", "Content-Type": "application/json", "Accept": "application/x-www-form-urlencoded"}

encodeParams = urllib.parse.urlencode(params)
response = requests.post(url, headers=headers, data=encodeParams)
rjson = response.json()
print(rjson)

每次我运行这个,我都会得到回应 错误无效请求,缺少授权类型

如有任何帮助,我们将不胜感激。

虽然我使用的是不同的 UAA 服务器,但您的代码大部分对我有用。

我只需要做一个改变。你让 AcceptContent-Type headers 颠倒了。 Accept 应该是 application/json 因为那是你想要返回的格式,而 Content-Type 应该是 application/x-www-form-urlencoded 因为那是你发送的格式。

参见API Docs for reference

import json
import requests
import urllib
import getpass

UAA_SERVER = "https://login.run.pivotal.io"

print("go to {}/passcode".format(UAA_SERVER))

params = {
    "grant_type": "password",
    "passcode": getpass.getpass(),
}

url = "https://login.run.pivotal.io/oauth/token"
headers = {
    "Authorization": "Basic Y2Y6",
    "Content-Type": "application/x-www-form-urlencoded",
    "Accept": "application/json"
}

encodeParams = urllib.parse.urlencode(params)
response = requests.post(url, headers=headers, data=encodeParams)
rjson = response.json()
print(json.dumps(rjson, indent=4, sort_keys=True))

我做了一些其他的小改动,但它们应该会影响功能。

  1. 使用getpass.getpass()加载密码。
  2. 将目标服务器设置为变量。
  3. 漂亮地打印 JSON 响应。

唯一需要注意的是,您使用的 OAuth2 客户端必须被允许使用密码授予类型。看起来您使用的客户端与 cf cli 使用的客户端相同,因此如果您的 UAA 服务器是标准 Cloud Foundry 安装的一部分,这可能是正确的,但如果它仍然不适合您,那么您可能需要与管理员交谈并确保客户端设置为允许此操作。