我的Google Chrome扩展程序包含外部用户系统(用户名/电子邮件/ sessionId),人们可以使用自己选择的凭据(通过SSL)登录。我想将此更改为使用Google OpenID登录,如下所示:
checkid_immediate
*登录请求:
checkid_immediate
登录失败:
checkid_setup
**登录(以及电子邮件提取)的指定参数。checkid_immediate
成功并返回OpenID身份:
sessionId
。据我了解x-has-session
将允许我获取当前登录用户的OpenID(如果他们之前允许我的服务使用他们的登录),但响应总是{{1} }。
使用我自己的帐户进行测试我可以使用新的标签openid_mode=setup_needed
方法进行授权,然后从checkid_setup
XmlHttpRequest获得成功的响应。 但是,只有在我从checkid_immediate
和openid.claimed_id
参数中插入我从Google获取的OpenID时才可以这样做。
无论openid.identity
和openid.identity
参数如何,请求都是成功的。
我是否完全误解了我可以用openid.ui.mode
做什么?
如果是,是从我的扩展程序执行x-has-session
请求的唯一方法(不在新标签中打开),通过我在运行{{1}时获得的OpenID标识符来执行此操作请求?
* checkid_immediate
请求参数(使用XMLHttpRequest作为POST请求发送):
checkid_setup
在checkid_immediate
网址,我所做的只是回复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"
};
(仅限GET / POST变量,不包含Cookie),这是我的XmlHttpRequest中的响应。
* openid.return_to
请求参数(在新标签页中打开):
json_encode($_REQUEST)
答案 0 :(得分:3)
好的,所以我终于弄清楚为什么我的测试表现得很奇怪(为什么x-has-session
似乎没有做任何事情):如果您使用multipe帐户登录(情况就是如此) me)Google OpenID登录的工作方式略有不同。
让我们来看看差异(这些结果是通过我自己的测试获得的,因此它们可能不是100%准确 - 他们也假设没有其他任何因素会触发Google的setup_needed
响应,例如切换{{ 1}}):
1:立即请求未指定OpenID且未指定openid.realm
:
x-has-session
。openid_mode=setup_needed
,否则为openid_mode=id_res
。openid_mode=setup_needed
。 2:立即请求未指定OpenID,但指定openid_mode=setup_needed
:
x-has-session
并忽略openid_mode=id_res
,否则x-has-session
和openid_mode=setup_needed
响应。openid_ext1_mode=x-has-session
。 3:立即请求指定OpenID而不指定openid_mode=setup_needed
:
4:立即请求指定OpenID和x-has-session
:
换句话说:
x-has-session
的即时模式可以告诉您Google用户是否已登录,或者如果用户已批准服务,则无论是否指定其OpenID x-has-session
不适用。