Python 登录Facebook后如何重定向url?

Python 登录Facebook后如何重定向url?,python,django,facebook,facebook-graph-api,Python,Django,Facebook,Facebook Graph Api,我已经创建了一个django应用程序,并通过Facebook连接到该应用程序。现在,当我点击Facebook登录按钮时,oauth页面弹出。当我给出用户名n密码时,它会关闭,而不会将页面重定向到任何页面。但当我在一个新的标签页中使用FB页面时,我可以看到该用户的FB登录页面。因此,登录是完美的工作,但我不知道哪里给页面重定向后,它得到认证。有人能帮我解决这个问题吗。这就是我在“设置”页面中的设置方式?我在选项中找不到任何要设置的回调url App ID xxxx API Key xxxx App

我已经创建了一个django应用程序,并通过Facebook连接到该应用程序。现在,当我点击Facebook登录按钮时,oauth页面弹出。当我给出用户名n密码时,它会关闭,而不会将页面重定向到任何页面。但当我在一个新的标签页中使用FB页面时,我可以看到该用户的FB登录页面。因此,登录是完美的工作,但我不知道哪里给页面重定向后,它得到认证。有人能帮我解决这个问题吗。这就是我在“设置”页面中的设置方式?我在选项中找不到任何要设置的回调url

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页面(登录):

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)
来自django导入模板的

从django.conf导入设置
从django.core.urlResolver反向导入
register=template.Library()
类FacebookScriptNode(template.Node):
def呈现(自身、上下文):
返回“”
FB.init(“%s”,“%s”);
函数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(过期、会话密钥、机密、uid、sig);
}
函数fb\u connect\u ajax(过期、会话密钥、ss、用户、sig){
var post_string='expires='+expires;
post_字符串=post_字符串+'&会话_键='+会话_键;
post_string=post_string+'&ss='+ss;
post_string=post_string+'&user='+user;
post_string=post_string+'&sig='+sig;
$.ajax({
类型:“POST”,
url:“%s”,
数据:post_字符串,
成功:功能(msg){
window.location='%s';//.reload()
}
});
} 
“%”(settings.FACEBOOK\u API\u键、reverse('xd\u receiver')、reverse('FACEBOOK\u connect\u ajax')、settings.LOGIN\u REDIRECT\u URL)
def facebook_connect_脚本(解析器、令牌):返回facebook脚本节点()
register.tag(facebook\u connect\u脚本)
类FacebookLoginNode(template.Node):
def呈现(自身、上下文):
返回“”
#返回“”
def facebook_connect_login_按钮(解析器,令牌):返回facebook登录节点()
register.tag(facebook连接登录按钮)

如果您说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")
例如:

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登录和身份验证方面遇到了很多麻烦,特别是在不同的浏览器上,这种方式是我能找到的更健壮的方式:)

顺便说一句,如果你想要我的facebook.py文件,我可以把它放在网上某个地方。。。它甚至还需要@fbsig_和@fbsig_重定向视图装饰器

哦,还有我的进口商品:

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

勾选此项,这可能会给你一些想法,使其发挥作用:


发布您的登录代码弹出窗口。我已经发布了我的FB登录代码。你能现在检查一下吗?非常感谢你的帮助矮人..我会检查一下并回复..你能帮我共享你的facebook.py文件吗?你可以找到我的facebook.py文件
@staticmethod
    def base64_url_decode(data):
            data = data.encode(u'ascii')
            data += '=' * (4 - (len(data) % 4))
            return base64.urlsafe_b64decode(data)
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