Я полагаю, вы используете библиотеку 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='%s';
</script>
""" % redirect_url;
return HttpResponse(redirect_code,mimetype="text/html")
Где self.app_id - это идентификатор вашего приложения в Facebook.Где self.redirect_uri - это URL, по которому пользователь будет перенаправлен после входа в систему.Где self.scope построен из self.req_perms, который является массивом необходимых разрешений.
После этого их пользователь будет перенаправлен на redirect_uri с токеном доступа в параметре post 'signature_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 ...
О, также вот мой импорт:
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