Zend_Auth_Adapter_OpenId.xml 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 24249 -->
  4. <sect1 id="zend.auth.adapter.openid">
  5. <title>Open ID 認証</title>
  6. <sect2 id="zend.auth.adapter.openid.introduction">
  7. <title>導入</title>
  8. <para>
  9. <classname>Zend_Auth_Adapter_OpenId</classname>
  10. は、リモートの OpenID サーバを使用したユーザ認証を行います。
  11. この認証方式では、ユーザがウェブアプリケーションに対して送信するのは
  12. OpenID の識別子のみとなります。その識別子は OpenID
  13. プロバイダにリダイレクトされ、そこでパスワードなどを用いて識別子の所有者情報を確認します。
  14. ここで入力したパスワードは、ウェブアプリケーション側には知られることはありません。
  15. </para>
  16. <para>
  17. OpenID の識別子は単なる <acronym>URI</acronym> で、
  18. 指し示す先のウェブページにはそのユーザに関する情報や特別なタグが含まれます。
  19. タグに記述されているのは、どのサーバに対してどの情報を送信するのかという情報です。
  20. OpenID についての詳細は
  21. <ulink url="http://www.openid.net/">OpenID の公式サイト</ulink>
  22. を参照ください。
  23. </para>
  24. <para>
  25. <classname>Zend_Auth_Adapter_OpenId</classname> クラスは
  26. <classname>Zend_OpenId_Consumer</classname> コンポーネントのラッパーで、
  27. OpenID の認証プロトコルを実装しています。
  28. </para>
  29. <note>
  30. <para>
  31. <classname>Zend_OpenId</classname> は、<ulink url="http://php.net/gmp">GMP
  32. 拡張モジュール</ulink> が使用可能な場合はそれを使用します。
  33. <classname>Zend_Auth_Adapter_OpenId</classname> を使う場合は、
  34. <acronym>GMP</acronym> 拡張モジュールを有効にしておくとよりよいパフォーマンスが得られるでしょう。
  35. </para>
  36. </note>
  37. </sect2>
  38. <sect2 id="zend.auth.adapter.openid.specifics">
  39. <title>仕様</title>
  40. <para>
  41. 他の <classname>Zend_Auth</classname> アダプタ同様、<classname>Zend_Auth_Adapter_OpenId</classname>
  42. クラスは <classname>Zend_Auth_Adapter_Interface</classname> を実装しています。
  43. このインターフェイスで定義されているメソッドは
  44. <methodname>authenticate()</methodname> です。
  45. このメソッドは認証そのものを行います。
  46. このメソッドをコールする前にオブジェクトを準備しておく必要があります。
  47. 「準備」とは、OpenID の識別子を設定したりその他の
  48. <classname>Zend_OpenId</classname> 固有のオプションを設定したりということです。
  49. </para>
  50. <para>
  51. しかし、他の <classname>Zend_Auth</classname> アダプタとは異なり、
  52. このアダプタは認証処理を外部のサーバで行います。
  53. また認証は二段階の <acronym>HTTP</acronym> リクエストで行います。
  54. したがって、<methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname>
  55. を二度コールする必要があります。
  56. 一度目のコールでは、このメソッドは何も返さずに OpenID サーバにリダイレクトします。
  57. 認証が終わってリダイレクト先から戻ってきたら、もう一度
  58. <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname>
  59. をコールしてサーバから戻されたリクエストのシグネチャを検証し、
  60. 認証手続きを進めます。このときは、このメソッドは
  61. <classname>Zend_Auth_Result</classname> オブジェクトを返します。
  62. </para>
  63. <para>
  64. 次の例は、<classname>Zend_Auth_Adapter_OpenId</classname> の使用方法を示すものです。
  65. 先ほど説明したように、<methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname>
  66. が 2 回コールされています。一度目、つまり <acronym>HTML</acronym> フォームから送信されたときは
  67. <varname>$_POST['openid_action']</varname> が <emphasis>"login"</emphasis>
  68. となっており、二度目、つまり OpenID サーバから <acronym>HTTP</acronym> リダイレクトで戻ってきたときは
  69. <varname>$_GET['openid_mode']</varname> あるいは <code>$_POST['openid_mode']</code>
  70. が設定されています。
  71. </para>
  72. <programlisting language="php"><![CDATA[
  73. <?php
  74. $status = "";
  75. $auth = Zend_Auth::getInstance();
  76. if ((isset($_POST['openid_action']) &&
  77. $_POST['openid_action'] == "login" &&
  78. !empty($_POST['openid_identifier'])) ||
  79. isset($_GET['openid_mode']) ||
  80. isset($_POST['openid_mode'])) {
  81. $result = $auth->authenticate(
  82. new Zend_Auth_Adapter_OpenId(@$_POST['openid_identifier']));
  83. if ($result->isValid()) {
  84. $status = "You are logged in as "
  85. . $auth->getIdentity()
  86. . "<br>\n";
  87. } else {
  88. $auth->clearIdentity();
  89. foreach ($result->getMessages() as $message) {
  90. $status .= "$message<br>\n";
  91. }
  92. }
  93. } else if ($auth->hasIdentity()) {
  94. if (isset($_POST['openid_action']) &&
  95. $_POST['openid_action'] == "logout") {
  96. $auth->clearIdentity();
  97. } else {
  98. $status = "You are logged in as "
  99. . $auth->getIdentity()
  100. . "<br>\n";
  101. }
  102. }
  103. ?>
  104. <html><body>
  105. <?php echo htmlspecialchars($status);?>
  106. <form method="post"><fieldset>
  107. <legend>OpenID Login</legend>
  108. <input type="text" name="openid_identifier" value="">
  109. <input type="submit" name="openid_action" value="login">
  110. <input type="submit" name="openid_action" value="logout">
  111. </fieldset></form></body></html>
  112. */
  113. ]]></programlisting>
  114. <para>
  115. OpenID 認証手続きをカスタマイズして、
  116. OpenID サーバからリダイレクトで戻ってくる先を別のページ
  117. (そのウェブサイトの "ルート" ページなど) にすることもできます。
  118. この場合は、独自の
  119. <classname>Zend_OpenId_Consumer_Storage</classname> あるいは
  120. <classname>Zend_Controller_Response</classname> を使用します。
  121. また、Simple Registration Extension
  122. を使用して OpenID サーバからユーザ情報を取得することも可能です。
  123. これらについての詳細は
  124. <classname>Zend_OpenId_Consumer</classname> のマニュアルを参照ください。
  125. </para>
  126. </sect2>
  127. </sect1>
  128. <!--
  129. vim:se ts=4 sw=4 et:
  130. -->