集成facebook登录谷歌应用程序引擎与python
问题描述:
我创建了谷歌应用程序引擎应用程序。集成facebook登录谷歌应用程序引擎与python
在这我用谷歌直接登录以及用openid登录。
openid我整合使用do_openid_login.py作为谷歌文档建议。 现在我想整合Facebook登录。
那么我怎么能整合Facebook登录?
答
有Facebook的非官方SDK(https://github.com/pythonforfacebook/facebook-sdk)。它对于AppEngine来说非常有用,其中用户通过html/js按钮登录,并从FB cookie获取有关服务器端用户的数据。 在GitHub上的示例代码中,您可以很容易地实现代码。
通过使用得到FB的cookie的用户:
fb_user = facebook.get_user_from_cookie(request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
其中Request.Cookies时是含有请求中的Cookie字典(如在GAE的webapp2的)
当你有fb_user就可以开始检索有关数据他/她:
graph = facebook.GraphAPI(fb_user["access_token"])
profile = graph.get_object("me")
user_email = profile["email"]
facebook.GraphAPI使用用户的访问令牌来授权您的来自Facebook的请求。然后你选择对象“我”,这是用户使用你的应用程序。稍后,您可以根据用户登录的登录按钮范围使用您有权使用的任何数据。
如果您正在使用webapp2 additionaly,则可以创建自定义Handler类以保存用户数据要在当前会话中使用
from webapp2_extras import sessions # import session
config = {}
config['webapp2_extras.sessions'] = dict(secret_key='')
# remember to pass config to webapp2.WSGIApplication:
app = webapp2.WSGIApplication(
[('/', HomeHandler), ('/logout', LogoutHandler)], #handlers
debug=True, # debug state
config=config # CONFIG!
)
class MyHandler(webapp2.RequestHandler):
# ...
@property
def current_user(self):
# check if user logged in during this session
if self.session.get("user"):
# user is logged in
return self.session.get("user")
else:
# either user just logged in or just saw the first page
# we'll see here
fb_user = facebook.get_user_from_cookie(self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
if fb_user:
# okay so user logged in.
# now, check to see if existing user
graph = facebook.GraphAPI(fb_user["access_token"])
profile = graph.get_object("me")
# DB # user = User.get_by_key_name(PREFIX+fb_user["uid"])
# NDB # user = ndb.Key("User",PREFIX+str(profile["id"])).get()
# you can add prefix if you're using multiple social networks (g+, twitter)
if not user:
# not an existing user so get user info
# DB # user = User(key_name = PREFIX+str(profile["id"]), OTHER DATA)
# NDB # user = User(id = PREFIX+str(profile["id"]), OTHER DATA)
user.put()
elif user.SOMETHING_THAT_MIGHT_CHANGE != fb_user["SOMETHING_THAT_MIGHT_CHANGE"]:
# update values that changed since las check to database
user.SOMETHING_THAT_MIGHT_CHANGE = fb_user["SOMETHING_THAT_MIGHT_CHANGE"]
user.put()
# User is now logged in
# Save often used values to session so you don't have to query database all the time
self.session["user"] = dict(
id = "f"+str(profile["id"]),
email = profile["email"],
access_token = fb_user["access_token"]
)
return self.session.get("user")
return None
def dispatch(self):
self.session_store = sessions.get_store(request=self.request)
try:
webapp2.RequestHandler.dispatch(self)
finally:
self.session_store.save_sessions(self.response)
@webapp2.cached_property
def session(self):
return self.session_store.get_session()
现在你可以使用你的处理程序和访问当前用户:
class MainPageHandler(Handler):
def get(self):
current_user = self.current_user
graph = facebook.GraphAPI(self.current_user['access_token'])
请记住,这仅仅是基础知识,你可以学到更多的https://github.com/pythonforfacebook/facebook-sdk
谢谢,我会尝试使用这个。 – 2014-09-06 03:50:44
我不能得到这个工作,因为它需要请求库,并且全新的请求代码下载失败,导致错误'ImportError:No module named'requests.packages.urllib3'(截至2015年1月29日)。 – Chris 2015-01-29 19:20:40
@Chris是的,所以也安装urllib3。这不是Python内置的urllib2,它是第三方库:https://urllib3.readthedocs.org/en/latest/ – Hejazzman 2015-01-30 05:44:49