简体   繁体   English

使用python将Facebook登录集成到Google App Engine中

[英]Integrate facebook login in google app engine with python

I created google app engine app. 我创建了Google App Engine应用。

In that i used google direct login as well as login with openid. 在那我使用谷歌直接登录以及使用openid登录。

openid i integrate using do_openid_login.py as google document suggested. 我使用do_openid_login.py作为Google文档建议集成的openid。 Now i want integrate facebook login too. 现在我也想集成Facebook登录。

So how could i integrate facebook login? 那么我该如何整合Facebook登录呢?

There is unofficial SDK for Facebook ( https://github.com/pythonforfacebook/facebook-sdk ). 有适用于Facebook的非官方SDK( https://github.com/pythonforfacebook/facebook-sdk )。 It includes great thing for AppEngine where user logins via html/js button and you get data about the user on server-side from FB cookie. 它对AppEngine来说是一件好事,其中用户通过html / js按钮登录,并且您可以从FB cookie在服务器端获取有关用户的数据。 In sample code on GitHub you have great, easy to implement code. 在GitHub上的示例代码中,您可以轻松实现出色的代码。

You get user from fb cookie by using: 您可以使用以下方法从fb cookie中获取用户:

fb_user = facebook.get_user_from_cookie(request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)

where request.cookies is dictionary containing cookies from request (like in GAE's webapp2) 其中request.cookies是包含来自请求的cookie的字典(例如在GAE的webapp2中)

When you have fb_user you can start retrieving data about him/her: 如果您拥有fb_user,则可以开始检索有关他/她的数据:

graph = facebook.GraphAPI(fb_user["access_token"])
profile = graph.get_object("me")
user_email = profile["email"]

facebook.GraphAPI uses user's access token to authorize your requests from facebook. facebook.GraphAPI使用用户的访问令牌来授权来自Facebook的请求。 Then you select object "me" which is user using your app. 然后,选择对象“我”,它是使用您的应用程序的用户。 Later you can use any data that you have permission to use based on scope of sign-in button via which your user logged in. 以后,您可以根据用户登录所使用的登录按钮的范围来使用您有权使用的任何数据。

If you're using webapp2 additionaly you can create your custom Handler class to save user data that you want to use in current session 如果您正在使用webapp2,则可以创建自定义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()

Now you can use your handlers and access current user: 现在,您可以使用处理程序并访问当前用户:

class MainPageHandler(Handler):
    def get(self):
        current_user = self.current_user
        graph = facebook.GraphAPI(self.current_user['access_token'])

Remember that this are just the basics, you can learn more at https://github.com/pythonforfacebook/facebook-sdk 请记住,这只是基础知识,您可以在https://github.com/pythonforfacebook/facebook-sdk了解更多

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM