首页 > 解决方案 > 调用 CF API 登录一次性密码时出错

问题描述

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

我已经验证标题和正文内容是正确的,但调用 api 总是返回 400 错误代码,消息缺少授权类型。

我已经在 Objective-C、Swift 和现在的 Python 中实现了这个调用。所有测试都返回相同的结果。这是我在 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)

每次运行此程序时,我都会收到响应错误无效请求,缺少授权类型

任何帮助将不胜感激。

标签: python-3.xcloud-foundrypredix

解决方案


尽管我使用了不同的 UAA 服务器,但您的代码大部分对我有用。

我只需要进行一项更改。你有AcceptContent-Type标题翻转。Accept应该是application/json因为那是您想要返回的格式,并且Content-Type应该是application/x-www-form-urlencoded因为那是您要发送的格式。

请参阅API 文档以供参考

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 安装的一部分,这可能是正确的,但如果它仍然不适合您,那么您可能需要与管理员交谈并确保客户端已设置为允许这样做。


推荐阅读