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

时间:2012-12-05 13:32:40

标签: openid google-openid

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

  1. 用户点击“通过Google登录”:
  2. 分机执行checkid_immediate *登录请求:
    • 如果checkid_immediate登录失败:
      1. 该扩展程序将打开一个新标签,其中包含checkid_setup **登录(以及电子邮件提取)的指定参数。
      2. 用户选择帐户并批准我的服务。
      3. 在我的返回页面上,我将OpenID身份和电子邮件保存在我的数据库中。
      4. 我通过Javascript关闭了标签。
    • Else checkid_immediate成功并返回OpenID身份:
      1. 我通过在数据库中查找OpenID标识来确定哪个用户。
  3. 我像往常一样登录用户并设置sessionId
  4. 据我了解x-has-session将允许我获取当前登录用户的OpenID(如果他们之前允许我的服务使用他们的登录),但响应总是{{1} }。

    使用我自己的帐户进行测试我可以使用新的标签openid_mode=setup_needed方法进行授权,然后从checkid_setup XmlHttpRequest获得成功的响应。 但是,只有在我从checkid_immediateopenid.claimed_id参数中插入我从Google获取的OpenID时才可以这样做。

    无论openid.identityopenid.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)

1 个答案:

答案 0 :(得分:3)

好的,所以我终于弄清楚为什么我的测试表现得很奇怪(为什么x-has-session似乎没有做任何事情):如果您使用multipe帐户登录(情况就是如此) me)Google OpenID登录的工作方式略有不同。

让我们来看看差异(这些结果是通过我自己的测试获得的,因此它们可能不是100%准确 - 他们也假设没有其他任何因素会触发Google的setup_needed响应,例如切换{{ 1}}):


1:立即请求未指定OpenID且未指定openid.realm

  • 未登录:Google在响应中指定参数x-has-session
  • 单个会话:如果用户已批准该服务,则Google会在响应中指定参数openid_mode=setup_needed,否则为openid_mode=id_res
  • 多个会话:无论是否批准该服务,Google都会在响应中指定参数openid_mode=setup_needed

2:立即请求未指定OpenID,但指定openid_mode=setup_needed

  • 未登录:与 1 相同(未登录)。
  • 单个会话:如果用户已批准该服务,Google会指定参数x-has-session并忽略openid_mode=id_res,否则x-has-sessionopenid_mode=setup_needed响应。
  • 多个会话:无论是否批准该服务,Google都会在响应中指定参数openid_ext1_mode=x-has-session

3:立即请求指定OpenID而不指定openid_mode=setup_needed

  • 未登录:与 1 相同(未登录)。
  • 单个会话:与 1 相同(单个会话)。
  • 多个会话:与单个会话相同。

4:立即请求指定OpenID和x-has-session

  • 未登录:与 1 相同(未登录)。
  • 单个会话:与 2 相同(单个会话)。
  • 多个会话:与单个会话相同。

换句话说:

  • 如果使用单个会话,使用x-has-session的即时模式可以告诉您Google用户是否已登录,或者如果用户已批准服务,则无论是否指定其OpenID
  • 如果使用多个会话并指定OpenID ,则行为与单个会话相同。
  • 如果使用多个会话而未指定OpenID 立即模式,则始终返回失败响应,并且x-has-session不适用。