Zend_Auth_Adapter_OpenId.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15156 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.auth.adapter.openid">
  5. <title>Open ID Authentifikation</title>
  6. <sect2 id="zend.auth.adapter.openid.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Der <classname>Zend_Auth_Adapter_OpenId</classname> Adapter kann verwendet werden um Benutzer durch
  10. Verwendung eines entfernten OpenID Servers zu authentifizieren. Diese Authentifizierungsmethode
  11. nimmt an das Benutzer nur ihre OpenID Identität an die Web Anwendung übermitteln. Dann werden
  12. Sie zu Ihrem OpenID Anbieter umgeleitet um die Eigentümerschaft der Identität mit Hilfe eines
  13. Passwortes oder einer anderen Methode zu prüfen. Dieses Passwort wird der Web Anwendung nie bekannt
  14. gegeben.
  15. </para>
  16. <para>
  17. Die OpenID Identität ist nur eine URL die auf eine Webseite mit entsprechenden Informationen
  18. über den Benutzer und spezielle Tags verweist welche beschreiben welcher Server verwendet werden soll
  19. und welche Identität dort zu übermitteln ist. Mehr über OpenID kann auf der
  20. <ulink url="http://www.openid.net/">offiziellen OpenID Site</ulink> nachgelesen werden.
  21. </para>
  22. <para>
  23. Die <classname>Zend_Auth_Adapter_OpenId</classname> Klasse umgibt die <classname>Zend_OpenId_Consumer</classname>
  24. Komponente welche das OpenID Authentifizierungs Protokoll selbst implementiert.
  25. </para>
  26. <note>
  27. <para>
  28. <classname>Zend_OpenId</classname> hat Vorteile davon wenn die
  29. <ulink url="http://php.net/gmp">GMP Erweiterung</ulink> vorhanden ist. Es sollte
  30. Angedacht werden die GMP Erweiterung für eine bessere Performance einzuschalten wenn
  31. <classname>Zend_Auth_Adapter_OpenId</classname> verwendet wird.
  32. </para>
  33. </note>
  34. </sect2>
  35. <sect2 id="zend.auth.adapter.openid.specifics">
  36. <title>Spezielles</title>
  37. <para>
  38. Wie in diesem Fall für alle <classname>Zend_Auth</classname> Adapter, implementiert die
  39. <classname>Zend_Auth_Adapter_OpenId</classname> Klasse das <classname>Zend_Auth_Adapter_Interface</classname>, welches
  40. nur eine Methode definiert: <code>authenticate()</code>. Diese Methode führt die Authentifizierung
  41. selbst durch, allerdings muß das Objekt vor dem Aufruf vorbereitet werden. So eine Vorbereitung des
  42. Adapters beinhaltet das Setzen der OpenID Identität und einige andere <classname>Zend_OpenId</classname>
  43. spezifische Optionen.
  44. </para>
  45. <para>
  46. Trotzdem, im Gegensatz zu anderen <classname>Zend_Auth</classname> Adaptern führt
  47. <classname>Zend_Auth_Adapter_OpenId</classname> Authentifizierungen an einem
  48. externen Server durch und das wird in zwei separaten HTTP Anfragen getan. Deswegen muß
  49. <classname>Zend_Auth_Adapter_OpenId::authenticate()</classname> zweimal aufgerufen werden. Beim ersten Aufruf
  50. wird die Methode nichts zurückgeben, aber den Benutzer zu seinem OpenID Server umleiten. Dann,
  51. nachdem der Benutzer auf dem entfernten Server authentifiziert ist wird dieser wieder zurück
  52. umleiten und das Skript muß für diese zweite Anfrage
  53. <classname>Zend_Auth_Adapter_OpenId::authenticate()</classname> nochmals aufrufen um die Signatur zu prüfen,
  54. welche mit der umgeleiteten Anfrage vom Server geschickt wird, und den Authentifikationsprozess
  55. zu beenden. Bei diesem zweiten Aufruf wird wie erwartet ein <classname>Zend_Auth_Result</classname>
  56. Objekt zurückgegeben.
  57. </para>
  58. <para>
  59. Das folgende Beispiel zeigt die Verwendung von <classname>Zend_Auth_Adapter_OpenId</classname>. Wie vorher
  60. erwähnt wird die <classname>Zend_Auth_Adapter_OpenId::authenticate()</classname> Methode zweimal aufgerufen.
  61. Das erste Mal, ist nachdem der Benutzer das HTML Formular übermittelt hat und
  62. <code>$_POST['openid_action']</code> auf <code>"login"</code> gesetzt wurde, und das zweite Mal
  63. nach der HTTP Umleitung vom OpenID Server wenn <code>$_GET['openid_mode']</code> oder
  64. <code>$_POST['openid_mode']</code> gesetzt wurde.
  65. </para>
  66. <programlisting role="php"><![CDATA[
  67. $status = "";
  68. $auth = Zend_Auth::getInstance();
  69. if ((isset($_POST['openid_action']) &&
  70. $_POST['openid_action'] == "login" &&
  71. !empty($_POST['openid_identifier'])) ||
  72. isset($_GET['openid_mode']) ||
  73. isset($_POST['openid_mode'])) {
  74. $result = $auth->authenticate(
  75. new Zend_Auth_Adapter_OpenId(@$_POST['openid_identifier']));
  76. if ($result->isValid()) {
  77. $status = "Sie sind angemeldet als "
  78. . $auth->getIdentity()
  79. . "<br>\n";
  80. } else {
  81. $auth->clearIdentity();
  82. foreach ($result->getMessages() as $message) {
  83. $status .= "$message<br>\n";
  84. }
  85. }
  86. } else if ($auth->hasIdentity()) {
  87. if (isset($_POST['openid_action']) &&
  88. $_POST['openid_action'] == "logout") {
  89. $auth->clearIdentity();
  90. } else {
  91. $status = "Sie sind angemeldet als "
  92. . $auth->getIdentity()
  93. . "<br>\n";
  94. }
  95. }
  96. ?>
  97. <html><body>
  98. <?php echo htmlspecialchars($status);?>
  99. <form method="post"><fieldset>
  100. <legend>OpenID Login</legend>
  101. <input type="text" name="openid_identifier" value="">
  102. <input type="submit" name="openid_action" value="login">
  103. <input type="submit" name="openid_action" value="logout">
  104. </fieldset></form></body></html>
  105. */
  106. ]]></programlisting>
  107. <para>
  108. Man kann den OpenID Authentifizierungs Prozess auf verschiedenen Wegen anzupassen. Man kann,zum
  109. Bespiel, die Umleitung des OpenID Servers auf eine eigene Seite erhalten, indem der "root"
  110. der Webseite spezifiziert wird und ein eigener <classname>Zend_OpenId_Consumer_Storage</classname> oder
  111. <classname>Zend_Controller_Response</classname> verwendet wird. Man kann auch eine einfache
  112. Registrierungserweiterung verwenden um Informationen über den Benutzer vom OpenID Server zu
  113. erhalten. Alle diese Möglichkeiten werden detailierter im Kapitel <classname>Zend_OpenId_Consumer</classname>
  114. beschrieben.
  115. </para>
  116. </sect2>
  117. </sect1>
  118. <!--
  119. vim:se ts=4 sw=4 et:
  120. -->