facebook使用django app成功登录后重定向url

Posted

技术标签:

【中文标题】facebook使用django app成功登录后重定向url【英文标题】:redirecting url after facebook logs in successfully with django app 【发布时间】:2011-07-29 19:50:30 【问题描述】:

我创建了一个带有用户登录/注册页面的 django 应用程序。我正在尝试与我的 django 登录一起实现 facebook 登录。为此,我关注了这个链接:enter link description here。正如文档所说,我创建了一个名为 FaebookConnectMiddleware.py 的文件并放入 settings.py 文件夹;并将数据库名称更改为我的数据库名称。现在 facebook 登录工作正常,但登录后,它被重定向到同一页面(django 注册页面,我放置 FB 登录按钮的位置)。我如何将它重定向到我的应用程序中的另一个页面。有人可以帮我解决这个问题。我将在此处粘贴 FacebookConnectMiddleware.py 代码。

 # FacebookConnectMiddleware.py
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from django.conf import settings

import md5
import urllib
import time
import simplejson
from datetime import datetime

# These values could be placed in Django's project settings
# More info here: http://nyquistrate.com/django/facebook-connect/
FACEBOOK_API_KEY = 'xxxxx'
FACEBOOK_SECRET_KEY = 'xxxx'

REST_SERVER = 'http://api.facebook.com/restserver.php'

# You can get your User ID here: http://developers.facebook.com/tools.php?api
MY_FACEBOOK_UID = 'xxx@gmail.com'

NOT_FRIEND_ERROR = 'You must be my Facebook friend to log in.'
PROBLEM_ERROR = 'There was a problem. Try again later.'
ACCOUNT_DISABLED_ERROR = 'Your account is not active.'
ACCOUNT_PROBLEM_ERROR = 'There is a problem with your account.'

class FacebookConnectMiddleware(object):

    def process_request(self, request):
        try:
             # Set the facebook message to empty. This message can be used to dispaly info from the middleware on a Web page.
            request.facebook_message = None

            # Don't bother trying FB Connect login if the user is already logged in
            if not request.user.is_authenticated():

                # FB Connect will set a cookie with a key == FB App API Key if the user has been authenticated
                if FACEBOOK_API_KEY in request.COOKIES:

                    signature_hash = self.get_facebook_signature(request.COOKIES, True)

                    # The hash of the values in the cookie to make sure they're not forged
                    if(signature_hash == request.COOKIES[FACEBOOK_API_KEY]):

                        # If session hasn't expired
                        if(datetime.fromtimestamp(float(request.COOKIES[FACEBOOK_API_KEY+'_expires'])) > datetime.now()):

                            # Make a request to FB REST(like) API to see if current user is my friend
                            are_friends_params = 
                                'method':'Friends.areFriends',
                                'api_key': FACEBOOK_API_KEY,
                                'session_key': request.COOKIES[FACEBOOK_API_KEY + '_session_key'],
                                'call_id': time.time(),
                                'v': '1.0',
                                'uids1': MY_FACEBOOK_UID,
                                'uids2': request.COOKIES[FACEBOOK_API_KEY + '_user'],
                                'format': 'json',
                            

                            are_friends_hash = self.get_facebook_signature(are_friends_params)

                            are_friends_params['sig'] = are_friends_hash

                            are_friends_params = urllib.urlencode(are_friends_params)

                            are_friends_response  = simplejson.load(urllib.urlopen(REST_SERVER, are_friends_params))

                            # If we are friends
                            if(are_friends_response[0]['are_friends'] is True):

                                try:
                                    # Try to get Django account corresponding to friend
                                    # Authenticate then login (or display disabled error message)
                                    django_user = UniversityDetails.objects.get(username=request.COOKIES[FACEBOOK_API_KEY + '_user'])
                                    user = authenticate(username=request.COOKIES[FACEBOOK_API_KEY + '_user'], 
                                                        password=md5.new(request.COOKIES[FACEBOOK_API_KEY + '_user'] + settings.FACEBOOK_SECRET_KEY).hexdigest())
                                    if user is not None:
                                        if user.is_active:
                                            login(request, user)
                                            self.facebook_user_is_authenticated = True
                                        else:
                                            request.facebook_message = ACCOUNT_DISABLED_ERROR
                                            self.delete_fb_cookies = True
                                    else:
                                       request.facebook_message = ACCOUNT_PROBLEM_ERROR
                                       self.delete_fb_cookies = True
                                except User.DoesNotExist:
                                    # There is no Django account for this Facebook user.
                                    # Create one, then log the user in.

                                    # Make request to FB API to get user's first and last name
                                    user_info_params = 
                                        'method': 'Users.getInfo',
                                        'api_key': FACEBOOK_API_KEY,
                                        'call_id': time.time(),
                                        'v': '1.0',
                                        'uids': request.COOKIES[FACEBOOK_API_KEY + '_user'],
                                        'fields': 'first_name,last_name',
                                        'format': 'json',
                                    

                                    user_info_hash = self.get_facebook_signature(user_info_params)

                                    user_info_params['sig'] = user_info_hash

                                    user_info_params = urllib.urlencode(user_info_params)

                                    user_info_response  = simplejson.load(urllib.urlopen(REST_SERVER, user_info_params))


                                    # Create user
                                    user = UniversityDetails.objects.create_user(request.COOKIES[FACEBOOK_API_KEY + '_user'], '', 
                                                                    md5.new(request.COOKIES[FACEBOOK_API_KEY + '_user'] + 
                                                                    settings.SECRET_KEY).hexdigest())
                                    user.first_name = user_info_response[0]['first_name']
                                    user.last_name = user_info_response[0]['last_name']
                                    user.save()

                                    # Authenticate and log in (or display disabled error message)
                                    user = authenticate(username=request.COOKIES[FACEBOOK_API_KEY + '_user'], 
                                                        password=md5.new(request.COOKIES[FACEBOOK_API_KEY + '_user'] + settings.FACEBOOK_SECRET_KEY).hexdigest())
                                    if user is not None:
                                        if user.is_active:
                                            login(request, user)
                                            self.facebook_user_is_authenticated = True
                                        else:
                                            request.facebook_message = ACCOUNT_DISABLED_ERROR
                                            self.delete_fb_cookies = True
                                    else:
                                       request.facebook_message = ACCOUNT_PROBLEM_ERROR
                                       self.delete_fb_cookies = True
                            # Not my FB friend
                            else:
                                request.facebook_message = NOT_FRIEND_ERROR
                                self.delete_fb_cookies = True

                        # Cookie session expired
                        else:
                            logout(request)
                            self.delete_fb_cookies = True

                   # Cookie values don't match hash
                    else:
                        logout(request)
                        self.delete_fb_cookies = True

            # Logged in
            else:
                # If FB Connect user
                if FACEBOOK_API_KEY in request.COOKIES:
                    # IP hash cookie set
                    if 'fb_ip' in request.COOKIES:

                        try:
                            real_ip = request.META['HTTP_X_FORWARDED_FOR']
                        except KeyError:
                            real_ip = request.META['REMOTE_ADDR']

                        # If IP hash cookie is NOT correct
                        if request.COOKIES['fb_ip'] != md5.new(real_ip + FACEBOOK_SECRET_KEY + settings.FACEBOOK_SECRET_KEY).hexdigest():
                             logout(request)
                             self.delete_fb_cookies = True
                    # FB Connect user without hash cookie set
                    else:
                        logout(request)
                        self.delete_fb_cookies = True

        # Something else happened. Make sure user doesn't have site access until problem is fixed.
        except:
            request.facebook_message = PROBLEM_ERROR
            logout(request)
            self.delete_fb_cookies = True

    def process_response(self, request, response):        

        # Delete FB Connect cookies
        # FB Connect javascript may add them back, but this will ensure they're deleted if they should be
        if self.delete_fb_cookies is True:
            response.delete_cookie(FACEBOOK_API_KEY + '_user')
            response.delete_cookie(FACEBOOK_API_KEY + '_session_key')
            response.delete_cookie(FACEBOOK_API_KEY + '_expires')
            response.delete_cookie(FACEBOOK_API_KEY + '_ss')
            response.delete_cookie(FACEBOOK_API_KEY)
            response.delete_cookie('fbsetting_' + FACEBOOK_API_KEY)

        self.delete_fb_cookies = False

        if self.facebook_user_is_authenticated is True:
            try:
                real_ip = request.META['HTTP_X_FORWARDED_FOR']
            except KeyError:
                real_ip = request.META['REMOTE_ADDR']
            response.set_cookie('fb_ip', md5.new(real_ip + FACEBOOK_SECRET_KEY + settings.FACEBOOK_SECRET_KEY).hexdigest())

        # process_response() must always return a HttpResponse
        return response

    # Generates signatures for FB requests/cookies
    def get_facebook_signature(self, values_dict, is_cookie_check=False):
        signature_keys = []
        for key in sorted(values_dict.keys()):
            if (is_cookie_check and key.startswith(FACEBOOK_API_KEY + '_')):
                signature_keys.append(key)
            elif (is_cookie_check is False):
                signature_keys.append(key)

        if (is_cookie_check):
            signature_string = ''.join(['%s=%s' % (x.replace(FACEBOOK_API_KEY + '_',''), values_dict[x]) for x in signature_keys])
        else:
            signature_string = ''.join(['%s=%s' % (x, values_dict[x]) for x in signature_keys])
        signature_string = signature_string + FACEBOOK_SECRET_KEY

        return md5.new(signature_string).hexdigest()

views这些函数为 django 应用程序进行登录/注册。

def registrationForm(request):
    if request.method == "POST":  
        firstName = request.POST.get("firstName")
        lastName = request.POST.get("lastName")
        email = request.POST.get("email")
        password = request.POST.get("password")
        sex = request.POST.get("sex")
        birthday = request.POST.get("birthday")
        UniversityDetails(firstName=firstName,lastName=lastName,email=email,password=password,sex=sex,birthday=birthday).save()

        send_mail('Email Verification', 'You have registered successfully', 'xx@gmail.com',
    ['xx@gmail.com'], fail_silently=False)

        return render_to_response('login.html')

    return render_to_response("registrationForm.html")

def login(request):
    if request.POST:       
        #sessionObj = request.session['active_token']
       # print sessionObj
        email=request.POST.get("username")
        password = request.POST.get("password")
        user = UniversityDetails.objects.filter(email=email,password=password)
        if(not user):
            return render_to_response("registrationForm.html",'invalid': True )
        else:
            return render_to_response("login.html")
    return render_to_response("registrationForm.html")

registrationForm.html

<div id="fb-root"></div>
  <script src="http://connect.facebook.net/en_US/all.js"></script>
  <script>
   FB.init( 
        appId:'114322105313139', cookie:true,
        status:true, xfbml:true 
     );
  </script>     
  <fb:login-button perms="email,user_checkins"  onlogin=”location.reload(false);">Login with Facebook</fb:login-button>

【问题讨论】:

【参考方案1】:

我认为你只需要将类顶部的变量声明为 false

class FacebookConnectMiddleware(object):

    facebook_user_is_authenticated = False

【讨论】:

修复了错误,但是你能告诉我在使用 FB id 登录后如何重定向 url 吗? 我不太了解 facebook 的东西,但我想你可以使用 Django 的重定向? - ***.com/questions/523356/python-django-page-redirect

以上是关于facebook使用django app成功登录后重定向url的主要内容,如果未能解决你的问题,请参考以下文章

成功登录后的 Django 重定向

Facebook 使用 Swift 和 Parse 登录到主 ViewController

我正在尝试使用 Facebook 登录,它在登录时成功但不返回应用程序

iOS Facebook 帐户工具包 - 成功登录后第二次打开应用程序时保留用户令牌

Swift:Facebook SDK,成功登录后检查丢失的权限

如何在 iOS App 中使用 Facebook 登录缓存 Facebook 用户信息