python - 在 Django 中登录 Google 应用程序

标签 python django google-apps django-openid-auth

我正在开发一个与谷歌应用程序集成的 Django 应用程序。我想让用户使用他们的 google apps 帐户登录(google 托管域中的帐户,不是 google 帐户),这样他们就可以访问他们的文档、日历等等。

为了做到这一点,我下载并开始使用 django_openid_auth(因此,python-openid)。

首先,为了测试它,我在我的设置中使用了这个 url:

OPENID_SSO_SERVER_URL = 'https://www.google.com/accounts/o8/id'

然后我设法将用户重定向到 google 帐户页面进行登录,然后返回到我自己的域,使用 authentication cycle谷歌人描述的成功完成。但是,登录谷歌帐户对我来说没什么用,因为我希望在其托管域中拥有谷歌应用程序帐户但没有谷歌帐户的用户可以登录。 为此,我阅读了关于发现的谷歌文章“发现托管域的 OpenID 端点”,并将上述设置更改为:

OPENID_SSO_SERVER_URL = 'https://www.google.com/accounts/o8/site-xrds?hd=<my-domain>.com'

-显然,<my-domain>是我的实际域名 ;)

但是后端响应如下消息:

OpenID authentication failed: HTTP Response status from identity URL host is not 200. Got status 404

稍微调试一下,我设法发现 python-openid(版本 2.2.4)中的代码是错误解释来自 google 的响应的代码,但我在这里很茫然。

我已经在 socialwok.com 和 puffypoodles.com 上看到我自己的域中的身份验证工作所以我很确定我的谷歌应用程序域的身份验证周期有效,但不知何故 python-openid 似乎无法完成它(不过,我重申,它适用于普通的旧 Google 帐户)。

我应该尝试修复 python-openid,还是有其他方法可以解决这个问题?有没有人成功地在纯 django 应用程序中使用谷歌应用程序登录(不在谷歌应用程序引擎中)?

最佳答案

根据 http://groups.google.com/group/google-federated-login-api/web/openid-discovery-for-hosted-domains , Google 稍微改变了 IdP Discovery 和用户 XRDS 检查的方式,以在 http://example.com/openid?id=108441225163454056756 中为 Google Apps 用户提供 openid一种格式,无需用户构建自己的 openid 服务器。对于小型公司,如果他们使用 Google Apps,人们只需一个域名就可以在他们的域下获得他们的 openid。

这可能是一个很好的方法,因为人们可以使用他们的 Google Apps 帐户进行身份验证,并且他们仍然可以在他们自己的域下提供 openids,他们可以在将来更改身份验证后端。它简单且可扩展,但遗憾的是它还没有成为标准。所以,如果你使用像 python-openid 这样的标准库,你会遇到一些问题。

要解决这些问题,您必须自己修补 python-openid 以遵循 Google 的方法。

我之前遇到过同样的问题,我有一个适合我的 python-openid v2.1.1 补丁版本。

如果您需要,我可以在清理后发布我的代码。这是一个快速补丁,所以不要期望太多:)

关于python - 在 Django 中登录 Google 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2313573/

相关文章:

python - 将我的 GUI 的内容保存为 jpg fromat wxpython

django - 我是否需要显式记录 Sentry 在 Django 中工作的消息

Python2 与 Python3 post 请求

python - 将 Django 用户与 Google Apps 同步,无需使用 Monkeypatching

google-apps-script - 在 Chrome 商店中发布电子表格插件

python - 在动态创建的模型上使用 Django 的内存缓存 API

python - 防止在 python 异步 http 请求中下载响应主体

c++ - Python 嵌入在 c 中。调用 PyRun_SimpleString 是同步的吗?

Django 使用多个redis进行缓存

google-play - 如何将电子邮件组添加到 Google Play 商店 Alpha/Beta 测试