0

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

    # 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)一切都开始失败。当我检查日志时,它说djangae_gaedatastoreuser字段 email_lower中有一个 IntegrityError

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

完整性错误email_lower数据存储类型在字段 中有两个空条目。email_lower

甚至google.appengine.api.users模块也开始出现异常。在第一次尝试登录时,我可以正常登录 AppEngine,但我无法以 google 帐户用户的身份注销 appengine,我看到我已经注销了我的 Google 帐户(这很好但是)。当我尝试登录时,我看到登录(谷歌登录)不需要身份验证。

当我从另一个浏览器实例登录时,它显示

DatabaseError: save with update_fields did not affect any rows.

数据库错误

有人可以解释为什么会发生这种情况以及我必须做些什么来避免这种情况。

4

1 回答 1

0

问题出在 IAP 登录 cookie 上,我做了一些研究,发现谷歌为我们提供了一个 url 来清除该 cookie。从您的 google 帐户注销后,您只需点击 URL:

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)
于 2018-01-19T11:00:12.567 回答