当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么在OpenID2中使用HTML表单重定向?》经验,为你挑选了2个好方法。

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

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

例如.

    用户未登录并访问您的登录页面.

    您从cookie中检测到用户的openID.

    生成的表单直接发布到远程OpenID服务器.

    远程服务器将用户重定向回网站.

    网站登录用户.

如果是这种情况,我可以看到好处.但是,这假设您在注销时将用户的openID保留在cookie中.

我可以找到关于如何最好地实现此规范的信息.

请参阅官方规范中的HTML FORM Redirection:

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

我从查看PHP OpenID库(版本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;
    }
}

Mark Bracket.. 7

我可以想到几个原因:

默默无闻的一点点安全性 - 篡改POST提交的工作比GET稍微多一些

缓存和重新提交规则对POST的限制比GET更严格.不过,我不完全确定这对OpenID用例很重要.

机器人不会遵循POST表单,但会遵循重定向.这可能会影响服务器负载.

不同的浏览器对GET请求有不同的最大长度 - 但它们都没有POST那么大.

某些浏览器会在重定向到另一个域时发出警告.如果您要向非HTTPS网址提交POST,他们也会发出警告.

通过关闭JavaScript,我可以获得相对安全的体验,而不是默默地重定向到另一个域.

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



1> Mark Bracket..:

我可以想到几个原因:

默默无闻的一点点安全性 - 篡改POST提交的工作比GET稍微多一些

缓存和重新提交规则对POST的限制比GET更严格.不过,我不完全确定这对OpenID用例很重要.

机器人不会遵循POST表单,但会遵循重定向.这可能会影响服务器负载.

不同的浏览器对GET请求有不同的最大长度 - 但它们都没有POST那么大.

某些浏览器会在重定向到另一个域时发出警告.如果您要向非HTTPS网址提交POST,他们也会发出警告.

通过关闭JavaScript,我可以获得相对安全的体验,而不是默默地重定向到另一个域.

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



2> keturn..:

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

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有