谷歌OpenID登录-x-has-session如何工作?
我有一个带有外部用户系统(username/email/sessionId)的Google Chrome扩展,人们可以使用自己选择的凭据(通过SSL)登录。我想将此更改为使用Google OpenID登录,如下所示:谷歌OpenID登录-x-has-session如何工作?,openid,google-openid,Openid,Google Openid,我有一个带有外部用户系统(username/email/sessionId)的Google Chrome扩展,人们可以使用自己选择的凭据(通过SSL)登录。我想将此更改为使用Google OpenID登录,如下所示: 用户单击“通过谷歌登录”: 分机执行一个checkid\u立即*登录请求: 如果checkid\u immediate登录失败: 扩展将打开一个新选项卡,其中包含checkid\u设置的指定参数**登录(和电子邮件获取) 用户选择帐户并批准我的服务 在我的返回页面上,我将Open
checkid\u立即
*登录请求:
- 如果
登录失败:checkid\u immediate
- 扩展将打开一个新选项卡,其中包含
**登录(和电子邮件获取)checkid\u设置的指定参数
- 用户选择帐户并批准我的服务
- 在我的返回页面上,我将OpenID标识和电子邮件保存在我的数据库中
- 我通过Javascript关闭选项卡
checkid\u immediate
成功并返回OpenID标识:
sessionId
x-has-session
将允许我获取当前登录用户的OpenID(如果他们以前允许我的服务使用他们的登录名),但响应总是OpenID\u mode=setup\u needed
使用我自己的帐户进行测试,我可以授权使用新的选项卡checkid\u setup
方法,然后从checkid\u immediate
XmlHttpRequest获得成功响应但是,只有当我在OpenID.id
和OpenID.identity
参数中插入从谷歌获得的OpenID时,这才是可能的。
无论openid.identity
和openid.ui.mode
参数如何,请求都将成功
我是否完全误解了我可以用x-has-session
做什么
如果是,是否只有通过运行checkid\u设置时获得的OpenID标识符,才能从我的分机执行我的checkid\u immediate
请求(无需在新选项卡中打开它)
*checkid\u immediate
请求参数(使用XMLHttpRequest作为POST请求发送):
在openid.return\u to
URL,我所做的就是echojson\u encode($\u请求)
(仅获取/POST变量,不包括cookies),它作为我的XmlHttpRequest中的响应获取
*checkid\u设置
请求参数(在新选项卡中打开):
好了,我终于弄明白了为什么我的测试一直很奇怪(为什么x-has-session看起来好像什么都没做):如果你使用多个帐户登录(我就是这样),Google OpenID登录的工作方式会有点不同
让我们来看看这些差异(这些结果是通过我自己的测试获得的,因此它们可能不是100%准确的-它们还假设没有其他任何东西会触发谷歌所需的设置
响应,例如切换openid.realm
):
1:未指定OpenID且未指定x-has-session的即时请求
:
- 未登录:谷歌在响应中指定参数
openid\u mode=setup\u needed
- 单一会话:如果用户已批准该服务,谷歌将在响应中指定参数
openid\u mode=id\u res
否则openid\u mode=setup\u needed
- 多个会话:Google在响应中指定参数
openid\u mode=setup\u needed
,无论是否批准该服务
2:即时请求不指定OpenID,而是指定x-has-session
:
- 未登录:与1相同(未登录)
- 单一会话:如果用户已批准该服务,谷歌将在响应中指定参数
openid\u mode=id\u res
并忽略x-has-session
否则openid\u mode=setup\u needed
和openid\u ext1\u mode=x-has-session
- 多个会话:Google在响应中指定参数
openid\u mode=setup\u needed
,无论是否批准该服务
3:指定OpenID而不指定x-has-session的即时请求
:
- 未登录:与1相同(未登录)
- 单个会话:与1(单个会话)相同
- 多个会话:与单个会话相同
4:指定OpenID和x-has-session的即时请求
:
- 未登录:与1相同(未登录)
- 单个会话:与2(单个会话)相同
- 多个会话:与单个会话相同
换言之:
- 如果使用单会话,使用
x-has-session
的即时模式可以告诉您是否有Google用户登录,或者如果用户已经批准了服务,则返回成功响应,而不管是否指定了他们的OpenID
- 如果使用多个会话并指定OpenID,则行为与单个会话相同
- 如果在未指定OpenID的情况下使用多个会话,则立即模式始终返回故障响应,
x-has-session
不适用
var endpoint = "https://www.google.com/accounts/o8/ud";
var openIdParameters = {
"openid.ns": "http://specs.openid.net/auth/2.0",
"openid.mode": "checkid_immediate",
"openid.return_to": "http://example.com/googleAuth.php",
"openid.realm": "http://example.com",
"openid.claimed_id": "http://specs.openid.net/auth/2.0/identifier_select",
"openid.identity": "http://specs.openid.net/auth/2.0/identifier_select",
"openid.ns.ui": "http://specs.openid.net/extensions/ui/1.0",
"openid.ui.mode": "x-has-session"
};
var endpoint = "https://www.google.com/accounts/o8/ud";
var openIdParameters = {
"openid.ns": "http://specs.openid.net/auth/2.0",
"openid.mode": "checkid_setup",
"openid.return_to": "http://example.com/googleAuth.php",
"openid.realm": "http://example.com",
"openid.claimed_id": "http://specs.openid.net/auth/2.0/identifier_select",
"openid.identity": "http://specs.openid.net/auth/2.0/identifier_select",
"openid.ns.ax": "http://openid.net/srv/ax/1.0",
"openid.ax.mode": "fetch_request",
"openid.ax.required": "email",
"openid.ax.type.email": "http://axschema.org/contact/email"
};