我在我的 GAE 应用程序中使用 Alex (https://github.com/crhym3/simpleauth) 的 SimpleAuth。我的基本模板中有一个 Jquery Powered Login 框,这意味着用户可以从应用程序内的任何 url 登录。我希望将用户重定向回他们请求登录的页面。有什么方法可以使用 Oauth2 实现这一点,或者我们可以只将用户重定向回特定的 url 吗?
2 回答
如果您使用的是 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”(如果他们成功通过身份验证)
当您的用户尝试登录时,您的应用首先请求访问令牌,然后构建 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 的会话。