จะเปลี่ยนเส้นทาง URL หลังจากเข้าสู่ระบบ Facebook ได้อย่างไร?

ฉันได้สร้างแอปพลิเคชัน django ด้วย Facebook ที่เชื่อมต่อกับแอปพลิเคชัน ตอนนี้เมื่อฉันคลิกที่ปุ่มเข้าสู่ระบบ Facebook หน้า oauth จะปรากฏขึ้น เมื่อฉันให้ชื่อผู้ใช้และรหัสผ่าน มันจะถูกปิดโดยไม่เปลี่ยนเส้นทางเพจไปยังเพจใดๆ เลย แต่เมื่อฉันเปิดเพจ 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

รหัสสำหรับการเข้าสู่ระบบ : โค้ดชิ้นนี้ถูกแทรกลงใน registerForm html page(login) :

{% 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)

person rv_k    schedule 20.04.2011    source แหล่งที่มา
comment
โพสต์รหัสของคุณเพื่อเข้าสู่ระบบป๊อปอัป   -  person Love Sharma    schedule 20.04.2011
comment
ฉันโพสต์รหัสเข้าสู่ระบบ FB ของฉันแล้ว กรุณาตรวจสอบตอนนี้ได้ไหม?   -  person rv_k    schedule 21.04.2011


คำตอบ (2)


ฉันคิดว่าคุณกำลังใช้ห้องสมุด JS Facebook ถ้าคุณบอกว่า oauth เพิ่งป๊อปอัป ฉันจะใช้วิธีเปลี่ยนเส้นทาง 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='/th%s';
                    </script>
            """ % redirect_url;
            return HttpResponse(redirect_code,mimetype="text/html")

โดยที่ self.app_id คือ ID แอพ Facebook ของคุณ โดยที่ self.redirect_uri คือ URL ที่ผู้ใช้จะถูกเปลี่ยนเส้นทางหลังจากเข้าสู่ระบบ โดยที่ self.scope ถูกสร้างขึ้นจาก self.req_perms ซึ่งเป็นอาร์เรย์ของการอนุญาตที่จำเป็น

หลังจากนั้นผู้ใช้จะถูกเปลี่ยนเส้นทางไปที่ เปลี่ยนเส้นทาง_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 โดยเฉพาะในเบราว์เซอร์ที่แตกต่างกัน วิธีนี้เป็นวิธีที่มีประสิทธิภาพมากกว่าที่ฉันสามารถหาได้ :)

อย่างไรก็ตาม หากคุณต้องการให้ไฟล์ facebook.py ของฉัน ฉันสามารถวางไว้ออนไลน์ที่ไหนสักแห่งได้ ... มันยังมี @fbsig_required และ @fbsig_redirect view decorators ...

โอ้นี่คือการนำเข้าของฉันด้วย:

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
person dwarfy    schedule 20.04.2011
comment
ขอบคุณมากสำหรับความช่วยเหลือของคุณ คนแคระ..ฉันจะตรวจสอบสิ่งนี้แล้วตอบกลับกลับไป..คุณช่วยแชร์ไฟล์ facebook.py ของคุณให้ฉันได้ไหม - person rv_k; 21.04.2011
comment
คุณสามารถค้นหาไฟล์ facebook.py ของฉันได้ที่นี่บน bitbucket - person dwarfy; 21.04.2011

ตรวจสอบสิ่งนี้ นี่อาจจะทำให้คุณมีแนวคิดในการทำให้งานนั้นสำเร็จ:

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

person Love Sharma    schedule 21.04.2011