7

几个月前,我离开了 Google App Engine。但我仍然依赖它进行身份验证,因为我的用户是由他们在 GAE 上的 user_id 属性标识的。

为此,我的(现在是外部的)应用程序使用加密、签名和时间戳的登录请求将用户重定向到 Google App Engine 应用程序。然后,GAE 应用程序使用 GAE 的“用户”服务执行登录。在 GAE 上成功登录后,用户再次使用加密、签名和时间戳响应重定向到我的外部应用程序。可以在此处此处找到基本实现。如您所见,这是非常基本的,并且依赖于导致性能不佳的大量加密。

我的外部应用程序(在本例中为 Django 应用程序)将 user_id 存储在用户表的密码字段中。除了 user_id,我只从 GAE 获取电子邮件地址以在 Django 中存储用户名和电子邮件。

现在我想删除对 GAE 服务的依赖。想到的第一种方法可能是向每个用户发送一封电子邮件,要求他设置新密码,然后使用 Django 执行我自己的身份验证。

我更喜欢依赖谷歌的 OpenID 服务的解决方案,这样对用户来说实际上没有区别。这也是首选,因为无论如何我都需要将用户发送到 Google 以获取 Google Calendar API 的 AuthSub 令牌。

问题是我找不到在不使用 GAE 的情况下获取给定 Google 帐户的 GAE user_id 属性的方法。OpenID 和所有其他身份验证协议使用不同的标识符。

所以现在的问题是:Google 是否提供了任何我尚未看到的可用于此目的的 API?关于如何迁移用户帐户,还有其他可能的解决方案或想法吗?

提前致谢!

4

4 回答 4

2

最好的方法是向用户显示“迁移”插页式广告,将他们重定向到 Google OpenID 提供商并提示他们在那里登录。一旦他们在两个位置登录,您就可以匹配这两个帐户,并让他们将来通过 OpenID 登录。

于 2012-04-05T05:58:50.797 回答
1

AFAIK,Google 帐户和 Google OpenID 之间唯一的通用标识符是电子邮件。

  1. 当用户通过您当前的 gae 设置登录 Google 帐户时收到电子邮件。使用User.email(). 将此电子邮件与用户数据一起保存。

  2. 当您拥有所有(大多数)用户的电子邮件时,切换到 Google OpenID。当用户登录时,获取电子邮件地址并在数据库中找到该用户。

于 2012-04-04T13:37:58.390 回答
1

为什么不尝试混合方法:

  1. 切换到 OpenId
  2. 如果您的应用程序已经知道 userId,那么您就完成了
  3. 如果不询问用户,他是否有要迁移的帐户
  4. 如果是,请用旧的 mechansim 登录他并转移帐户
  5. 如果没有创建一个新帐户
于 2012-04-25T20:30:59.497 回答
0

Google 有一个唯一标识符,它作为成功的 OpenID 身份验证请求的参数返回 - *openid.claimed_id* 。如果您切换到使用 OpenID,您实际上可以在用户第一次使用新方法登录时将 user_id 交换为此参数,而用户不会注意到他们的登录体验有任何不同。

此处概述了身份验证过程的文档。我建议使用混合 OpenID+OAuth 方法,这样您就可以将您的请求令牌与给定的 id 相关联,然后在返回时验证 openid.claimed_id 是否与您的原始请求令牌匹配。

于 2012-04-04T19:07:24.193 回答