调用 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 服务器,但您的代码大部分对我有用。
我只需要做一个改变。你让 Accept
和 Content-Type
headers 颠倒了。 Accept
应该是 application/json
因为那是你想要返回的格式,而 Content-Type
应该是 application/x-www-form-urlencoded
因为那是你发送的格式。
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))
我做了一些其他的小改动,但它们应该会影响功能。
- 使用
getpass.getpass()
加载密码。
- 将目标服务器设置为变量。
- 漂亮地打印 JSON 响应。
唯一需要注意的是,您使用的 OAuth2 客户端必须被允许使用密码授予类型。看起来您使用的客户端与 cf cli 使用的客户端相同,因此如果您的 UAA 服务器是标准 Cloud Foundry 安装的一部分,这可能是正确的,但如果它仍然不适合您,那么您可能需要与管理员交谈并确保客户端设置为允许此操作。
我正在使用 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 服务器,但您的代码大部分对我有用。
我只需要做一个改变。你让 Accept
和 Content-Type
headers 颠倒了。 Accept
应该是 application/json
因为那是你想要返回的格式,而 Content-Type
应该是 application/x-www-form-urlencoded
因为那是你发送的格式。
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))
我做了一些其他的小改动,但它们应该会影响功能。
- 使用
getpass.getpass()
加载密码。 - 将目标服务器设置为变量。
- 漂亮地打印 JSON 响应。
唯一需要注意的是,您使用的 OAuth2 客户端必须被允许使用密码授予类型。看起来您使用的客户端与 cf cli 使用的客户端相同,因此如果您的 UAA 服务器是标准 Cloud Foundry 安装的一部分,这可能是正确的,但如果它仍然不适合您,那么您可能需要与管理员交谈并确保客户端设置为允许此操作。