错误地调用CF API登录一次密码

问题描述 投票:1回答:1

我正在使用CF API RESTful服务。尝试使用https://login..../oauth/token网络方法从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.x cloudfoundry predix
1个回答
2
投票

尽管您使用了其他UAA服务器,但是您的代码通常对我有用。

我只需要进行一次更改。您已经翻转了AcceptContent-Type标头。 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安装的一部分,这很可能是正确的,但是如果仍然无法使用,则您可能需要与管理员交谈,并确保将客户端设置为允许此操作。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.