3

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

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

4

2 回答 2

1

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

基本思想是提供授权视图和重定向视图。您希望提供者重定向到重定向视图,并且假设您已获得用户授权,您应该在其中执行您希望能够执行的所有操作。否则,您应该退出并可能告知用户原因。

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

于 2013-03-28T21:51:25.357 回答
0

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

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

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

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

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

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

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

于 2013-04-03T11:29:36.380 回答