使用客户端

Are you using requests?

如果你是,那么你应该看看 requests-oauthlib 其中有几个如何对请求使用OAuth1的示例。

Signing a request with an HMAC-SHA1 signature (most common)

看见 requests-oauthlib 有关OAuth工作流程的更详细示例,请参阅。简而言之,您将执行三种类型的请求:获取请求令牌、获取访问令牌和访问受保护的资源。

获取请求令牌需要在向OAuth提供程序注册客户端时向您提供的客户端密钥和密码::

client = oauthlib.oauth1.Client('client_key', client_secret='your_secret')
uri, headers, body = client.sign('http://example.com/request_token')

然后,您需要重定向到OAuth提供程序的授权页面,该页面稍后将使用附加到您的回调URL的验证器和令牌秘密参数重定向回来。在获取访问令牌时,除了以前的凭据外,还将使用这些凭据:

client = oauthlib.oauth1.Client('client_key', client_secret='your_secret',
    resource_owner_key='the_request_token', resource_owner_secret='the_request_token_secret',
    verifier='the_verifier')
uri, headers, body = client.sign('http://example.com/access_token')

提供程序现在将为您提供访问令牌和新的令牌密码,您将使用它们访问受保护的资源::

client = oauthlib.oauth1.Client('client_key', client_secret='your_secret',
    resource_owner_key='the_access_token', resource_owner_secret='the_access_token_secret')
uri, headers, body = client.sign('http://example.com/protected_resource')

Unicode Everywhere

从0.3.5开始,如果您提供UTF-8编码的输入,OAuthLib支持自动转换为Unicode。如果您使用的是另一种编码,则必须确保在将所有输入传递给OAuthLib之前将其转换为Unicode。请注意,自动转换仅限于使用oauthlib.oauth1.Client。

Request body

OAuth 1规范仅涵盖x-www-url-formended信息的签名。

为方便起见,您可以通过以下三种方式之一传递正文数据:

  • 一本词典

  • 可迭代的2元组

  • 格式正确的x-www-url-formencode字符串

如果您要在正文中发送某种其他类型的数据,则会有一个额外的 oauth_body_hash 参数将包含在请求中。此参数提供对非格式编码的请求正文的完整性检查。

IMPORTANT 此扩展是向前兼容的:未实现此扩展的服务提供者可以验证已实现此扩展的使用者发送的请求。如果服务提供者实现此规范,则主体的完整性是有保证的。如果服务提供商不检查正文签名,则请求的其余部分仍将使用OAuth核心签名算法进行验证。

RSA Signatures

OAuthLib支持‘RSA-SHA1’签名,但默认情况下不安装PyJWT或加密依赖项。OAuthLib使用PyJWT包来平滑其内部代码。与PyCrypto相比,Windows和Mac OS X对加密包的支持要好得多,而且安装也更简单。用户可以使用pip::安装PyJWT和加密

pip install pyjwt cryptography

当您安装了密码学和PyJWT时,使用RSA签名类似于HMAC,但在几个方面有所不同。RSA签名不使用客户端机密或资源所有者机密(令牌机密),并要求您在构建客户端时指定签名类型:

client = oauthlib.oauth1.Client('your client key',
    signature_method=oauthlib.oauth1.SIGNATURE_RSA,
    resource_owner_key='a token you have obtained',
    rsa_key=open('your_private_key.pem').read())

Plaintext signatures

OAuthLib支持明文签名,它们在使用上与HMAC-SHA1签名相同,只是在构建客户端时需要设置签名方法::

client = oauthlib.oauth1.Client('your client key',
    client_secret='your secret',
    resource_owner_key='a token you have obtained',
    resource_owner_secret='a token secret',
    signature_method=oauthlib.oauth1.SIGNATURE_PLAINTEXT)

Where to put the signature? Signature types

OAuth 1通常使用Authorization头部来传递OAuth签名和其他OAuth参数。这是客户端中的默认设置,不需要指定。但是,您也可以使用请求URL查询或请求正文来传递参数。您可以使用Signature_type构造函数参数指定该位置,如下所示:

>>> # Embed in Authorization header (recommended)
>>> client = oauthlib.oauth1.Client('client_key',
        signature_type=SIGNATURE_TYPE_AUTH_HEADER,
    )

>>> uri, headers, body = client.sign('http://example.com/path?query=hello')
>>> headers
{u'Authorization': u'OAuth oauth_nonce="107143098223781054691360095427", oauth_timestamp="1360095427", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="client_key", oauth_signature="86gpxY1DUXSBRRyWnRNJekeWEzw%3D"'}

>>> # Embed in url query
>>> client = oauthlib.oauth1.Client('client_key',
        signature_type=SIGNATURE_TYPE_QUERY,
    )

>>> uri, headers, body = client.sign('http://example.com/path?query=hello')
>>> uri
http://example.com/path?query=hello&oauth_nonce=97599600646423262881360095509&oauth_timestamp=1360095509&oauth_version=1.0&oauth_signature_method=HMAC-SHA1&oauth_consumer_key=client_key&oauth_signature=VQAib%2F4uRPwfVmCZkgSE3q2p7zU%3D

>>> # Embed in body
>>> client = oauthlib.oauth1.Client('client_key',
        signature_type=SIGNATURE_TYPE_BODY,
    )

>>> # Please set content-type to application/x-www-form-urlencoded
>>> headers = {'Content-Type':oauthlib.oauth1.CONTENT_TYPE_FORM_URLENCODED}
>>> uri, headers, body = client.sign('http://example.com/path?query=hello',
                                     headers=headers)
>>> body
u'oauth_nonce=148092408248153282511360095722&oauth_timestamp=1360095722&oauth_version=1.0&oauth_signature_method=HMAC-SHA1&oauth_consumer_key=client_key&oauth_signature=5IKjrRKU3%2FIduI9UumVI%2FbQ0Hv0%3D'