2012-10-22 65 views
3

OAuth網站rauth中提到的python lib似乎是最簡單最好用的。所以,我想在Django中使用它,但無法真正實現它。你如何在Django中使用rauth?

這是我的問題。

# 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) 

現在,當用戶打開頁面,直接重定向,並要求用戶允許或拒絕。如果用戶允許,我們得到授權碼在重定向的URL

從授權令牌獲得訪問令牌,

rauth lib中提到這樣做,我有下一個不同的看法把相應的重定向的URL

data = dict(code='foobar', 
      grant_type='authorization_code', 
      redirect_uri='http://example.com/') 
token = service.get_access_token('POST', data=data) 

問題是與service對象。我在一個視圖中創建了service實例,我需要在另一個視圖中使用它來獲取訪問令牌。

我要去哪裏錯了..?如何完成它。

回答

1

好的,有各種方法可以在Web應用程序的上下文中處理這個問題。我強烈建議看看示例目錄中的Facebook Flask example

其基本思想是提供授權視圖和重定向視圖。您希望提供商重定向到重定向視圖,並且您應該完成所有您期望能夠完成的任務,假設您已獲得用戶的授權。否則,您應該紓困,並可能通知用戶原因。

現在我通常所做的就是將服務包裝保存在一個單獨的模塊中,而不是視圖中,然後將它們導入到我需要的上下文中。你可以做些事情來動態初始化它們等等。但請參考我發佈的鏈接以獲取簡單的實現。我認爲這應該做你想做的。我意識到這不是Django,但成語與這種簡單的例子非常接近。

0

更新 - 進一步審查後,我看到需要澄清。直到用戶在reddit身份驗證頁面上單擊「是」之後,纔會獲得access_token。然後,它將通過查詢中的代碼和狀態信息重定向到您在流程開始時提供的URI。

能收到REDIRECT_URI的觀點貼背的OAuth2令牌,你需要從視圖類/方法中獲取URL參數:

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

這會給你一個包含從生成的代碼的變量第一個請求(它在URI中作爲參數)。

確保你也檢查你的「狀態」變量,並以同樣的方式檢索它,否則你的安全性會消失。

你從那裏做的取決於你是否使用了rauth或praw,但是你可以使用上面收集的信息來生成相應的請求來獲得上述訪問令牌。

基本上,你的回調視圖(redirect_uri)處理所有的reddit驗證和處理。您的初始視圖大部分是生成的鏈接或重定向到reddit.com。