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

时间:2019-06-18 21:27:40

标签: python oauth python-requests

我正在尝试使用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)

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

1 个答案:

答案 0 :(得分:0)

您可以使用这种方法来同时使用 oauth2 Libary 和 Request,我更喜欢将 ouath2 与 Authorization: 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)