将用户从Google App Engine迁移到Google OpenID

时间:2012-04-04 07:32:40

标签: python django google-app-engine openid

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

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

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

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

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

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

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

提前致谢!

4 个答案:

答案 0 :(得分:2)

执行此操作的最佳方法是向用户显示“迁移”内容,将其重定向到Google OpenID提供商并提示他们在那里登录。一旦他们在两个位置登录,您就可以匹配这两个帐户,并让他们将来通过OpenID登录。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

为什么不尝试混合方法:

  1. 切换到OpenId
  2. 如果您的应用已经知道userId,那么您就完成了
  3. 如果没有询问用户,他是否有要迁移的帐户
  4. 如果是,请使用旧的mechansim登录并转移帐户
  5. 如果没有创建新帐户

答案 3 :(得分:0)

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

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