¿Cómo redireccionar la url después de iniciar sesión en Facebook?

He creado una aplicación django con una conexión de Facebook a la aplicación. Ahora, cuando hago clic en el botón de inicio de sesión de Facebook, aparece una página emergente. Cuando doy el nombre de usuario y la contraseña, se cierra sin redirigir la página a ninguna página. Pero cuando tomé la página de FB en una nueva pestaña, pude ver la página de inicio de sesión de FB de ese usuario. Por lo tanto, el inicio de sesión funciona a la perfección, pero no comprendo dónde redirigir la página una vez que se autentica. ¿Puede alguien ayudarme a resolver esto? Así es como configuro en mi página de configuración? No pude encontrar ninguna url de callback que se establezca en las opciones.

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 

El código para iniciar sesión: esta pieza de código se inserta en la página de registro de html (inicio de sesión):

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

y el código facebookconnect.py es:

 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 """   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() } }); }  """ % (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 "" #return "" def facebook_connect_login_button(parser, token): return FacebookLoginNode() register.tag(facebook_connect_login_button) 

Supongo que estás utilizando la biblioteca de Facebook de JS si dices que la verdad simplemente aparece. Me gustaría ir a la manera más simple de redireccionamiento, utilizando lo siguiente:

 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 = """  """ % redirect_url; return HttpResponse(redirect_code,mimetype="text/html") 

Donde self.app_id es tu ID de aplicación de Facebook. Donde self.redirect_uri es la url, el usuario será redirigido después de iniciar sesión. Donde self.scope se crea a partir de self.req_perms, que es una matriz de los permisos necesarios.

Después de que el usuario será redirigido a redirect_uri con el token de acceso en el parámetro post ‘signed_request’, puede usar la siguiente función para decodificarlo:

 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 

Ejemplo:

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

De nuevo, necesitarás self.app_secret y la siguiente función:

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

Tuve muchos problemas con el inicio de sesión de FB JS y la autenticación, especialmente en diferentes navegadores, de esta manera es la forma más robusta que pude encontrar 🙂

Por cierto, si quieres mi archivo facebook.py, puedo ponerlo disponible en línea en algún lugar … Incluso tiene decoradores de vista @fbsig_required y @fbsig_redirect …

Oh también aquí están mis importaciones:

 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 

Marque esto, para que esto le dé una idea para hacer que funcione:

https://stackoverflow.com/questions/2690723/facebook-graph-api-and-django/5539531#5539531