GAE、oauth2 和管理员用户

GAE, oauth2, and admin users

我目前使用 "Google Accounts API" 允许用户登录我的 GAE 应用程序。所以我使用 users.create_login_urlusers.get_current_user 并将 ndb.UserProperty 添加到我自己的用户实体,以便我可以检索该用户的数据。

我现在正在切换到 oauth2(使用自动)。

我不知道切换到oauth2后如何处理管理员用户。我目前使用 users.is_current_user_admin 来检测管理员用户,但如果管理员使用 oauth2 登录,那将不起作用。

我看到两个尴尬的解决方案:

  1. 管理员用户继续使用 Google 帐户 API,并让普通用户使用 oauth2 登录。

  2. 存储管理员用户的 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 %}