我有一个带有外部用户系统(用户名/电子邮件/ session ID)的 Google Chrome 扩展程序,人们可以使用自己选择的凭据(通过 SSL)登录。我想将其更改为使用 Google OpenID 登录,如下所示:
- 用户点击“通过 Google 登录”:
- 扩展程序执行
checkid_immediate
* 登录请求:- 如果
checkid_immediate
登录失败:- 扩展程序将打开一个新选项卡,其中包含
checkid_setup
的指定参数。 ** 登录(和电子邮件获取)。 - 用户选择帐户并批准我的服务。
- 在返回页面上,我将 OpenID 身份和电子邮件保存在数据库中。
- 我通过 Javascript 关闭该选项卡。
- 扩展程序将打开一个新选项卡,其中包含
- 其他
checkid_immediate
成功并返回 OpenID 身份:- 我通过在数据库中查找 OpenID 身份来确定哪个用户。
- 如果
- 我登录用户并设置
sessionId
像往常一样。
据我了解x-has-session
将允许我获取当前登录用户的 OpenID(如果他们之前允许我的服务使用他们的登录名),但响应始终是 openid_mode=setup_needed
.
使用我自己的帐户进行测试,我可以使用新选项卡 checkid_setup
进行授权方法,然后从checkid_immediate
获得成功响应XmlHttpRequest。 但是,只有当我将从 Google 获得的 OpenID 插入 openid.claimed_id
时,这才可能实现。和openid.identity
参数。
无论openid.identity
如何,请求都会成功。和openid.ui.mode
参数。
我是否完全误解了我可以用 x-has-session
做什么? ?
如果是,这是执行我的 checkid_immediate
的唯一方法来 self 的扩展的请求(无需在新选项卡中打开它)通过我在运行 checkid_setup
时获得的 OpenID 标识符来完成此操作请求?
* checkid_immediate
请求参数(使用 XMLHttpRequest 作为 POST 请求发送):
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"
};
在 openid.return_to
URL 我所做的就是 echo json_encode($_REQUEST)
(仅 GET/POST 变量,不包括 cookie),它作为我的 XmlHttpRequest 中的响应获取。
* checkid_setup
请求参数(在新选项卡中打开):
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"
};
最佳答案
好吧,所以我终于弄清楚为什么我的测试表现得很奇怪(以及为什么 x-has-session
似乎没有做任何事情):如果您使用多个帐户登录(这对我来说就是这种情况) Google OpenID 登录的工作方式略有不同。
让我们看一下差异(这些结果是通过我自己的测试获得的,因此它们可能不是 100% 准确 - 他们还假设没有其他东西会触发来自 Google 的 setup_needed
响应,例如切换 openid.realm
) :
1: 未指定 OpenID 且未指定 x-has-session
的立即请求:
- 未登录:Google 指定参数
openid_mode=setup_needed
在回复中。 - 单个 session :如果用户已批准该服务,Google 会指定参数
openid_mode=id_res
否则openid_mode=setup_needed
在回复中。 - 多个 session :Google 指定参数
openid_mode=setup_needed
无论是否批准该服务,都会在响应中显示。
2:立即请求未指定 OpenID,但指定 x-has-session
:
- 未登录:与1相同(未登录)。
- 单个 session :如果用户已批准该服务,Google 会指定参数
openid_mode=id_res
并忽略x-has-session
否则openid_mode=setup_needed
和openid_ext1_mode=x-has-session
在回复中。 - 多个 session :Google 指定参数
openid_mode=setup_needed
无论是否批准该服务,都会在响应中显示。
3: 指定 OpenID 且未指定 x-has-session
的立即请求:
- 未登录:与1相同(未登录)。
- 单次 session :与1(单次 session )相同。
- 多个 session :与单个 session 相同。
4: 指定 OpenID 和 x-has-session
的立即请求:
- 未登录:与1相同(未登录)。
- 单次 session :与2(单次 session )相同。
- 多个 session :与单个 session 相同。
换句话说:
- 如果使用单 session ,立即模式使用
x-has-session
可以告诉您 Google 用户是否已登录,或者如果用户已经批准该服务,无论是否指定其 OpenID,都可以返回成功的响应。 - 如果使用多个 session 并指定 OpenID,则行为与单个 session 相同。
- 如果使用多个 session 未指定 OpenID,立即模式始终返回失败响应并
x-has-session
不适用。
关于openid - Google OpenID 登录 - x-has-session 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13724429/