首页 > 解决方案 > Djangae Gauth 集成

问题描述

我正在关注 Djangae 文档的“Gauth 身份验证”部分,但遇到了一些意外行为。

我已经按照文档的规定配置了 urls.py 和 settings.py(当前设置主要是使用 Djangae Scaffold 的结果),但在任何时候都不会提示用户使用或链接他们的 Google 帐户进行身份验证。我试过取消/设置DJANGAE_CREATE_UNKNOWN_USER,但这没有影响。

我还尝试在我的本地 shell 中运行受 sitepackages/prod/djangae/contrib/gauth/tests.py 启发的命令,以验证后端配置是否正确配置,并且用户实际上可以通过 AppEngineUserAPIBackend 进行身份验证,但是失败是因为我的用户模型 (djangae.contrib.gauth_datastore.models.GaeDatastoreUser) 似乎缺少必需的属性:AttributeError: 'GaeDatastoreUser' object has no attribute 'user_id'.

那么,我是否误解了这一切应该如何工作并且必须采取一些额外的步骤才能让 Google 登录正常工作?还是我(可能)错误地配置了我的应用程序?(我很高兴包含我的配置的通用版本,但正如我所说,它们直接来自 Djangae Scaffold 或文档。)

更新:有趣的是,如果我--headless从我的行为套件配置中删除标志,我会看到预期的行为。浏览器 (Chrome) 被重定向到https://accounts.google.com/Login?continue=http%3A%2F%2Flocalhost%3A8080%2F

环境:

江门 (0.9.11)

姜戈 (1.11.19)

标签: djangogoogle-authenticationdjangae

解决方案


事实证明,这是预期的行为。在本地沙箱中,系统会提示用户输入电子邮件地址,并且(默认情况下)为他们创建一个“用户”并自动登录。

来自 App Engine 的“用户 Python API 概述”文档:

Google 帐户和开发服务器

开发服务器使用虚拟登录屏幕模拟 Google 帐户系统。当您的应用程序调用用户 API 以获取登录屏幕的 URL 时,API 会返回一个特殊的开发服务器 URL,该 URL 会提示您输入电子邮件地址,但没有密码。您可以在此提示中键入任何电子邮件地址,该应用程序的行为就像您使用具有该地址的帐户登录一样。

虚拟登录屏幕还包括一个复选框,指示虚拟帐户是否为管理员;也就是说,帐户是否具有 Viewer、Editor 或 Owner 原始角色,或 App Engine App Admin 预定义角色。如果您选中此框,该应用程序的行为就像您使用管理员帐户登录一样。

同样,用户 API 返回一个注销 URL,该 URL 取消了虚拟登录。

开发服务器中用户对象的唯一 ID 是根据电子邮件地址计算得出的。两个唯一的电子邮件地址始终代表开发服务器中的两个唯一用户。

就个人而言,我认为这种设计是非常有缺陷的。我不知道 Google 对 Twelve Factor 宣言有何看法,但这种行为公然违反了第 10 条(Dev/Prod Parity),该条被概括为“保持开发、分期和生产尽可能相似”。我看不出为什么完整的身份验证/重定向流程在本地沙箱中不起作用,至少,用户应该能够选择加入它。(我很想知道这是一个选项。)

关于这种条件行为最令人担忧的部分是用户对象的 API 不同,这就是为什么我看到我的问题中提到的错误('GaeDatastoreUser' 对象没有属性'user_id')。本地用户也没有nickname办法。


推荐阅读