2011-04-20 49 views
2

我已經創建了一個與Facebook連接到應用程序的Django應用程序。現在,當我點擊Facebook登錄按鈕時,oauth頁彈出窗口。當我給用戶名n密碼時,它會在沒有實際將頁面重定向到任何頁面的情況下關閉。但是當我把FB頁面放在一個新標籤中時,我可以看到FB登錄該用戶的頁面。所以登錄是完美的,但我不明白到哪裏給頁面重定向後,它得到認證。有人可以幫我解決這個問題嗎?這是我在我的設置頁面中設置的方式?我無法找到選項中設置的任何回調URL。如何在登錄Facebook後重定向網址?

App ID 
xxxx 
API Key 
xxxx 
App Secret 
xxx 
Site URL 
http://localhost:8080/redirect_url/ 
Site Domain 
localhost 
Canvas Page 
http://apps.facebook.com/registrationforms/ 
Canvas URL 
http://apps.facebook.com/registrationforms/ 
Secure Canvas URL 
Canvas FBML/iframe 
iframe 

用於登錄的代碼: 這段代碼被插入在registrationForm html頁面(登錄):

{% load facebookconnect %} 
{% facebook_connect_login_button %} 
{% facebook_connect_script %} 

和facebookconnect.py代碼是:

from django import template 
from django.conf import settings 
from django.core.urlresolvers import reverse 

register = template.Library() 

class FacebookScriptNode(template.Node): 
     def render(self, context): 
      return """ 
      <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script> 


      <script type="text/javascript"> FB.init("%s", "%s"); 
       function facebook_onlogin() { 
        var uid = FB.Facebook.apiClient.get_session().uid; 
        var session_key = FB.Facebook.apiClient.get_session().session_key; 
        var expires = FB.Facebook.apiClient.get_session().expires; 
        var secret = FB.Facebook.apiClient.get_session().secret; 
        var sig = FB.Facebook.apiClient.get_session().sig; 

        fb_connect_ajax(expires, session_key, secret, uid, sig); 

       } 

       function fb_connect_ajax(expires, session_key, ss, user, sig) { 

        var post_string = 'expires=' + expires; 
        post_string = post_string + '&session_key=' + session_key; 
        post_string = post_string + '&ss=' + ss; 
        post_string = post_string + '&user=' + user; 
        post_string = post_string + '&sig=' + sig; 

        $.ajax({ 
         type: "POST", 
         url: "%s", 
         data: post_string, 
         success: function(msg) { 
          window.location = '%s'; //.reload() 
         } 
        }); 
       } 
      </script>  
      """ % (settings.FACEBOOK_API_KEY, reverse('xd_receiver'), reverse('facebook_connect_ajax'), settings.LOGIN_REDIRECT_URL) 


def facebook_connect_script(parser, token): return FacebookScriptNode() 

register.tag(facebook_connect_script) 

class FacebookLoginNode(template.Node): 
    def render(self, context): 
     return "<fb:login-button onlogin='facebook_onlogin();'></fb:login-button>" 
     #return "<fb:login-button onclick="openPopup('https://graph.facebook.com/oauth/authorize?client_id=a0acfd122e64fc21cfa34d47369f0c97&redirect_uri=http://mysite.com/mypage&display=popup');"></fb:login-button>" 



def facebook_connect_login_button(parser, token): return FacebookLoginNode() 

register.tag(facebook_connect_login_button) 
+1

發佈您的登錄代碼彈出。 – 2011-04-20 13:39:21

+0

我已經發布了我的FB登錄碼。你可以請現在檢查嗎? – 2011-04-21 04:28:26

回答

5

如果你說oauth只是彈出窗口,我想你正在使用JS的Facebook庫。我會去簡單的OAuth的重定向方式,採用了以下內容:

def build_authentication_redirect(self): 
      args = {} 
      args["client_id"]=self.app_id 
      args["redirect_uri"]=self.redirect_uri 
      args["scope"]=",".join(self.req_perms) 
      redirect_url = "https://www.facebook.com/dialog/oauth?"+urllib.urlencode(args) 
      redirect_code = """ 
        <script type="text/javascript"> 
        top.location.href='%s'; 
        </script> 
      """ % redirect_url; 
      return HttpResponse(redirect_code,mimetype="text/html") 

哪裏self.app_id是你的Facebook應用程序ID。 其中self.redirect_uri是登錄後用戶將被重定向的網址。 self.req_perms是self.req_perms構建的,self.req_perms是所需權限的數組。

之後,他們的用戶會被重定向在郵寄的訪問令牌REDIRECT_URI「signed_request」參數,你可以用下面的函數將其解碼:

def load_signed_request(self, signed_request): 
      """Load the user state from a signed_request value""" 
      sig, payload = signed_request.split(u'.', 1) 
      sig = self.base64_url_decode(sig) 
      data = json.loads(self.base64_url_decode(payload)) 

      expected_sig = hmac.new(self.app_secret, msg=payload, digestmod=hashlib.sha256).digest() 

      # allow the signed_request to function for upto 1 day 
      if sig == expected_sig and data[u'issued_at'] > (time.time() - 86400): 
        return data.get(u'user_id'), data.get(u'oauth_token') 
      else: 
        return None,None 

例子:

sigreq =request.POST.get('signed_request', None) 
user_id,access_token = load_signed_request(sigreq) 

再次,您將需要self.app_secret和以下功能:

@staticmethod 
    def base64_url_decode(data): 
      data = data.encode(u'ascii') 
      data += '=' * (4 - (len(data) % 4)) 
      return base64.urlsafe_b64decode(data) 

我有很多FB JS登錄和身份驗證的麻煩,特別是在不同的瀏覽器,這種方式是我可以找到更強大的方式:)

Btw如果你想我的facebook.py文件,我可以把它放在網上地方......它甚至有一個@fbsig_required和@fbsig_redirect視圖裝飾...

哦,這裏也有我的進口:

import cgi 
import hashlib 
import time 
import urllib 
import base64 
import datetime 
import hmac 

from django.conf import settings 
from django.http import HttpResponseRedirect,HttpResponse,HttpResponseNotFound 
+0

非常感謝您的幫助矮人..我會檢查與此並回復回來..你還可以爲我分享你的facebook.py文件? – 2011-04-21 04:14:35

+0

嗨,謝謝你的好話:) – dwarfy 2011-04-21 08:57:59

+0

你可以找到我的facebook.py文件[在這裏bitbucket](https://bitbucket.org/dwarfy/my-facebook-py/src) – dwarfy 2011-04-21 08:58:27