如何用python用hmac-sha1生成oauth签名



我试图用Python从REST API中获取信息,它需要OAuth标识。我已经设法与Postman一起撰写了请求,它很有效。然而Postman给我的python代码不起作用:

import requests
url = "https://www.somewebsite.com/api/rest/products/store/2"
querystring = {"limit":"100","page":"5"}
headers = {
'Authorization': "OAuth oauth_consumer_key="3626311748bcf2072da2bd475fccfa3c",
oauth_token="878c7c0eb6122e6208b75e2ba9e23f86",
oauth_signature_method="HMAC-SHA1",oauth_timestamp="1560892926",
oauth_nonce="9Cy9wmOo21v",oauth_signature="9VqTR2qFQLZ%2Fz2Ibvny1e%2BC7Zes%3D"",
'User-Agent': "PostmanRuntime/7.15.0",
'Accept': "*/*",
'Cache-Control': "no-cache",
'Postman-Token': "eef345cc-52ee-4496-8109-e7ea013adb9c,0834423c-041c-4ca5-8bef-33876c311ef6",
'Host': "www.inart.com",
'cookie': "PHPSESSID=gmjmllng429gfk8t0hvd1abbu3",
'accept-encoding': "gzip, deflate",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
response = requests.request("GET", url, headers=headers, params=querystring)
print(response.text)

不起作用的部分实际上是nonce、时间戳和签名。我已经制作了一个生成随机随机随机数和随机时间戳的函数,但我不知道如何为HMAC-SHA1生成有效签名。是否有库可以为我进行身份验证,或者我需要编写自己的函数来生成有效签名?签名是依赖于整个调用,还是仅依赖于nonce、时间戳和令牌等部分?任何帮助都将不胜感激!

您可以检查此库

https://requests-oauthlib.readthedocs.io/en/latest/.

它同时支持Oauth1和Oauth2,并提供了出色的文档。无需关心创建nonce、时间戳以及oauth_signature。只需提供您的app_key、app_secret、request_token_url、authorization_url和access_token_rl。

您可以使用这种方法同时使用oauth2 Libary和Request,我更喜欢使用带Authorization的ouath2:Bearer Token。但是,OAuth 1.0需要加密实现和加密互操作性。虽然安全,但对于许多开发人员来说,实现它是一个挑战。

其中OAuth 2.0定义了四个角色(客户端、授权服务器、资源服务器和资源所有者),OAuth 1对这些角色使用不同的术语集。OAuth 2.0的"客户端"被称为"使用者","资源所有者"被简称为"用户",而"资源服务器"则被称作"服务提供者"。OAuth 1也没有明确地分离资源服务器和授权服务器的角色。

params = {
"oauth_version": "1.0",
"oauth_nonce": oauth2.generate_nonce(),
"oauth_timestamp": str(oauth2.generate_timestamp()),
"oauth_token": token.key,
"oauth_consumer_key": consumer.key
}
req = oauth2.Request(method="GET", url=url, parameters=params)
signature_method = oauth2.SignatureMethod_HMAC_SHA1()
req.sign_request(signature_method, consumer, token)
headers = req.to_header()
payload = {}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)

最新更新