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

时间:2008-08-29 16:21:48

标签: openid redirect openid2

为什么要进行自动HTML帖子而不是简单的重定向?

这是否所以开发人员可以自动生成一个登录表单,在OpenID已知时将目录发布到远程服务器?

例如

  1. 用户未登录并访问您的登录页面。
  2. 您从Cookie中检测到用户的openID。
  3. 生成直接发布到远程OpenID服务器的表单。
  4. 远程服务器将用户重定向回网站。
  5. 网站登录用户。
  6. 如果是这种情况,我可以看到好处。但是,这假设您在注销时将用户的openID保留在cookie中。

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

    请参阅官方规范中的HTML FORM重定向:

    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 个答案:

答案 0 :(得分:7)

我可以想到几个原因:

  • 默默无闻的一点点安全 - 篡改POST提交的工作比GET稍微多一些
  • 缓存和重新提交规则对POST的限制比GET更严格。我不完全确定这对OpenID用例很重要。
  • Bots不会遵循POST表单,但会遵循重定向。这可能会影响服务器负载。
  • 不同的浏览器对GET请求的最大长度不同 - 但它们都没有POST那么大。
  • 某些浏览器会在重定向到另一个域时发出警告。如果您要将POST提交到非HTTPS网址,他们也会发出警告。
  • 通过关闭JavaScript,我可以获得相对安全的体验,而不是默默地重定向到另一个域。

我不知道其中任何一个都是选择POST的扣篮理由 - 除非发送的数据量超过某些主要浏览器的查询字符串长度。

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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

  • 有效负载的几乎无限长度:在SAML中,有效负载是使用XMLDSig和base64编码签名的XML文档。它大于URL的通常1024个字符限制(最佳做法不仅支持任何浏览器,还支持中间网络设备,如防火墙,反向代理,负载均衡器)。

  • W3C HTTP标准说GET是幂等的(多次执行相同的URL GET应该总是会产生相同的响应),因此可以在POST过程中缓存,并且必须到达URL目标。不应缓存OpenID HTML表单POST或SAML HTML表单POST的响应。它必须到达目标才能启动经过身份验证的会话。

您可能会争辩说,使用HTTP GET重定向也会起作用,因为URL查询总是会改变,而您的做法是正确的。但是,这将是W3C标准的一种解决方法,因此,当双方都同意时,它不应该是标准而是替代实现。