如果你说 oauth 只是弹出,我想你正在使用 JS Facebook 库。我会使用更简单的 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 应用程序 ID。
其中 self.redirect_uri 是用户登录后将被重定向的 url。
其中 self.scope 是从 self.req_perms 构建的,它是所需权限的数组。
之后,用户将使用“signed_request”后参数中的访问令牌重定向到redirect_uri,您可以使用以下函数对其进行解码:
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