OAuth网站rauth中提到的python库似乎很简单,也是最好用的。所以,我想在Django中使用它,但无法实际实现它。
这就是我的问题。
# I do something like this initially
from rauth.service import OAuth2Service
from django.shortcuts import render_to_response
def page(request):
service = OAuth2Service(
consumer_key = "..",
consumer_secret = "...",
.. )
url = service.get_authorize_url(redirect_uri="http://mysite.com/redired-url")
# this url is where the user accepts or not.
# which redirects with authorization code.
return HttpResponseRedirect(url)现在,当用户打开页面时,它直接重定向,并要求用户允许或拒绝。如果用户允许,我们可以在redirect-url获得授权码。
为了从授权令牌中获取访问令牌,
rauth lib提到要这样做,我必须将其放在对应于redirect-url的不同视图下。
data = dict(code='foobar',
grant_type='authorization_code',
redirect_uri='http://example.com/')
token = service.get_access_token('POST', data=data)问题出在service对象上。我在一个视图中创建了service实例,我需要在另一个视图中使用它来获取访问令牌。
我哪里错了..?如何做到这一点。
发布于 2013-03-29 05:51:25
好的,在web应用程序的上下文中,有多种方法来处理这个问题。我强烈建议您查看examples目录中的Facebook Flask example。
基本思想是提供授权视图和重定向视图。您希望让提供程序重定向到重定向视图,并且在该视图中,您应该做所有您期望能够做的事情,假设您已经得到了用户的授权。否则,您应该退出,并可能告知用户原因。
现在我通常要做的是将服务包装器放在一个单独的模块中,而不是放在一个视图中,然后将它们导入到我需要它们的上下文中。你可以做一些事情来动态地初始化它们等等。但请参考我发布的链接,以获得简单的实现。我认为这应该能做你想要的。我知道它不是Django,但它的习惯用法与像这样的视图的简单情况非常接近。
发布于 2013-04-03 19:29:36
更新-在进一步的审查中,我发现有必要澄清。在用户单击reddit身份验证页面上的“是”之前,您不会获得access_token。然后,它将使用查询中的代码和状态信息重定向到您在流程开始时提供的URI。
要在redirect_uri的视图中接收回发的URL令牌,需要从视图类/方法中获取OAuth2参数:
code = request.GET.get('code', '')这将为您提供一个变量,其中包含从第一个请求生成的代码(它在URI中作为参数)。
确保你也检查你的"state“变量,以同样的方式检索它,否则你的安全性就会被抛在脑后。
从那里做什么取决于您使用的是rauth还是praw,但您可以使用上面收集的信息来生成适当的请求来获取所述访问令牌。
基本上,您的回调视图(redirect_uri)处理所有reddit验证和处理。在大多数情况下,您的初始视图要么是生成的链接,要么是重定向到reddit.com。
https://stackoverflow.com/questions/13013931
复制相似问题