Google App Engine:SimpleAuth:动态重定向网址

时间:2012-06-02 00:21:06

标签: google-app-engine authentication redirect oauth-2.0

我在我的GAE应用程序中使用Alex的SimpleAuth(https://github.com/crhym3/simpleauth)。我的基本模板中有一个Jquery Powered登录框,这意味着用户可以从应用程序内的任何URL登录。我希望将用户重定向回他们要求登录的页面。我们有什么办法可以用Oauth2实现这个目的,还是我们可以只将用户重定向回一个特定的网址?

2 个答案:

答案 0 :(得分:5)

如果您正在使用SimpleAuth,我假设您可能使用的是webapp2,因此@jmort253示例并不完全是我所做的(例如,webapp2具有内置会话,因此为什么还要使用另一个库进行会话处理)。

虽然,从概念上讲它是正确的:您需要的是在开始身份验证过程之前在会话中的某个位置存储原始URL。然后在成功验证后使用该存储的URL进行最终重定向。

从SimpleAuth的示例应用代码开始,您基本上需要更改的是last line of _on_signin()将用户重定向到他们来自的原始网址(而不是'/ profile')。

要存储原始请求URL,您可以使用简单的包装器,例如

def simpleauth_login_required(handler_method):
    """A decorator to require that a user be logged in to access a handler.

    To use it, decorate your get() method like this:


        @simpleauth_login_required
        def get(self):
            user = self.current_user
            self.response.out.write('Hello, ' + user.name())
    """
    def check_login(self, *args, **kwargs):
        if self.request.method != 'GET':
            self.abort(400, detail='The login_required decorator '
                'can only be used for GET requests.')

        if self.logged_in:
            handler_method(self, *args, **kwargs)
        else:
            self.session['original_url'] = self.request.url
            self.redirect('/my-login-page-where-users-can-choose-auth-method')

    return check_login

现在,回到_on_signin()重定向行,而不是self.redirect('/profile')你会做这样的事情:

target = self.session['original_url']
self.redirect(target)

一对夫妇注意到:

  • 上面的示例假设您使用logged_in方法指示当前请求是否由已经过身份验证的用户发出;
  • 您可能希望从会话中清除'original_url'(如果他们成功通过身份验证)

以上示例的信用转到webapp2_extras.appengine.users module

答案 1 :(得分:1)

当您的用户尝试登录时,您的应用首先会请求访问令牌,然后构建Google OAuth2网址。您的应用会将用户重定向到您的用户必须登录的google.com。此登录网址包含服务器向Google发出的请求中的访问令牌。出于安全考虑,它与该重定向URL绑定。

此重定向网址旨在通过向您的应用返回成功的登录操作来完成登录过程,以便您可以完成登录用户,注册该用户或执行您的应用需要执行的任何操作。

之后,球就在你的球场上,你可以编写你的应用程序来做任何你想做的事情。换句话说,Google只关心将请求发送到您的安全端点。一旦完成,谷歌不再关心你做什么;这是你的应用程序。

因此,要将用户重定向回登录之前他/她所在的页面,这是一个非常棒的可用性改进,就是执行以下操作:

重定向用户的步骤:

1在用户登录之前,将他/她所在的页面存储在会话中。

session = appengine_utilities.sessions.Session()
session["target_url"] = "/example_page.html"   # sets keyname to current page

2接下来,继续正常登录用户。

3 Google将用户重定向到您的身份验证重定向网址后,从会话中检索目标网址:

target_url = session['target_url']

4最后,将用户重定向到此URL。

简而言之,只要您首先接受从Google重定向到单个已建立的重定向网址,您就可以实现将用户重定向到任何目标网址的目标。

会话示例来自Beaker网站。此外,Nick Johnson's Webapps on Appengine Part 5博客文章深入了解与Beaker的会话。