Djangae AppEngine与IAP行为不端

时间:2018-01-19 09:11:58

标签: django google-app-engine datastore google-iam google-iap

我用来处理用户登录和管理员登录的代码:

    # if not logged in, divert to login page
    if users.get_current_user() is None:
        return redirect('whoami')
    # if logged in, Check if user is an admin
    elif not users.is_current_user_admin():
        return render(request, 'template.html', {'heading': 'Bad Request (400)',
                                                 'message': ['You are not logged in as administrator'],
                                                 'user_email': users.get_current_user().email()})

当我使用Djangae appengine with Datastore (Django with datastore support)后端时,一切正常,但是当我启用Google Identity Aware Protocol (Google IAP)时,一切都开始失败。当我检查日志时,它表示字段email_lower上的djangae_gaedatastoreuser中存在IntegrityError

IntegrityError: Unique constraint violation for kind djangae_gaedatastoreuser on fields: email_lower

Integrity Error 数据存储类型在email_lower字段中有两个空条目。 email_lower

即使google.appengine.api.users模块开始行为不端。在第一次尝试登录时,我可以正常登录AppEngine,但我无法以谷歌帐户用户身份登出引擎,我发现我已经退出了我的Google帐户(这很棒但是)。当我尝试登录时,我发现登录时无需身份验证(Google登录)。

当我从其他浏览器实例登录时,显示

DatabaseError: save with update_fields did not affect any rows.

Database Error

有人可以解释为什么会这样,以及我必须采取哪些措施来避免这种情况。

1 个答案:

答案 0 :(得分:0)

问题在于IAP登录cookie,我做了一些调查,发现谷歌为我们提供了一个清除该cookie的网址。 您只需在从Google帐户退出后点击该网址即可:

The URL: your_appenine_url/_gcp_iap/clear_login_cookie

总结一下,

#Get current user
user = users.get_current_user()
# If user has logged in, send him to google logout URL
# redirect to clear IAP login cookie after google account logout
if user:
    logout_url = users.create_logout_url('/_gcp_iap/clear_login_cookie')
    request.session.clear()
    return redirect(logout_url)