我是 python 和 oAuth 世界的新手。我想使用消费者密钥和秘密连接到我的服务器,我发现的所有示例都是服务器具有 access_token、authorize、request_token_ready 等 api,但我的服务器为我进行了 oAuth 身份验证。所以我的问题是如何使用 oAuth 将 python 连接到我的服务器(我的服务器使用 oAuth 1.0)
阐述:我的服务器不请求令牌和访问令牌。他只使用密钥和秘密。如何在 python 中实现到此服务器的 oAuth 连接
这是一个使用 requests_oauthlib 的工作示例
from requests_oauthlib import OAuth1Session
test = OAuth1Session('consumer_key',
client_secret='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
url = 'https://one-legged-ouath.example.com/username/test'
r = test.get(url)
print r.content
我知道这是一个老问题,但接受的答案确实没有解决他的问题,因为正如 OP 所指出的,这些示例都与仅使用密钥和秘密、无令牌有关。
听起来好像您正在使用我所理解的被称为 OAuth 1.0a(单腿)的东西,尽管有些人将其称为 OAuth 1.0a 两腿。
我没有对此进行测试,但这里似乎有一个很好的例子:
https://github.com/CarmaSys/CarmaLinkAPI/wiki/Authentication-&-Permissions
这里还有另一个很好的例子:
正如 roman 已经说过的,这是一个老问题,但是仍然有一些受 OAuth 1.0a(单腿)保护的 API,今天我花了几个小时寻找访问此类 API 的有效解决方案。
我希望,对于下一个面临类似任务的人来说,该解决方案可能会派上用场。
我的解决方案基于罗马人的回答。非常感谢@roman!!
我想要访问的 API 的默认响应是 XML,因此我需要一种设置请求标头的方法。其实做起来很简单,如果你知道怎么做的话。
from requests_oauthlib import OAuth1Session
CONSUMER_KEY = ""
CONSUMER_SECRET = ""
host = "rest.host.de"
uri = "/restapi/api/search/v1.0/statistic?geocode=1276001039"
oauthRequest = OAuth1Session(CONSUMER_KEY,
client_secret=CONSUMER_SECRET)
url = 'https://' + host + uri
headers = {
'Accept': "application/json",
'Accept-Encoding': "gzip, deflate",
}
response = oauthRequest.get(url, headers=headers)
print(response.status_code)
print(response.content)
我正在使用 POX 帖子正文添加此 OAuth 1.0a(单腿)示例。这是一个使用带有“Plain Old XML”(POX)主体的请求/发布/响应的简单示例:
from requests_oauthlib import OAuth1Session
CONSUMER_KEY = "xxxxxxx"
CONSUMER_SECRET = "xxxxxxx"
ourSession = OAuth1Session(CONSUMER_KEY, client_secret=CONSUMER_SECRET, force_include_body=True)
body= '<?xml version="1.0" encoding="UTF-8"?>' \
'<POXEnvelopeRequest xmlns="http://whateve">' \
'<POXHeader>' \
' <RequestHeaderInfo>' \
. . . .
' </RequestHeaderInfo>' \
'</POXHeader>' \
'</POXEnvelopeRequest>'
clen = str(len(body))
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Host': 'X.Y.com',
'Content-Type': 'application/xml',
'Connection': 'keep-alive',
'Content-Length': clen
}
r = ourSession.post(url, headers=headers, data=body, verify=False)
# DEBUG: Comment out in and out as needed...
print("===================== B E G I N R E S P O N S E =======================\n")
print(r)
print(r.text)
print("===================== E N D of R E S P O N S E =======================\n")
[python][oAuth1.0a][单腿][双腿]