自定义PHP应用程序中的OpenID实现

自定义PHP应用程序中的OpenID实现,php,authentication,openid,Php,Authentication,Openid,我被赋予了一项任务,在我们的定制php web应用程序中实现“通过Google Apps帐户进行用户身份验证”。用户应该能够直接登录,或使用谷歌帐户 我正在尝试使用openID来实现这一点。我已经阅读了有关openID的内容,并发现以下内容: 在现有用户表中,我们将添加另一个字段“openid\u identity”。登录时,我们会将谷歌登录名和密码发送到谷歌,并得到回复。从响应中,我们将获得用户的身份,然后通过将其和数据库中的身份进行匹配,我们可以获得用户的详细信息 有一件事还不清楚: 在我们

我被赋予了一项任务,在我们的定制php web应用程序中实现“通过Google Apps帐户进行用户身份验证”。用户应该能够直接登录,或使用谷歌帐户

我正在尝试使用openID来实现这一点。我已经阅读了有关openID的内容,并发现以下内容:

在现有用户表中,我们将添加另一个字段“openid\u identity”。登录时,我们会将谷歌登录名和密码发送到谷歌,并得到回复。从响应中,我们将获得用户的身份,然后通过将其和数据库中的身份进行匹配,我们可以获得用户的详细信息

有一件事还不清楚:

在我们的应用程序中,管理员可以创建用户。然后,用户可以使用电子邮件登录(如john@myapp.com)和密码


最初,在使用Google登录之前,我们用户的表“openid_identity”字段将为空。我们如何处理OpenID首次登录?我们向用户展示什么?“谷歌注册”页面?如果用户注册他们的谷歌邮件(比如'john@gmail.com“),我们如何从users表中知道他是哪个用户?

我建议实现另一个表来处理外部登录方法,而不是在当前users表中添加字段。这种“一对多”的关系将有助于使您的应用程序更加灵活:有一天您可能会被要求添加对Twitter、Github和Facebook登录的支持

我猜您正计划修改您的登录表单以呈现不同的登录方法,比如经典的登录表单和“使用谷歌登录”按钮

然后我认为您应该计划这种情况:当用户使用Google进行身份验证时,Google Api将返回用户的电子邮件,您将检查外部登录表以查看记录是否已经存在

如果没有记录,您可以像往常一样启动用户订阅过程,但您可以使用从谷歌获得的信息预填充用户数据。您将在外部登录表和common users表中保存记录,以保持它们的相关性

<>如果记录已经在那里,那么你会认为用户是被授权的。您必须稍微调整一下当前的身份验证过程

谈到灵活性,最终在编写代码时,您可以考虑允许每个用户使用多个帐户和多个外部服务进行身份验证


我也会考虑使用这个作曲家包来处理谷歌的API(Apple)/P>,我猜想,当使用ADMIKOK创建时,你将无法实现OpenID。谢谢有一件事:在实施谷歌登录之前,我们的“用户”表中有3个用户,其中包括电子邮件:john@myapp.com, sid@myapp.com及reese@myapp.com. 然后我们用google实现了登录。现在约翰想用他的谷歌账号登录。首先,我们需要为John实现订阅过程,因为“externallogin”表是空的。比如说,约翰用他的谷歌邮箱订阅trueman@gmail.com. 然后,在这里,我们将在“externallogin”表中添加记录。但在现有的“用户”表中,我们将向谁附加此记录?约翰、希德或里斯?你能为这件事提出一些解决方案吗?这对我来说太紧急了。你这里的问题是你没有为身份验证过程写一个策略。我的意思是,在每种情况下,你希望发生什么?例如:如果您想将外部登录与当前用户匹配,那么您唯一的选择是只允许已登录的用户进行第一次Google身份验证,以便您可以绑定trueman@gmail.com到john@myapp.com. 从那一刻起,他可以作为john@myapp.com(传统方式)或作为trueman@gmail.com(谷歌认证)