我有一个带有外部用户系统(用户名/电子邮件/sessionId)的 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 获得成功的响应。但是,只有当我在openid.claimed_id
和openid.identity
参数中插入从 Google 获得的 OpenID 时,这才有可能。
无论openid.identity
和openid.ui.mode
参数如何,请求都会成功。
我是否完全误解了我能做什么x-has-session
?
checkid_immediate
如果是,是否是通过我在运行请求时获得的 OpenID 标识符从我的扩展程序(而不在新选项卡中打开它)执行我的请求的唯一方法checkid_setup
?
*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 处,我所做的只是回显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"
};