【问题标题】:Google App Engine : SimpleAuth : Redirect Url On the FlyGoogle App Engine:SimpleAuth:即时重定向网址
【发布时间】:2012-06-02 00:21:06
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    从 SimpleAuth 的示例应用程序代码开始,您基本上需要更改 last line of _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 module

    【讨论】:

    • 感谢 Alex,我确实在使用 webapp2,在看到 mort 的示例后,我确实将它保存在 webapp2 会话中,而不是另一个会话库中。谢谢你的好例子!
    【解决方案2】:

    当您的用户尝试登录时,您的应用首先请求访问令牌,然后构建 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's Webapps on Appengine Part 5 博客文章深入探讨了与 Beaker 的会话。

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 2013-11-14
      • 1970-01-01
      • 2012-05-21
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多