我正在跟踪Djangae文档的“ Gauth身份验证”部分,但遇到一些意外行为。
我已经按照文档中的说明配置了urls.py和settings.py(当前设置主要是使用Djangae Scaffold的结果),但没有提示用户使用或链接其Google帐户进行身份验证。我尝试取消/设置DJANGAE_CREATE_UNKNOWN_USER
,但这没有影响。
我还尝试在本地外壳程序中运行受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
环境:
Djangae(0.9.11)
Django(1.11.19)
答案 0 :(得分:0)
事实证明,这是预期的行为。在本地沙箱中,系统会提示用户输入电子邮件地址,并且(默认情况下)会为他们创建一个“用户”,并自动登录。
来自App Engine的“用户Python API概述”文档:
Google帐户和开发服务器
开发服务器使用以下命令模拟Google帐户系统 虚拟登录屏幕。当您的应用程序调用Users API来获取 登录屏幕的网址,API返回特殊的开发 提示输入电子邮件地址的服务器URL,但没有密码。您可以 在此提示中输入任何电子邮件地址,应用程序的行为就像 您使用具有该地址的帐户登录。
虚拟登录屏幕还包括一个复选框,指示 虚拟帐户是否是管理员;也就是说,是否 帐户具有“查看者”,“编辑者”或“所有者”原始角色,或 App Engine App Admin预定义角色。如果选中此框,则该应用 的行为就像您使用管理员帐户登录一样。
同样,Users API返回退出URL,该URL取消了虚拟对象 登录。
开发服务器中User对象的唯一ID为 根据电子邮件地址计算得出。始终有两个唯一的电子邮件地址 代表开发服务器中的两个唯一用户。
我个人认为此设计非常有缺陷。我不知道Google对“十二个因素”宣言的看法,但是这种行为是对第10条(Dev / Prod Parity)的公然违反,该条被概括为“尽可能保持开发,分段和生产”。我看不出为什么完整的身份验证/重定向流在本地沙箱中不起作用,并且至少,用户应该可以选择使用它。 (我会很乐意发现这是一个选择。)
关于此条件行为的最令人关注的部分是用户对象的API不同,这就是为什么我看到问题中提到的错误(“ GaeDatastoreUser”对象没有属性“ user_id”)的原因。本地用户也没有nickname
方法。