python-3.x - 调用 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)
每次运行此程序时,我都会收到响应错误无效请求,缺少授权类型
任何帮助将不胜感激。
解决方案
尽管我使用了不同的 UAA 服务器,但您的代码大部分对我有用。
我只需要进行一项更改。你有Accept
和Content-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))
我做了一些其他的小改动,但它们应该会影响功能。
- 用于
getpass.getpass()
加载密码。 - 将目标服务器设置为变量。
- 漂亮地打印 JSON 响应。
唯一需要注意的是,必须允许您使用的 OAuth2 客户端使用密码授权类型。看起来您使用的客户端与 cf cli 使用的客户端相同,因此如果您的 UAA 服务器是标准 Cloud Foundry 安装的一部分,这可能是正确的,但如果它仍然不适合您,那么您可能需要与管理员交谈并确保客户端已设置为允许这样做。
推荐阅读
- sql - SQL - exclude refunded transactions on new line
- powershell - Oracle 管理单元或模块的可用性
- c# - 我可以在 CASE 中使用 ENUM 而不是带有 Enum 的 switch 语句吗?
- python - 用于决定操作的数据框中的时间戳分析
- xslt - XSL 将特定值排序到最后
- list - Scheme/Racket:将一个列表分成两个元素列表的函数,这些元素匹配某个谓词和不匹配它的元素
- java - 如果我在 URL 中传递动态变量,则 Css 不会应用于我的 JSP 页面。
- java - 如何在 spring-boot 中禁用所有 management.health 端点?
- c# - 在下载 excel 文件时,我希望 excel 单元格值将显示为具有货币格式的货币格式
- sling - 使用 HTL 在 Sling 中应用母版页模板