GAE,oauth2和管理员用户

时间:2015-08-25 13:31:19

标签: python google-app-engine oauth-2.0 google-oauth

我目前使用“Google Accounts API”来允许用户登录我的GAE应用。因此,我使用users.create_login_urlusers.get_current_user并向我自己的用户实体添加ndb.UserProperty,以便我可以检索该用户的数据。

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

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

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

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

  2. 为管理员用户存储oauth2凭据列表(在代码或数据存储中硬连线),以便在使用oauth2登录后识别管理员用户。

  3. 有没有更好的方法或者我应该使用上述之一,如果有,哪一个?

1 个答案:

答案 0 :(得分:1)

我将描述我最终是如何做的,以防其他人有所帮助。

下面是我的Login处理程序。如果用户进入" / login"然后它显示登录按钮。当用户点击按钮时,该页面重定向到例如" / login / google"做OAuth2处理。

如果我想以管理员身份登录,那么我手动输入此网址" / 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 %}