GAE、oauth2 和管理员用户
GAE, oauth2, and admin users
我目前使用 "Google Accounts API" 允许用户登录我的 GAE 应用程序。所以我使用 users.create_login_url
和 users.get_current_user
并将 ndb.UserProperty
添加到我自己的用户实体,以便我可以检索该用户的数据。
我现在正在切换到 oauth2(使用自动)。
我不知道切换到oauth2后如何处理管理员用户。我目前使用 users.is_current_user_admin
来检测管理员用户,但如果管理员使用 oauth2 登录,那将不起作用。
我看到两个尴尬的解决方案:
管理员用户继续使用 Google 帐户 API,并让普通用户使用 oauth2 登录。
存储管理员用户的 oauth2 凭据列表(固定在代码或数据存储中),以便在使用 oauth2 登录后识别管理员用户。
是否有更好的方法,或者我应该使用上述方法之一,如果是,是哪一种?
我将描述我最终是如何做到的,以防对其他人有帮助。
下面是我的 Login
处理程序。如果用户转到“/login”,则会显示登录按钮。当用户单击按钮时,页面将重定向到例如“/login/google”以进行 OAuth2 处理。
如果我想以管理员身份登录,那么我手动输入这个URL“/login/gae”。
class Login(webapp2.RequestHandler):
def get(self, provider=None):
# Show the login page and allow the user to select a provider
if not provider:
template = JINJA_ENVIRONMENT.get_template("login.html")
self.response.write(template.render())
# Only for admin login. Use app engine login.
elif provider == "gae":
self.redirect(users.create_login_url("/"))
# The user has selected a provider so we do oauth2 login.
else:
session = Webapp2Session(self, session=self.session)
result = authomatic.login(Webapp2Adapter(self),
provider,
session=session,
session_saver=session.save)
...
为了允许管理员注销,我通过创建此模板变量有条件地将管理员注销放在我的网页上:
logout_url = users.create_logout_url("/") if users.is_current_user_admin() else None
并将其添加到我的页面模板中:
{% if logout_url %}
<li><a href="{{ logout_url }}">Admin Logout</a></li>
{% endif %}
我目前使用 "Google Accounts API" 允许用户登录我的 GAE 应用程序。所以我使用 users.create_login_url
和 users.get_current_user
并将 ndb.UserProperty
添加到我自己的用户实体,以便我可以检索该用户的数据。
我现在正在切换到 oauth2(使用自动)。
我不知道切换到oauth2后如何处理管理员用户。我目前使用 users.is_current_user_admin
来检测管理员用户,但如果管理员使用 oauth2 登录,那将不起作用。
我看到两个尴尬的解决方案:
管理员用户继续使用 Google 帐户 API,并让普通用户使用 oauth2 登录。
存储管理员用户的 oauth2 凭据列表(固定在代码或数据存储中),以便在使用 oauth2 登录后识别管理员用户。
是否有更好的方法,或者我应该使用上述方法之一,如果是,是哪一种?
我将描述我最终是如何做到的,以防对其他人有帮助。
下面是我的 Login
处理程序。如果用户转到“/login”,则会显示登录按钮。当用户单击按钮时,页面将重定向到例如“/login/google”以进行 OAuth2 处理。
如果我想以管理员身份登录,那么我手动输入这个URL“/login/gae”。
class Login(webapp2.RequestHandler):
def get(self, provider=None):
# Show the login page and allow the user to select a provider
if not provider:
template = JINJA_ENVIRONMENT.get_template("login.html")
self.response.write(template.render())
# Only for admin login. Use app engine login.
elif provider == "gae":
self.redirect(users.create_login_url("/"))
# The user has selected a provider so we do oauth2 login.
else:
session = Webapp2Session(self, session=self.session)
result = authomatic.login(Webapp2Adapter(self),
provider,
session=session,
session_saver=session.save)
...
为了允许管理员注销,我通过创建此模板变量有条件地将管理员注销放在我的网页上:
logout_url = users.create_logout_url("/") if users.is_current_user_admin() else None
并将其添加到我的页面模板中:
{% if logout_url %}
<li><a href="{{ logout_url }}">Admin Logout</a></li>
{% endif %}