代码之家  ›  专栏  ›  技术社区  ›  Johnny Oshika

根据“消费者”域名,谷歌的openid标识符是不同的。如果域名需要更改,如何避免问题?

  •  9
  • Johnny Oshika  · 技术社区  · 16 年前

    我目前正在测试一个OpenID实现,我注意到Google会为不同的消费主机名/域名发送不同的标识符,即使是同一个用户。例如,当请求站点 localhost ,与请求站点 127.0.0.1 对于同一用户。

    注意:我还没有用公共域名测试过这个,但是我不明白为什么行为会有任何不同。

    我对谷歌的行为感到担忧的是,如果我们将来选择更改我们的网站域名,那么用户将无法再使用谷歌的OpenID作为身份提供商登录到该网站。这似乎是个大问题。我是否遗漏了一些东西,或者所有OpenID消费站点都面临着这个潜在的问题?

    我也用myopenid测试过这个,但是myopenid创建的标识符是固定的,所以这对他们来说不是问题。

    3 回复  |  直到 8 年前
        1
  •  5
  •   Sascha    16 年前

    看看 Google OpenID most important technical issue . 一些信息。基本上是从stackoverflow.com的accounts部分获取的链接;)

    -SA

        2
  •  3
  •   Daniel Trebbien    14 年前

    Google返回的openid URL似乎取决于 openid.realm 使用的值。另外,我刚刚尝试了openid进程,其中一个领域设置为 http://MYREALM openid.return_to 设置为 http://localhost/openid.php ,但收到一个HTTP 400错误请求。显然,谷歌会检查该领域是否与“返回”URL拥有相同的域(可能还有端口)。

    解决方法的一个想法是存储与openid关联的gmail地址。每当您请求google openid时,总是通过属性交换请求用户的电子邮件地址 http://axschema.org/contact/email 类型。如果更改域,则可以根据电子邮件地址将新的OpenID URL与其帐户关联。

    注:它是 命令性 确认HMAC-SHA1签名。否则,任何人都可以使用一个构造好的电子邮件地址“返回”您的Web应用程序的openid checkauth操作,允许他们在知道目标的gmail地址的情况下接管某人的帐户。

    当用户在切换后首次使用其Google帐户登录时,迁移过程为:

    1. 将投递请求发送到 https://www.google.com/accounts/o8/ud 具有以下参数:

       +---------------------+----------------------------------+
       | openid.ns           | http://specs.openid.net/auth/2.0 |
       | openid.mode         | associate                        |
       | openid.assoc_type   | HMAC-SHA1                        |
       | openid.session_type | no-encryption                    |
       +---------------------+----------------------------------+
       

      (替换) openid.realm=http://NEWREALM 酌情)

      回答如下:

       ns:http://specs.openid.net/auth/2.0
       session_type:no-encryption
       assoc_type:HMAC-SHA1
       assoc_handle:B5hJNa39Cl39BXSOKMqkPpk03rJmE0GI6EhHBkvfLOBFAMMQX67HjuFq
       expires_in:46800
       mac_key:F5XUXvoYutLvFv4IzJS0diytLmbe
       
    2. 通过重定向到服务URI, 网址:https://www.google.com/accounts/o8/ud ,模式'checkid_setup',确保发送先前获得的关联句柄,并通过属性交换要求用户的电子邮件地址。换句话说,确保发送以下附加参数:

       +----------------------+----------------------------------------------------------+
       | openid.assoc_handle  | B5hJNa39Cl39BXSOKMqkPpk03rJmE0GI6EhHBkvfLOBFAMMQX67HjuFq |
       | openid.ns.ax         | http://openid.net/srv/ax/1.0                             |
       | openid.ax.mode       | fetch_request                                            |
       | openid.ax.type.email | http://axschema.org/contact/email                        |
       | openid.ax.required   | email                                                    |
       +----------------------+----------------------------------------------------------+
       

      “返回”请求将包括重要参数 openid_signed , openid_sig openid_ext1_value_email .

    3. 跟随 the OpenID Authentication 2.0 Specification's procedure for generating the signature .如果hmac-sha1签名的base64编码与 OpenIDIX SIG 值,则签名无效。注意这个例子中的mac键是 F5XUXvoYutLvFv4IzJS0diytLmbe . 使用与关联请求一起发送回来的谷歌服务器。

    Google's Federated Login documentation page states 那个 http://axschema.org/contact/email/电子邮件 “[R]请求用户的gmail地址”。大概,一旦创建了一个谷歌帐户,那么“gmail”电子邮件地址就固定了。但是,如果此假设无效,那么使用此过程是不安全的,因为恶意用户可以将联邦登录服务返回的电子邮件地址更改为他们希望窃取的帐户的电子邮件地址。

    为了安全起见,在激活新的OpenID之前,向电子邮件地址发送一个电子邮件验证请求。验证链接将包含一个与新openid关联的nonce。单击链接后,新的openid将与用户帐户完全关联,因为收到nonce将验证电子邮件地址和新的openid url之间的关联。

    参见: openid.sig -- How is it generated?

        3
  •  1
  •   Daniel Trebbien    14 年前

    还有一个可能的工作。当发出间接身份验证请求(重定向到服务URI)时,发送 古老的 OpenID URL作为 openid.claimed_id openid.identity 参数,即使领域设置为新领域。

    在我的开发人员机器上,域名“thiscomputer”的别名是127.0.0.1。当我向谷歌的OpenID提供商请求身份验证时,领域“http://thiscomputer”和 开放身份 openid.claimed\u id 都设置为 http://specs.openid.net/auth/2.0/identifier_select ,我回来了,就像:

    https://www.google.com/accounts/o8/id?id=VGwSBXN7Q00X4G9CTAsLPMJ3m6JaPljpkrURAUZJ

    然后,我请求来自op,realm'http://localhost'和 开放身份 openid.claimed\u id 都设置为 http://specs.openid.net/auth/2.0/identifier\u选择 . 我回来了,就像:

    https://www.google.com/accounts/o8/id?id=VGwSBXNwzPQk-puNdfZl4tP-s7JNHPA3WmMHozHJ

    然后,我请求来自op,realm'http://localhost'和 开放身份 openid.claimed\u id 都设置为 https://www.google.com/accounts/o8/id?id=VGwSBXN7Q00X4G9CTAsLPMJ3m6JaPljpkrURAUZJ (当领域为“http://thiscomputer”时,我的Google帐户的OpenID标识)。我回来了:

    https://www.google.com/accounts/o8/id?id=vgwsbxn7q00x4g9ctaslpmj3m6japljprukrauzj

    也就是说,我得到了与领域为“http://thiscomputer”时相同的OpenID标识URL。因此,即使我将依赖OpenID的Web应用程序从“thiscomputer”迁移到“localhost”,我仍然可以使用旧的OpenID标识URL。

    只要您知道用户的旧OpenID标识URL,这个解决方案就可以工作,可能是因为它存储在cookie中。

    一个注意事项:我尝试设置 开放身份 openid.claimed\u id 不同的值(例如,一个是 http://specs.openid.net/auth/2.0/identifier\u选择 另一个是 https://www.google.com/accounts/o8/id?id=vgwsbxn7q00x4g9ctaslpmj3m6japljprukrauzj 或者一个是 https://www.google.com/accounts/o8/id?id=vgwsbxn7q00x4g9ctaslpmj3m6japljprukrauzj 另一个是 https://www.google.com/accounts/o8/id?id=VGwSBXNwzPQk-puNdfZl4tP-s7JNHPA3WmMHozHJ 但是谷歌的运营服务回应说“你请求的页面无效”。