为什么要进行自动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的扣篮理由 - 除非发送的数据量超过某些主要浏览器的查询字符串长度.
我可以想到几个原因:
默默无闻的一点点安全性 - 篡改POST提交的工作比GET稍微多一些
缓存和重新提交规则对POST的限制比GET更严格.不过,我不完全确定这对OpenID用例很重要.
机器人不会遵循POST表单,但会遵循重定向.这可能会影响服务器负载.
不同的浏览器对GET请求有不同的最大长度 - 但它们都没有POST那么大.
某些浏览器会在重定向到另一个域时发出警告.如果您要向非HTTPS网址提交POST,他们也会发出警告.
通过关闭JavaScript,我可以获得相对安全的体验,而不是默默地重定向到另一个域.
我不知道其中任何一个都是选择POST的扣篮理由 - 除非发送的数据量超过某些主要浏览器的查询字符串长度.
正如Mark Brackett所说,主要动机是使用重定向和GET对有效载荷大小的限制.一些实现足够聪明,只有当消息超过一定大小时才使用POST,因为POST技术肯定存在缺点.(其中最主要的是你的后退按钮不起作用.)其他实现,比如你引用的示例代码,是为了简单和一致,并省略了条件.