4

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

4

2 回答 2

5

如果您使用的是 SimpleAuth,我假设您可能使用的是 webapp2,所以 @jmort253 的示例并不完全符合我的要求(例如 webapp2 具有内置会话,那么为什么还要使用另一个库来处理会话)。

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

从 SimpleAuth 的示例应用程序代码开始,您基本上需要更改的是_on_signin() 的最后一行,以将用户重定向到他们来自的原始 URL(而不是 '/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 模块

于 2012-06-02T16:46:53.670 回答
1

当您的用户尝试登录时,您的应用首先请求访问令牌,然后构建 Google OAuth2 URL。您的应用会将用户重定向到您的用户必须登录的 google.com。此登录 URL 包含来自您的服务器对 Google 的请求的访问令牌。出于安全目的,它与该重定向 URL 相关联。

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

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

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

重定向用户的步骤:

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

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

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

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

target_url = session['target_url']

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

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

会话示例来自Beaker网站。此外,Nick Johnson 的 Webapps on Appengine 第 5 部分博客文章深入探讨了与 Beaker 的会话。

于 2012-06-02T00:51:31.490 回答