Bagaimana cara mengarahkan ulang url setelah masuk ke Facebook?

Saya telah membuat aplikasi Django dengan koneksi Facebook ke aplikasi tersebut. Sekarang ketika saya mengklik tombol login Facebook, halaman oauth muncul. Ketika saya memberikan nama pengguna dan kata sandi, itu ditutup tanpa benar-benar mengarahkan halaman ke halaman mana pun. Tetapi ketika saya membuka halaman FB di tab baru, saya dapat melihat halaman login FB pengguna tersebut. Jadi loginnya berfungsi dengan sempurna, tetapi saya tidak mengerti ke mana harus mengarahkan halaman setelah diautentikasi. Adakah yang bisa membantu saya menyelesaikan ini. Ini adalah cara yang saya atur di halaman pengaturan saya? Saya tidak dapat menemukan url panggilan balik apa pun untuk disetel dalam opsi.

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

Kode untuk login : Potongan kode ini disisipkan di halaman html RegistrationForm (login):

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

dan kode facebookconnect.py adalah:

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 sumber
comment
posting kode Anda untuk pop up login.   -  person Love Sharma    schedule 20.04.2011
comment
saya telah memposting kode login FB saya. Bisakah Anda memeriksanya sekarang?   -  person rv_k    schedule 21.04.2011


Jawaban (2)


Saya kira Anda menggunakan perpustakaan JS Facebook jika Anda mengatakan bahwa oauth hanya muncul. Saya akan menggunakan cara pengalihan oauth yang lebih sederhana, menggunakan yang berikut ini:

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

Dimana self.app_id adalah id aplikasi facebook Anda. Dimana self.redirect_uri adalah url pengguna akan diarahkan setelah login. Dimana self.scope dibangun dari self.req_perms yang merupakan array dari izin yang diperlukan.

Setelah itu pengguna akan diarahkan ke redirect_uri dengan token akses di parameter posting 'signed_request', Anda dapat menggunakan fungsi berikut untuk memecahkan kodenya:

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

Contoh :

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

Sekali lagi Anda memerlukan self.app_secret dan fungsi berikut:

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

Saya mengalami banyak masalah dengan login dan autentikasi FB JS, terutama pada browser yang berbeda, cara ini adalah cara yang lebih tangguh yang dapat saya temukan :)

Btw Jika Anda ingin file facebook.py saya, saya dapat menyediakannya secara online di suatu tempat ... Ia bahkan memiliki dekorator tampilan @fbsig_required dan @fbsig_redirect ...

Oh Juga ini impor saya:

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
terima kasih banyak atas bantuan Anda dwarf..saya akan memeriksanya dan membalasnya kembali..Bisakah Anda juga membagikan file facebook.py Anda untuk saya? - person rv_k; 21.04.2011
comment
Anda dapat menemukan file facebook.py saya di sini di bitbucket - person dwarfy; 21.04.2011

Periksa ini, semoga ini memberi Anda ide untuk membuatnya berhasil:

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

person Love Sharma    schedule 21.04.2011