openid - Google OpenID 登录 - x-has-session 如何工作?

标签 openid google-openid

我有一个带有外部用户系统(用户名/电子邮件/ session ID)的 Google Chrome 扩展程序,人们可以使用自己选择的凭据(通过 SSL)登录。我想将其更改为使用 Google OpenID 登录,如下所示:

  1. 用户点击“通过 Google 登录”:
  2. 扩展程序执行 checkid_immediate * 登录请求:
    • 如果checkid_immediate登录失败:
      1. 扩展程序将打开一个新选项卡,其中包含 checkid_setup 的指定参数。 ** 登录(和电子邮件获取)。
      2. 用户选择帐户并批准我的服务。
      3. 在返回页面上,我将 OpenID 身份和电子邮件保存在数据库中。
      4. 我通过 Javascript 关闭该选项卡。
    • 其他checkid_immediate成功并返回 OpenID 身份:
      1. 我通过在数据库中查找 OpenID 身份来确定哪个用户。
  3. 我登录用户并设置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_neededopenid_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/

相关文章:

使用 google 进行 Django openid 身份验证

c# - 处理 Identity Server 客户端凭据流时发出自签名客户端证书

grails - grails spring security openId插件:无法使用Gmail帐户登录

python - Google 混合(openid + oauth)协议(protocol)不适用于 127.0.0.1

oauth-2.0 - 为访问 token 交换代码时 redirect_uri 参数的用途是什么

django - 哪个 django OpenID 库适用于新的 Google OpenID

google-oauth - Google OAuth2 API JWS 一致性

web-applications - 如何使 Web 应用程序中的注册用户友好?

ruby-on-rails - 使用 open_id_authentication 插件时,如何在 RSpec 用户故事/Cucumber 中伪造 OpenID 登录

authentication - 无状态 RESTful API 和 3rd 方身份验证