2008-08-29 30 views
10

爲什麼要做一個自動的HTML文章而不是簡單的重定向?爲什麼在OpenID 2中使用HTML表單重定向?

這是否使開發人員可以自動生成登錄表單,在OpenID已知時將目錄發佈到遠程服務器?

例如。

  1. 用戶未登錄並訪問您的登錄頁面。
  2. 您從cookie中檢測到用戶的openID。
  3. 生成表單,直接發佈到遠程OpenID服務器。
  4. 遠程服務器將用戶重定向回網站。
  5. 網站登錄用戶。

如果是這種情況,我可以看到好處。但是,這假定您在註銷時將用戶的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; 
    } 
} 
+0

請參閱http://trac.openidenabled.com/trac/ticket/376。 – crb 2010-02-12 15:08:50

回答

6

正如Mark Brackett所說,主要動機是通過使用重定向和GET來限制有效載荷大小。有些實現足夠聰明,只有在消息超過一定的大小時才使用POST,因爲POST技術肯定有缺點。 (其中最主要的是你的後退按鈕不起作用。)其他實現,如你引用的示例代碼,只是爲了簡單和一致性,而忽略了這個條件。

7

我能想到幾個原因:

  • 安全通過隱藏一點點 - 這是稍微更多的工作與POST提交亂動比GET
  • 緩存和重新提交規則更爲嚴格對於POST比GET。不過,我不完全確定這對OpenID用例會起作用。
  • 機器人不會遵循POST表單,但會遵循重定向。這可能會影響服務器負載。
  • 不同的瀏覽器對GET請求的最大長度不同 - 但它們都不如POST大。
  • 某些瀏覽器會警告重定向到另一個域。他們還會警告您是否將POST提交到非HTTPS網址。
  • 通過關閉JavaScript,我可以有一個相對安全的體驗,而不是被靜靜地重定向到另一個域。

我不知道任何這些都是選擇POST的滿貫原因 - 除非發送的數據量超過某個主要瀏覽器的查詢字符串長度。

4

SAML Web瀏覽器SSO配置文件使用相同的方法。使用HTML重定向後的主要動機是:

  • 有效載荷的幾乎無限長度:在SAML有效載荷是與和的XMLDSig base64編碼簽署了XML文檔。它比通常的1024個字符的URL限制更大(不僅支持任何瀏覽器,而且還支持防火牆,反向代理,負載均衡器等中間網絡設備)。

  • W3C HTTP標準規定GET是冪等的(多次執行相同的URL應始終導致相同的響應),因此可以一路緩存,而POST不是且必須到達URL目標。不應緩存OpenID HTML表單POST或SAML HTML表單POST的響應。它必須達到目標才能啓動已驗證的會話。

您可能會爭辯說,使用HTTP GET重定向也會起作用,因爲URL查詢總是會更改,您將會正確實踐。但是,這將是W3C標準的一種解決方法,因此,不應該成爲標準,而是兩端都同意的替代實施。