为什么我的OpenID应用程序从同一用户的不同客户端计算机接收不同的Google OpenID?

And*_*wan 5 openid authentication spring-security

我正在使用Spring Security 2.0.5将OpenID登录添加到一个小型Web应用程序中.我希望能够根据他们登录的OpenID标识符识别我的应用程序中的用户.这在使用Verisign作为提供者时工作正常; 每个标识符都是一个特定于用户的URI,如http://jbloggs.pip.verisignlabs.com/,可以在我的用户数据库中轻松查找"Joe Bloggs".

但是,当用户输入标准Google OpenID标识符(www.google.com/accounts/o8/id)时,Google会在成功进行身份验证后发送标识符(例如https://www.google.com/accounts/o8/id ?id = AItOawnKrvwaGk9YU0q9STQGj9G7XIRlNmsjuiI)因机器而异,因同一用户而异.这使得通过在我的用户数据库中查找其标识符来识别该用户是不可能的(或至少是不切实际的).

如何让Google始终为同一个Google用户发送相同的标识符?

FWIW,该应用程序在JBoss 3.2.7中运行,带有嵌入式Tomcat 5.0.28.

And*_*ott 10

Google使用OpenID的一项称为定向身份的功能,这意味着Google为每个用户登录的RP(OpenID接受网站)构成了一个新的,唯一且不可更新的标识符.这不是一个选择 - 这是谷歌工作的唯一方式.Google在RP之间识别的关键是openid.realm参数,因此只要它相同,您就会为用户获得相同的标识符.但是,如果你改变了这个领域,那么所有用户的身份都会丢失,因为谷歌会为你现有的用户发送一个新的标识符网站.

你能为这个做什么?两种选择:

  1. 保持openid.realm不变,这样标识符就不会改变
  2. 当提供商是Google时,使用AX"要求"用户的电子邮件地址,然后您可以根据电子邮件地址对Google标识符进行关联.(但棘手的是:在openid和电子邮件标识符之间玩杂耍时有很多安全后果).

  • 点#1为我解决了它.当我从服务器测试我的应用程序时,我使用了URL http:// localhost/myapp,但是从第二台机器上我使用了http:// server_name/my app.我没有意识到的是,Google会将此视为两个不同的领域,因此会为同一个Google用户返回不同的身份.当我将我的应用程序切换为使用SSL时,由于SSL证书,我不得不在URL中使用"server_name"甚至来自服务器本身,然后当它开始工作时我错误地认为它归功于SSL,而不是因为使用了SSL两台机器的主机名相同.谢谢你的帮助! (2认同)