为我的 AppEngine 应用程序编写 OAuth2Callback



我想在 AppEngine 应用程序中实现此场景:

当用户请求 MyPageHandler 时,他将自动重定向到登录页面(如果他未登录)。然后,如果用户不存在于我们的记录中,我们将要求他向我们提供一些凭据(更准确地说是 https://www.googleapis.com/auth/plus.login 指定的凭据)。我们存储授权令牌以备将来使用。下次用户连接时,他会直接登录。

为此,我编写了以下代码:

decorator = appengine.OAuth2DecoratorFromClientSecrets(
    'my_client_secret.json',
    scope = 'https://www.googleapis.com/auth/plus.login')
@decorator.oauth_aware
def custom_login_required(handler_method):
    def check_login(self, *args, **kwargs):
        user = users.get_current_user()
        if not user:
            return self.redirect(users.create_login_url(self.request.url))
        else:
            usrs = UsersModel.query(UsersModel.email == users.get_current_user().email()).fetch()
            if len(usrs) == 0:
                user = UsersModel(email =  users.get_current_user().email())
                http = decorator.Http()
                myService = build('plus', 'v1', developerKey=api_key, http = http)
                people_resource = service.people()
                people_document = people_resource.get(userId='me').execute()
                user.gplus_profile = people_document['url']
                user.put()
                handler_method(self, *args, **kwargs)
            else:
                #get the link and avatar
                handler_method(self, *args, **kwargs)
    return check_login
class MyPage(webapp2.RequestHandler):
    @custom_login_required
    def get(self):
         .
         .
         #Some Work
         .
         .
class OAuth2CallbackRequestHandler(decorator.callback_handler()):
    def get(self):
         #I do not know how to make use of this
         pass

谢谢。

我终于设法创建了OAuth2CallbackHandler以适应我在帖子中已经指定的场景。这是遇到相同问题的人的解决方案。

class OAuth2CallbackRequestHandler(webapp2.RequestHandler):
@decorator.oauth_aware
def get(self):
    user = users.get_current_user()
    if not user:  #user not signed in
        return self.redirect(users.create_login_url(self.request.url))
    else:         #user signed-in
        usrs = UsersModel.query(UsersModel.email == users.get_current_user().email()).fetch()
        if len(usrs) == 0: #NEW USER
            if len(self.request.get('code')) != 0:  #user gave us permission
                credentials = decorator.flow.step2_exchange(self.request.get('code'))  #exchange user-permissions for credentials
                decorator.set_credentials(credentials)
                if decorator.has_credentials():  #ensuring credentials are setup
                    http = decorator.http()
                    myService = build('plus', 'v1', developerKey = api_key, http = http)
                    user = UsersModel(email =  users.get_current_user().email())
                    people_resource = myService.people()
                    people_document = people_resource.get(userId='me').execute()
                    user.gplus_profile_url = people_document['url']
                    user.gplus_avatar_url = people_document['image']['url']
                    user.display_name = people_document['displayName']
                    user.access_token = credentials.access_token
                    user.refresh_token = credentials.refresh_token #You may need them if you want to update the current information
                    user.put()
                    return self.redirect('/MyPage')
                else:
                    return self.redirect('/oauth2callback')
            else:  #we ask user for permission
                link = decorator.authorize_url()
                return self.redirect(link)
        else:   #USER ALREADY EXISTS
            return self.redirect('/MyPage')

class MyPage(webapp2.RequestHandler):
def get(self):
    if not users.get_current_user():
        self.redirect('/oauth2callback')
        return
    # Continue your work here

看看

https://developers.google.com/accounts/docs/OAuth2WebServer

您首先在形成URL部分中执行操作,然后向Google发出调用,然后回调(在redirect_uri参数中指定)执行"处理响应"部分中的内容。

或者,也许更好的是,检查一下是否有一个库可以为您完成肮脏的工作。

最新更新