Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将用户从Google App Engine迁移到Google OpenID_Python_Django_Google App Engine_Openid - Fatal编程技术网

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

Python 将用户从Google App Engine迁移到Google OpenID,python,django,google-app-engine,openid,Python,Django,Google App Engine,Openid,几个月前,我离开了谷歌应用引擎。但我仍然依赖它进行身份验证,因为我的用户是通过GAE上的user_id属性来识别的 为此,我的(现在是外部)应用程序使用加密、签名和时间戳的登录请求将用户重定向到Google App Engine应用程序。然后,GAE应用程序使用GAE的“用户”服务执行登录。成功登录GAE后,用户再次使用加密、签名和时间戳响应重定向到我的外部应用程序。 可以找到并找到基本的实现。正如您所看到的,这是非常基本的,并且依赖于严重的加密,这会导致糟糕的性能 我的外部应用程序(在本例中是

几个月前,我离开了谷歌应用引擎。但我仍然依赖它进行身份验证,因为我的用户是通过GAE上的user_id属性来识别的

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

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

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

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

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

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


提前谢谢

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

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

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


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


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

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

    为什么不尝试一种混合方法:

  • 切换到OpenId
  • 如果您的应用程序已经知道用户ID,那么就完成了
  • 如果没有,请询问用户是否有要迁移的帐户
  • 如果是,请使用旧的mechansim让他登录并转移帐户
  • 如果没有,请创建一个新帐户

  • 谢谢你的回复。问题是,用户可能同时更改了他的电子邮件地址,例如从非gmail地址更改为gmail地址,或更改为另一个非gmail地址。我以前经历过这种情况,必须手动为用户提供一种方法来联系我,并重新链接他们的旧帐户和相关数据。用户id是一个永远不会改变的静态标识符,我真的很想确保没有人落后。谢谢。是的,但如何将现有用户与其帐户进行匹配。关键是电子邮件地址或昵称不是唯一的和静态的。我的用户群中有近15%使用的是非gmail/googlemail.com地址,这些地址随时可能发生变化。我目前使用用户id作为识别用户身份的单一因素,但保留电子邮件和昵称用于信息和联系目的。有两种可能的方法。首先,你只需将他们在你的系统上的帐户与他们第一次登录的谷歌帐户相关联。两个(更安全)在过渡期间,您首先使用当前方法对用户进行身份验证,然后再次使用OpenID方法进行身份验证。另一件需要添加/澄清的事情是:在开始过渡之前,您应该为用户生成自己的唯一标识符,并且除了验证基于OpenID的身份验证之外,不依赖Google标识符进行任何其他验证展望未来,由于电子邮件标识符问题,一个无法可靠工作。在两者之间更改电子邮件地址意味着与“我的服务”上的数据的连接丢失。两个可能是目前唯一的选择,尽管我更喜欢没有实际过渡期的解决方案。是的,当然,一旦用户帐户是真正的Django帐户,它们将通过用户名和/或电子邮件地址进行标识。OpenID的存在只是为了方便。再次感谢,但我仍然对其他想法感兴趣。谢谢你的回答,但正如我现在在其他评论中指出的:我真的希望避免过渡阶段、迁移期或类似的事情。我还想确保没有一个人落在后面。(我知道您的解决方案很好,但其他人可能不会。)我应该补充的一点是,即使我将user_id存储在Django auth_user表的password字段中,user_id也没有加密或散列。如果有一个API可以将它们转换为OpenID标识符或类似的东西,我可以很容易地迁移。@mback2k什么