7

我是 Oauth 的新手。过去,对于用 Python 编写的 twitter 应用程序,我使用 python-oauth2 库来初始化客户端,如下所示:

consumer = oauth.Consumer(key = CONSUMER_KEY, secret = CONSUMER_SECRET)
token = oauth.Token(key = ACCESS_KEY, secret = ACCESS_SECRET)
client = oauth.Client(consumer, token)

这很容易,因为 twitter 提供了 CONSUMER 和 ACCESS 密钥和秘密。但现在我需要为 tumblr 做同样的事情。问题是 tumblr 仅提供 CONSUMER_KEY、CONSUMER_SECRET 和这些 url:

Request-token URL   http://www.tumblr.com/oauth/request_token
Authorize URL       http://www.tumblr.com/oauth/authorize
Access-token URL    http://www.tumblr.com/oauth/access_token

使用这些数据如何初始化客户端以访问 tumblr API?

UPD

jterrace 建议了我之前尝试使用的代码。它的问题是 oauth_callback。如果我没有指定任何内容,api 将返回错误“未指定 oauth_callback”,但如果我指定了一些 url,例如“http://example.com/oauthcb/”并点击链接http://www.tumblr.com /oauth/authorize?oauth_token=9ygTF ...,然后按允许按钮,tumblr 不显示任何 PIN 码页面,它立即重定向到该回调 url,因为它是桌面应用程序,所以没用。为什么不显示 PIN 码?

更新 2

Tumblr API 不支持 PIN 码授权。改用 xAuth - https://groups.google.com/group/tumblr-api/browse_thread/thread/857285e6a2b4268/15060607dc306c1d?lnk=gst&q=pin#15060607dc306c1d

4

6 回答 6

11

首先,导入oauth2 模块并设置服务的 URL 和消费者信息:

import oauth2

REQUEST_TOKEN_URL = 'http://www.tumblr.com/oauth/request_token'
AUTHORIZATION_URL = 'http://www.tumblr.com/oauth/authorize'
ACCESS_TOKEN_URL = 'http://www.tumblr.com/oauth/access_token'
CONSUMER_KEY = 'your_consumer_key'
CONSUMER_SECRET = 'your_consumer_secret'

consumer = oauth2.Consumer(CONSUMER_KEY, CONSUMER_SECRET)
client = oauth2.Client(consumer)

第 1 步:获取请求令牌。这是一个临时令牌,用于让用户授权访问令牌并签署请求以获得所述访问令牌。

resp, content = client.request(REQUEST_TOKEN_URL, "GET")

request_token = dict(urlparse.parse_qsl(content))
print "Request Token:"
print "    - oauth_token        = %s" % request_token['oauth_token']
print "    - oauth_token_secret = %s" % request_token['oauth_token_secret']

第 2 步:重定向到提供者。由于这是一个 CLI 脚本,我们不重定向。在 Web 应用程序中,您会将用户重定向到下面的 URL。

print "Go to the following link in your browser:"
print "%s?oauth_token=%s" % (AUTHORIZATION_URL, request_token['oauth_token'])

# After the user has granted access to you, the consumer, the provider will
# redirect you to whatever URL you have told them to redirect to. You can 
# usually define this in the oauth_callback argument as well.
oauth_verifier = raw_input('What is the PIN? ')

第 3 步:一旦消费者将用户重定向回 oauth_callback URL,您就可以请求用户批准的访问令牌。您使用请求令牌来签署此请求。完成此操作后,您丢弃请求令牌并使用返回的访问令牌。您应该将此访问令牌存储在安全的地方,例如数据库,以备将来使用。

token = oauth2.Token(request_token['oauth_token'], request_token['oauth_token_secret'])
token.set_verifier(oauth_verifier)
client = oauth2.Client(consumer, token)

resp, content = client.request(ACCESS_TOKEN_URL, "POST")
access_token = dict(urlparse.parse_qsl(content))

print "Access Token:"
print "    - oauth_token        = %s" % access_token['oauth_token']
print "    - oauth_token_secret = %s" % access_token['oauth_token_secret']
print

现在您有了访问令牌,您可以使用它调用受保护的方法。

编辑:原来 tumblr 不支持 PIN 授权方法。相关帖子在这里

于 2011-09-27T15:30:11.620 回答
6

如果您只是想获得一个访问令牌/秘密进行签名,您可以将您的回调 URL 设置为:http://localhost/blah

  • 启动 CLI 应用程序(当然在修改回调 URL、秘密和令牌之后)
  • 按照浏览器中的链接
  • 允许应用
  • 允许您的应用后,在浏览器中查看您被重定向到的页面的地址栏。它应该看起来像:

http://localhost/blah?oauth_token=xxxxxxxxxxxxxxxxxxxxxxxxxx0123456789ABCDEFGHIJKLMN&oauth_verifier=XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

使用查询参数“oauth_verifier”的值作为您的 PIN:XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

CLI 应该打印出您的 oauth-token 和 oauth-token-secret。

!以这种方式为 tumblr 工作:)

于 2011-10-30T15:38:32.080 回答
0

Have a look at https://github.com/ToQoz/Pyblr

It uses oauth2 and urllib to provide a nice wrapper for exactly what you're trying to do.

于 2011-09-27T12:46:46.010 回答
0

oauth2 和 facebook 有这个问题。@deepvanbinnen 的回答引导我走向正确的方向。

facebook实际上重定向到一个类似的页面

'http://localhost/blah?code=AQAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#_=_'

然后使用 ' AQAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#_=_ 作为 PIN,实际上让我可以访问所请求的 Facebook 帐户。

于 2012-04-12T15:18:00.370 回答
0

您似乎正在尝试使用 OAuth 2 客户端访问 OAuth 1 API。

请参阅https://github.com/simplegeo/python-oauth2并查找“三足 OAuth 示例”。

于 2011-09-27T14:33:10.730 回答
0

@jterrance 的回答很好。但是,请意识到获取访问令牌是一次性的手动过程访问令牌是您用于所有后续 API 调用的密钥。(这就是他建议将访问令牌保存在数据库中的原因。)称为“PIN”的字符串(也称为验证密钥)不一定是数字。它可以是任何形式的可打印字符串。该验证密钥显示在步骤 2 中打印的 URL 的授权页面上,然后粘贴到“PIN”提示中。

于 2014-02-21T14:27:55.197 回答