Zend_Auth_Adapter_OpenId.xml 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.auth.adapter.openid">
  5. <title>Authentification OpenID</title>
  6. <sect2 id="zend.auth.adapter.openid.introduction">
  7. <title>Introduction</title>
  8. <para>
  9. <classname>Zend_Auth_Adapter_OpenId</classname> permet l'authentification à travers un
  10. serveur distant OpenID. Une telle authentification attend que l'utilisateur fournisse à
  11. l'application Web son identifiant OpenID. L'utilisateur est alors redirigé vers un
  12. fournisseur de services OpenID, afin de s'identifier en rapport avec l'application Web
  13. utilisée. Un mot de passe ou un autre procédé est utilisé, et celui-ci n'est jamais
  14. connu de l'application Web originale.
  15. </para>
  16. <para>
  17. L'identité OpenID est juste une <acronym>URI</acronym> qui pointe vers une page avec des
  18. informations décrivant le serveur à utiliser et des informations sur l'utilisateur.
  19. Pour plus d'informations, consultez
  20. <ulink url="http://www.openid.net/">le site officiel OpenID</ulink>.
  21. </para>
  22. <para>
  23. La classe <classname>Zend_Auth_Adapter_OpenId</classname> utilise
  24. <classname>Zend_OpenId_Consumer</classname> qui sert à gérer le protocole OpenID.
  25. </para>
  26. <note>
  27. <para>
  28. <classname>Zend_OpenId</classname> utilise
  29. <ulink url="http://www.php.net/manual/fr/ref.gmp.php">l'extension GMP</ulink>, si
  30. disponible. L'utilisation de l'extension <acronym>GMP</acronym> est recommandée pour
  31. améliorer les performances de <classname>Zend_Auth_Adapter_OpenId</classname>.
  32. </para>
  33. </note>
  34. </sect2>
  35. <sect2 id="zend.auth.adapter.openid.specifics">
  36. <title>Spécifications</title>
  37. <para>
  38. Comme toute autre classe adaptateur de <classname>Zend_Auth</classname>,
  39. <classname>Zend_Auth_Adapter_OpenId</classname> implémente
  40. <classname>Zend_Auth_Adapter_Interface</classname>, qui définit une seule méthode :
  41. <methodname>authenticate()</methodname>. Elle est utilisée pour l'authentification
  42. elle-même, une fois que l'objet est prêt. La préparation d'un objet OpenID nécessite
  43. quelques options à passer à <classname>Zend_OpenId</classname>.
  44. </para>
  45. <para>
  46. A la différence des autres adaptateurs <classname>Zend_Auth</classname>, l'adaptateur
  47. <classname>Zend_Auth_Adapter_OpenId</classname> utilise une authentification sur un
  48. serveur externe à l'application, et nécessitera donc deux requêtes
  49. <acronym>HTTP</acronym>. Ainsi
  50. <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname> devra être appelée
  51. deux fois&#160;: d'abord pour rediriger l'utilisateur vers le serveur OpenID (rien ne
  52. sera donc retourné par la méthode), qui lui-même redirigera l'utilisateur vers
  53. l'application, où un deuxième appel de méthode
  54. <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname> vérifiera la signature
  55. et complétera le processus. Un objet <classname>Zend_Auth_Result</classname> sera alors
  56. cette fois-ci retourné.
  57. </para>
  58. <para>
  59. L'exemple suivant montre l'utilisation de
  60. <classname>Zend_Auth_Adapter_OpenId</classname>.
  61. <methodname>Zend_Auth_Adapter_OpenId::authenticate()</methodname> est appelée deux fois.
  62. La première fois juste après avoir envoyé le formulaire <acronym>HTML</acronym>, lorsque
  63. <varname>$_POST['openid_action']</varname> vaut <emphasis>"login"</emphasis>, et la
  64. deuxième fois après la redirection <acronym>HTTP</acronym> du serveur OpenID vers
  65. l'application, lorsque <varname>$_GET['openid_mode']</varname> ou
  66. <varname>$_POST['openid_mode']</varname> existe.
  67. </para>
  68. <programlisting language="php"><![CDATA[
  69. <?php
  70. $status = "";
  71. $auth = Zend_Auth::getInstance();
  72. if ((isset($_POST['openid_action']) &&
  73. $_POST['openid_action'] == "login" &&
  74. !empty($_POST['openid_identifier'])) ||
  75. isset($_GET['openid_mode']) ||
  76. isset($_POST['openid_mode'])) {
  77. $result = $auth->authenticate(
  78. new Zend_Auth_Adapter_OpenId(@$_POST['openid_identifier']));
  79. if ($result->isValid()) {
  80. $status = "You are logged-in as "
  81. . $auth->getIdentity()
  82. . "<br>\n";
  83. } else {
  84. $auth->clearIdentity();
  85. foreach ($result->getMessages() as $message) {
  86. $status .= "$message<br>\n";
  87. }
  88. }
  89. } else if ($auth->hasIdentity()) {
  90. if (isset($_POST['openid_action']) &&
  91. $_POST['openid_action'] == "logout") {
  92. $auth->clearIdentity();
  93. } else {
  94. $status = "You are logged-in as "
  95. . $auth->getIdentity()
  96. . "<br>\n";
  97. }
  98. }
  99. ?>
  100. <html><body>
  101. <?php echo htmlspecialchars($status);?>
  102. <form method="post"><fieldset>
  103. <legend>OpenID Login</legend>
  104. <input type="text" name="openid_identifier" value="">
  105. <input type="submit" name="openid_action" value="login">
  106. <input type="submit" name="openid_action" value="logout">
  107. </fieldset></form></body></html>
  108. ]]></programlisting>
  109. <para>
  110. Il est possible de personnaliser le processus, pour par exemple demander une
  111. redirection du serveur OpenID vers l'application, sur une page différente de la
  112. première. Ceci peut être fait avec des objets personnalisés
  113. <classname>Zend_OpenId_Consumer_Storage</classname> ou
  114. <classname>Zend_Controller_Response</classname>. Vous pouvez aussi utiliser le procédé
  115. "Simple Registration" pour récupérer les informations au sujet de l'utilisateur, en
  116. provenance du serveur OpenID. Toutes ces possibilités sont écrites et détaillées dans
  117. le chapitre concernant <classname>Zend_OpenId_Consumer</classname>.
  118. </para>
  119. </sect2>
  120. </sect1>