Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
谷歌OpenID登录-x-has-session如何工作?_Openid_Google Openid - Fatal编程技术网

谷歌OpenID登录-x-has-session如何工作?

谷歌OpenID登录-x-has-session如何工作?,openid,google-openid,Openid,Google Openid,我有一个带有外部用户系统(username/email/sessionId)的Google Chrome扩展,人们可以使用自己选择的凭据(通过SSL)登录。我想将此更改为使用Google OpenID登录,如下所示: 用户单击“通过谷歌登录”: 分机执行一个checkid\u立即*登录请求: 如果checkid\u immediate登录失败: 扩展将打开一个新选项卡,其中包含checkid\u设置的指定参数**登录(和电子邮件获取) 用户选择帐户并批准我的服务 在我的返回页面上,我将Open

我有一个带有外部用户系统(username/email/sessionId)的Google Chrome扩展,人们可以使用自己选择的凭据(通过SSL)登录。我想将此更改为使用Google OpenID登录,如下所示:

  • 用户单击“通过谷歌登录”:
  • 分机执行一个
    checkid\u立即
    *登录请求:
    • 如果
      checkid\u immediate
      登录失败:
    • 扩展将打开一个新选项卡,其中包含
      checkid\u设置的指定参数
      **登录(和电子邮件获取)
    • 用户选择帐户并批准我的服务
    • 在我的返回页面上,我将OpenID标识和电子邮件保存在我的数据库中
    • 我通过Javascript关闭选项卡
    • Else
      checkid\u immediate
      成功并返回OpenID标识:
    • 我通过在数据库中查找OpenID标识来确定哪个用户
  • 我登录用户并像往常一样设置
    sessionId
  • 据我所知,
    x-has-session
    将允许我获取当前登录用户的OpenID(如果他们以前允许我的服务使用他们的登录名),但响应总是
    OpenID\u mode=setup\u needed

    使用我自己的帐户进行测试,我可以授权使用新的选项卡
    checkid\u setup
    方法,然后从
    checkid\u immediate
    XmlHttpRequest获得成功响应但是,只有当我在
    OpenID.id
    OpenID.identity
    参数中插入从谷歌获得的OpenID时,这才是可能的。

    无论
    openid.identity
    openid.ui.mode
    参数如何,请求都将成功

    我是否完全误解了我可以用
    x-has-session
    做什么

    如果是,是否只有通过运行
    checkid\u设置时获得的OpenID标识符,才能从我的分机执行我的
    checkid\u immediate
    请求(无需在新选项卡中打开它)


    *
    checkid\u immediate
    请求参数(使用XMLHttpRequest作为POST请求发送):

    openid.return\u to
    URL,我所做的就是echo
    json\u encode($\u请求)
    (仅获取/POST变量,不包括cookies),它作为我的XmlHttpRequest中的响应获取


    *
    checkid\u设置
    请求参数(在新选项卡中打开):


    好了,我终于弄明白了为什么我的测试一直很奇怪(为什么x-has-session看起来好像什么都没做):如果你使用多个帐户登录(我就是这样),Google OpenID登录的工作方式会有点不同

    让我们来看看这些差异(这些结果是通过我自己的测试获得的,因此它们可能不是100%准确的-它们还假设没有其他任何东西会触发谷歌所需的
    设置
    响应,例如切换
    openid.realm
    ):


    1:未指定OpenID且未指定
    x-has-session的即时请求

    • 未登录:谷歌在响应中指定参数
      openid\u mode=setup\u needed
    • 单一会话:如果用户已批准该服务,谷歌将在响应中指定参数
      openid\u mode=id\u res
      否则
      openid\u mode=setup\u needed
    • 多个会话:Google在响应中指定参数
      openid\u mode=setup\u needed
      ,无论是否批准该服务

    2:即时请求不指定OpenID,而是指定
    x-has-session

    • 未登录:1相同(未登录)
    • 单一会话:如果用户已批准该服务,谷歌将在响应中指定参数
      openid\u mode=id\u res
      并忽略
      x-has-session
      否则
      openid\u mode=setup\u needed
      openid\u ext1\u mode=x-has-session
    • 多个会话:Google在响应中指定参数
      openid\u mode=setup\u needed
      ,无论是否批准该服务

    3:指定OpenID而不指定
    x-has-session的即时请求

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

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

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

    换言之:

    • 如果使用单会话,使用
      x-has-session
      的即时模式可以告诉您是否有Google用户登录,或者如果用户已经批准了服务,则返回成功响应,而不管是否指定了他们的OpenID
    • 如果使用多个会话并指定OpenID,则行为与单个会话相同
    • 如果在未指定OpenID的情况下使用多个会话,则立即模式始终返回故障响应,
      x-has-session
      不适用
    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"
    };
    
    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"
    };