你如何与Django一起使用rauth?

时间:2012-10-22 14:46:27

标签: python django oauth oauth-2.0 rauth

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实例,我需要在另一个视图中使用它来获取访问令牌..

我哪里错了..?如何完成它。

2 个答案:

答案 0 :(得分:1)

好的,有多种方法可以在Web应用程序的上下文中处理这个问题。我强烈建议您查看示例目录中的Facebook Flask example

基本思想是提供授权视图和重定向视图。您希望将提供程序重定向到重定向视图,并且您应该在假定您已获得用户授权的情况下执行您希望能够执行的所有操作。否则,您应该拯救并可能告知用户原因。

现在我通常做的是将服务包装器保存在一个单独的模块中,而不是在视图中,然后将它们导入到我需要它们的上下文中。您可以动态地初始化它们等等。但请参考我发布的链接以获得简单的实现。我认为这应该做你想要的。我意识到这不是Django,但这些成语与这样的简单案例非常接近。

答案 1 :(得分:0)

更新 - 经过进一步审核,我认为需要澄清。在用户在reddit身份验证页面上单击“是”之后,您才会获得access_token。然后,它会将查询中的代码和状态信息重定向到您在流程开始时提供的URI。

要接收在redirect_uri视图中发回的OAuth2令牌,您需要从视图类/方法中获取URL参数:

code = request.GET.get('code', '')

这将为您提供一个变量,其中包含从第一个请求生成的代码(它在URI中作为参数)。

确保检查“状态”变量,以相同的方式检索它,否则您的安全性就会消失。

你从那里做什么取决于你是否使用rauth或praw,但你可以使用上面收集的信息来生成获得所述访问令牌的适当请求。

基本上,您的回调视图(redirect_uri)处理所有reddit验证和处理。您的初始视图,大部分是生成的链接或重定向到reddit.com。