Django中的Oauth 1.0a

1 投票
1 回答
715 浏览
提问于 2025-04-18 01:42

我正在尝试在我的Django应用中使用Rdio API进行授权调用。到目前为止,我一直在看这个教程来设置它:

http://www.rdio.com/developers/docs/web-service/oauth/ref-oauth1-overview

页面底部的代码对我来说运行得很好:我可以获取请求令牌,使用PIN码授权用户,然后使用新的访问令牌进行调用。

不过,我想实现一个回调功能,这样用户只需登录并返回我的网站,我就可以用他们的账户进行授权请求。目前我有一个页面,里面有一个链接用于授权这个应用,获取链接的函数大致是这样的:

def get_auth_url():
    client = oauth.Client(consumer)
    response, content = client.request('http://api.rdio.com/oauth/request_token', 'POST', urllib.urlencode({'oauth_callback': 'http://localhost:8080/my_page/'}))
    parsed_content = dict(cgi.parse_qsl(content))
    request_token = oauth.Token(parsed_content['oauth_token'], parsed_content['oauth_token_secret'])
    sURL = '%s?oauth_token=%s' % (parsed_content['login_url'], parsed_content['oauth_token'])
    return sURL

这没问题,当我点击这个链接时,会跳转到一个页面,询问我是否授权我的账户给这个应用。不过,我接下来需要从用户刚刚授权的请求令牌中获取访问令牌。授权页面的回调给了我oauth_verifieroauth_token这两个参数,但构建请求令牌需要oauth_tokenoauth_token_secret。我在第一次调用时有这个密钥,但在第二次调用时无法再次获取,而教程中说我不应该把密钥存储在任何可以访问的地方,也不应该在请求之间传递它。由于这两个请求是不同的,我想不出在哪里可以存储这个持久的请求令牌。那么,我该如何在第二次请求中获取oauth_token_secret,以便我能获取访问令牌呢?

1 个回答

1

你需要在你的服务器上暂时存储请求令牌,这样才能请求访问令牌。这里这句话:

请求令牌的秘密必须包含在签名中,但不能直接发送。

意思是说,这个秘密是用来生成签名的,但在请求的时候不需要单独发送这个秘密。

为了节省一些时间和精力,我建议你使用 Django Social Auth。它已经 支持 Rdio

撰写回答