代码之家  ›  专栏  ›  技术社区  ›  andyuk

为什么在OpenID2中使用HTML表单重定向?

  •  10
  • andyuk  · 技术社区  · 18 年前

    为什么你要做一个自动的HTML帖子而不是一个简单的重定向?

    这样开发者就可以自动生成一个登录表单,当OpenID已知时将目录发布到远程服务器?

    如。

    1. 用户未登录并访问您的登录页面。
    2. 您可以从cookie中检测用户的openID。
    3. 生成直接发布到远程OpenID服务器的表单。
    4. 网站登录用户。

    如果是这样的话,我可以看到好处。但是,这假设您在用户注销时将其openID保存在cookie中。

    我几乎找不到关于如何最好地实现这个规范的信息。

    请参见官方规范中的HTML表单重定向:

    http://openid.net/specs/openid-authentication-2_0.html#indirect_comm

    我是通过看照片发现的 PHP OpenID Library (版本2.1.1)。

    // Redirect the user to the OpenID server for authentication.
    // Store the token for this authentication so we can verify the
    // response.
    
    // For OpenID 1, send a redirect.  For OpenID 2, use a Javascript
    // form to send a POST request to the server.
    if ($auth_request->shouldSendRedirect()) {
        $redirect_url = $auth_request->redirectURL(getTrustRoot(),
                                                   getReturnTo());
    
        // If the redirect URL can't be built, display an error
        // message.
        if (Auth_OpenID::isFailure($redirect_url)) {
            displayError("Could not redirect to server: " . $redirect_url->message);
        } else {
            // Send redirect.
            header("Location: ".$redirect_url);
        }
    } else {
        // Generate form markup and render it.
        $form_id = 'openid_message';
        $form_html = $auth_request->htmlMarkup(getTrustRoot(), getReturnTo(),
                                               false, array('id' => $form_id));
    
        // Display an error if the form markup couldn't be generated;
        // otherwise, render the HTML.
        if (Auth_OpenID::isFailure($form_html)) {
            displayError("Could not redirect to server: " . $form_html->message);
        } else {
            print $form_html;
        }
    }
    
    3 回复  |  直到 18 年前
        1
  •  7
  •   Mark Brackett    18 年前

    我可以想到几个原因:

    • 缓存和重新提交规则对POST的限制比GET更严格。不过,我不完全确定这对OpenID用例是否重要。
    • 机器人不会遵循POST表单,但会遵循重定向。这可能会影响服务器负载。
    • 某些浏览器会在重定向到另一个域时发出警告。如果您将帖子提交到非HTTPS url,它们也会发出警告。
    • 通过关闭JavaScript,我可以有一个相对安全的体验,而不会被悄悄地重定向到另一个域。

    我不知道这些都是选择POST的一个很好的理由,除非发送的数据量超过某些主要浏览器的查询字符串长度。

        2
  •  6
  •   Chen Levy    13 年前

    正如Mark Brackett所说,主要动机是使用重定向和GET对有效负载大小施加的限制。有些实现足够聪明,只在消息超过一定大小时才使用POST,因为POST技术肯定有缺点。(其中最主要的是后退按钮不起作用。)其他实现,如您引用的示例代码,追求简单性和一致性,而忽略了条件。

        3
  •  4
  •   Laurent Fournié    17 年前

    SAML Web浏览器SSO配置文件也使用相同的方法。使用HTML后期重定向的主要动机是:

    • 实际上,有效负载的长度是无限的:在SAML中,有效负载是一个用XMLDSig和base64编码签名的XML文档。它比通常的1024个字符的URL限制更大(这是一种最佳实践,不仅支持任何浏览器,而且还支持防火墙、反向代理、负载平衡器等中间网络设备)。

    您可能会争辩说,使用HTTPGET重定向也会起作用,因为URL查询总是变化的,您的做法是正确的。然而,这将是W3C标准的一个变通方法,因此,只要双方都同意,它不应该是一个标准,而应该是一个替代实现。

    推荐文章