几个月前我从Google App Engine迁移出来。 但我仍然依赖它进行身份验证,因为我的用户是通过GAE上的user_id属性来标识的。
为此,我(现在的外部)应用程序使用加密,签名和带时间戳的登录请求将用户重定向到Google App Engine应用程序。 然后,GAE应用程序使用GAE的“用户”服务执行登录。 成功登录GAE后,用户再次使用加密,签名和带时间戳的响应重定向到我的外部应用程序。 可以在这里和这里找到基本的实现。 正如您所看到的,这是非常基本的,并且依赖于导致性能不佳的严重加密。
我的外部应用程序(在本例中为Django应用程序)将user_id存储在用户表的密码字段中。 除了user_id之外,我只从GAE获得电子邮件地址,以便在Django中存储用户名和电子邮件。
现在我想删除对GAE服务的依赖。 想到的第一种方法可能是向每个用户发送一封电子邮件,要求他设置一个新密码,然后使用Django执行我自己的身份验证。
我更喜欢依赖Google的OpenID服务的解决方案,以便用户实际上没有任何区别。 这也是首选,因为无论如何我都需要将用户发送到Google以获取Google Calendar API的AuthSub令牌。
问题是我无法在不使用GAE的情况下找到获取给定Google帐户的GAE user_id属性的方法。 OpenID和所有其他身份验证协议使用不同的标识符。
所以现在问题是:谷歌是否提供了我可以用于此目的的任何API,我还没有看到? 有关如何迁移用户帐户的其他可能的解决方案或想法吗?
提前致谢!
最好的方法是向用户显示“迁移”插件,将其重定向到Google OpenID提供商并提示他们在那里登录。 一旦他们在两个位置登录,您就可以匹配这两个帐户,并让他们将来通过OpenID登录。
AFAIK是Google帐户和Google OpenID之间唯一的通用标识符。
当用户通过您当前的gae设置登录Google帐户时收到电子邮件。 使用User.email()
。 将此电子邮件与用户数据一起保存。
当您收到所有(大多数)用户的电子邮件时,请切换到Google OpenID。 用户登录时,获取电子邮件地址并在数据库中查找此用户。
你为什么不尝试混合方法:
Google有一个唯一标识符,该标识符作为参数返回,并带有成功的OpenID身份验证请求 - * openid.claimed_id *。 如果您切换到使用OpenID,则在用户首次使用新方法登录时,您实际上可以为此参数交换user_id,而用户不会注意到有关其登录体验的任何不同内容。
此处概述了身份验证过程的文档。 我建议使用混合OpenID + OAuth方法,以便您可以将请求令牌与给定ID相关联,然后在返回时验证openid.claimed_id是否与原始请求令牌匹配。