Zend_Oauth-GettingStarted.xml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20827 -->
  3. <!-- Reviewed: no -->
  4. <sect2 id="zend.oauth.introduction.getting-started">
  5. <title>Beginnen</title>
  6. <para>
  7. Da das OAuth Protokoll jetzt erklärt wurde sehen wir uns ein einfaches Beispiel mit
  8. Quellcode an. Unser neuer Konsument wird Twitter Statusübertragungen verwenden. Um das tun
  9. zu können muss er bei Twitter registriert sein um einen OAuth Konsumentenschlüssel und ein
  10. Konsumentengeheimnis zu empfangen. Diese werden verwendet um einen Zugriffstoken zu
  11. erhalten bevor wir die Twitter API verwenden um eine Statusmeldung zu schicken.
  12. </para>
  13. <para>
  14. Angenommen wir haben einen Schlüssel und ein Geheimnis bekommen, dann können wir den OAuth
  15. Workflow starten indem eine <classname>Zend_Oauth_Consumer</classname> Instanz wie folgt
  16. eingerichtet und eine Konfiguration übergeben wird (entweder ein Array oder ein
  17. <classname>Zend_Config</classname> Objekt).
  18. </para>
  19. <programlisting language="php"><![CDATA[
  20. $config = array(
  21. 'callbackUrl' => 'http://example.com/callback.php',
  22. 'siteUrl' => 'http://twitter.com/oauth',
  23. 'consumerKey' => 'gg3DsFTW9OU9eWPnbuPzQ',
  24. 'consumerSecret' => 'tFB0fyWLSMf74lkEu9FTyoHXcazOWpbrAjTCCK48A'
  25. );
  26. $consumer = new Zend_Oauth_Consumer($config);
  27. ]]></programlisting>
  28. <para>
  29. callbackUrl ist die URI von der wir wollen das Sie Twitter von unserem Server anfragt wenn
  30. Informationen gesendet werden. Wir sehen uns das später an. siteUrl ist die Basis URL der
  31. OAuth API Endpunkte von Twitter. Die komplette Liste der Endpunkt enthält
  32. http://twitter.com/oauth/request_token, http://twitter.com/oauth/access_token und
  33. http://twitter.com/oauth/authorize. Die grundsätzliche siteUrl verwendet eine Konvention
  34. welche auf diese drei OAuth Endpunkte verweist (als Standard) um einen Anfragetoken, den
  35. Zugriffstoken oder die Authorisierung zu erhalten. Wenn sich der aktuelle Endpunkt eines
  36. beliebigen Services vom Standardset unterscheidet, dann können diese drei URIs separat
  37. gesetzt werden indem die Methoden <methodname>setRequestTokenUrl()</methodname>,
  38. <methodname>setAccessTokenUrl()</methodname>, und
  39. <methodname>setAuthorizeUrl()</methodname>, oder die Konfigurationsfelder requestTokenUrl,
  40. accessTokenUrl und authorizeUrl verwendet werden.
  41. </para>
  42. <para>
  43. consumerKey und consumerSecret werden von Twitter empfangen wenn sich die eigene Anwendung
  44. für den OAuth Zugriff registriert. Das wird auch bei jedem OAuth aktivierten Service so
  45. angewendet, so dass jeder einen Schlüssel und ein Geheimnis für die eigene Anwendung
  46. anbietet.
  47. </para>
  48. <para>
  49. Alle diese Konfigurationsoptionen müssen durch Verwendung von Methodenaufrufen gesetzt
  50. werden indem Sie einfach von callbackUrl auf setCallbackUrl() konvertiert werden.
  51. </para>
  52. <para>
  53. Zusätzlich sollte beachtet werden das verschiedene andere Konfigurationswerte nicht explizit
  54. verwendet werden: requestMethod und requestScheme. Standardmäßig sendet
  55. <classname>Zend_Oauth_Consumer</classname> Anfragen als POST (ausgenommen bei einer
  56. Weiterleitung welche GET verwendet). Der konsumierende Client (siehe später) enthält auch
  57. seine Authorisierung in Art eines Headers. Einige Services können, zu Ihrer Diskretion,
  58. Alternativen benötigen. Man kann requestMethod (welche standardmäßig Zend_Oauth::POST ist)
  59. zum Beispiel auf Zend_Oauth::GET zurückgesetzt, und requestScheme von seinem Standardwert
  60. Zend_Oauth::REQUEST_SCHEME_HEADER entweder auf Zend_Oauth::REQUEST_SCHEME_POSTBODY oder auf
  61. Zend_Oauth::REQUEST_SCHEME_QUERYSTRING. Typischerweise sollten die Standardwerte bis auf ein
  62. paar bestimmte Ausnahmen problemlos funktionieren. Für Details sehen Sie bitte in die
  63. Dokumentation des Service Providers.
  64. </para>
  65. <para>
  66. Der zweite Teil der Anpassung definiert wie <acronym>HMAC</acronym> arbeitet wenn es für
  67. alle Anfragen berechnet und verglichen wird. Das wird durch Verwendung des
  68. Konfigurationsfeldes signatureMethod oder durch
  69. <methodname>setSignatureMethod()</methodname> konfiguriert. Standardmäßig ist es HMAC-SHA1.
  70. Man kann es auch auf die vom Provider bevorzugte Methode setzen inklusive RSA-SHA1. Für
  71. RSA-SHA1 sollte man die privaten und öffentlichen RSA Schlüssel über die
  72. Konfigurationsfelder rsaPrivateKey und rsaPublicKey oder die Methoden
  73. <methodname>setRsaPrivateKey()</methodname> und <methodname>setRsaPublicKey()</methodname>
  74. konfigurieren.
  75. </para>
  76. <para>
  77. Der erste Teil des OAuth Workflows holt sich einen Anfragetoken. Das wird bewerkstelligt
  78. indem folgendes verwendet wird:
  79. </para>
  80. <programlisting language="php"><![CDATA[
  81. $config = array(
  82. 'callbackUrl' => 'http://example.com/callback.php',
  83. 'siteUrl' => 'http://twitter.com/oauth',
  84. 'consumerKey' => 'gg3DsFTW9OU9eWPnbuPzQ',
  85. 'consumerSecret' => 'tFB0fyWLSMf74lkEu9FTyoHXcazOWpbrAjTCCK48A'
  86. );
  87. $consumer = new Zend_Oauth_Consumer($config);
  88. // Holt den Anfragetoken
  89. $token = $consumer->getRequestToken();
  90. ]]></programlisting>
  91. <para>
  92. Der neue Anfragetoken (eine Instanz von <classname>Zend_Oauth_Token_Request</classname>)
  93. ist nicht authorisiert. Um Ihn mit einem authorisierten Token zu wechseln mit dem wir auf
  94. die Twitter API zugreifen können, muss Ihn der Benutzer authorisieren. Wir bewerkstelligen
  95. das indem der Benutzer auf den Authorisierungsendpunkt von Twitter umgeleitet wird:
  96. </para>
  97. <programlisting language="php"><![CDATA[
  98. $config = array(
  99. 'callbackUrl' => 'http://example.com/callback.php',
  100. 'siteUrl' => 'http://twitter.com/oauth',
  101. 'consumerKey' => 'gg3DsFTW9OU9eWPnbuPzQ',
  102. 'consumerSecret' => 'tFB0fyWLSMf74lkEu9FTyoHXcazOWpbrAjTCCK48A'
  103. );
  104. $consumer = new Zend_Oauth_Consumer($config);
  105. // Holt den Anfragetoken
  106. $token = $consumer->getRequestToken();
  107. // Den token im Speicher fixieren
  108. $_SESSION['TWITTER_REQUEST_TOKEN'] = serialize($token);
  109. // Den Benutzer umleiten
  110. $consumer->redirect();
  111. ]]></programlisting>
  112. <para>
  113. Der Benutzer wird jetzt auf Twitter umgeleitet. Er wird gefragt den Anfragetoken zu
  114. authorisieren, welcher an den Anfragestring der umgeleiteten URI angehängt ist. Angenommen
  115. er akzeptiert und vervollständigt die Authorisierung, dann wird er wieder umgeleitet. Dieses
  116. Mal auf unsere Callback URL die vorher gesetzt wurde (Beachte das die Callback URL auch in
  117. Twitter registriert wurde als wir unsere Anwendung registriert haben).
  118. </para>
  119. <para>
  120. Bevor der Benutzer umgeleitet wird, sollten wir den Anfragetoken im Speicher fixieren. Der
  121. Einfachheit halber verwenden wir nur die Session des Benutzer, aber man kann sehr einfach
  122. eine Datenbank für den gleichen Zweck verwenden, solange der Anfragetoken mit dem aktuellen
  123. Benutzer verbunden bleibt, damit er empfangen werden kann wenn dieser zu unserer Anwendung
  124. zurückkommt.
  125. </para>
  126. <para>
  127. Die umgeleitete URI von Twitter enthält einen authorisierten Zugriffstoken. Wir können Code
  128. einbauen um diesen Zugriffstoken wie folgt herauszuschneiden - dieser Sourcecode würde im
  129. ausgeführten Code unserer Callback URI existieren. Sobald er herausgeschnitten wurde können
  130. wir den vorherigen Anfragetoken entfernen, und statt dessen den Zugriffstoken für die
  131. zukünftige Verendung mit der API von Twitter fixieren. Nochmals, wir fixieren einfach die
  132. Session des Benutzer, aber in Wirklichkeit kann ein Zugriffstoken eine lange Lebenszeit
  133. haben, und sollte deshalb wirklich in einer Datenbank abgespeichert werden.
  134. </para>
  135. <programlisting language="php"><![CDATA[
  136. $config = array(
  137. 'callbackUrl' => 'http://example.com/callback.php',
  138. 'siteUrl' => 'http://twitter.com/oauth',
  139. 'consumerKey' => 'gg3DsFTW9OU9eWPnbuPzQ',
  140. 'consumerSecret' => 'tFB0fyWLSMf74lkEu9FTyoHXcazOWpbrAjTCCK48A'
  141. );
  142. $consumer = new Zend_Oauth_Consumer($config);
  143. if (!empty($_GET) && isset($_SESSION['TWITTER_REQUEST_TOKEN'])) {
  144. $token = $consumer->getAccessToken($_GET, unserialize($_SESSION['TWITTER_REQUEST_TOKEN']));
  145. $_SESSION['TWITTER_ACCESS_TOKEN'] = serialize($token);
  146. // Jetzt da wir den Zugriffstoken haben können wir den Anfragetoken löschen
  147. $_SESSION['TWITTER_REQUEST_TOKEN'] = null;
  148. } else {
  149. // Fehlgeschlagene Anfrage? Ein Gauner versucht etwas?
  150. exit('Ungültige Callback Anfrage. Oops. Entschuldigung.');
  151. }
  152. ]]></programlisting>
  153. <para>
  154. Erfolg! Wir haben einen authorisierten Zugriffstoken - zu dieser Zeit verwenden wir schon
  155. die API von Twitter. Da dieser Zugriffstoken bei jeder einzelnen API Anfrage enthalten sein
  156. muss, bietet Zend_Oauth_Consumer einen fix-fertigen HTTP Client an (eine Subklasse von
  157. <classname>Zend_Http_Client</classname>) welcher entweder für sich verwendet werden, oder
  158. der als eigener HTTP Client an eine andere Bibliothek oder Komponente übergeben werden kann.
  159. Hier ist ein Beispiel für die eigenständige Verwendung. Das kann von überall aus der
  160. Anwendung heraus getan werden, solange man Zugriff auf die OAuth Konfiguration hat, und den
  161. endgültigen authorisierten Zugriffstoken empfangen kann.
  162. </para>
  163. <programlisting language="php"><![CDATA[
  164. $config = array(
  165. 'callbackUrl' => 'http://example.com/callback.php',
  166. 'siteUrl' => 'http://twitter.com/oauth',
  167. 'consumerKey' => 'gg3DsFTW9OU9eWPnbuPzQ',
  168. 'consumerSecret' => 'tFB0fyWLSMf74lkEu9FTyoHXcazOWpbrAjTCCK48A'
  169. );
  170. $statusMessage = 'Ich sende über Twitter und verwende Zend_Oauth!';
  171. $token = unserialize($_SESSION['TWITTER_ACCESS_TOKEN']);
  172. $client = $token->getHttpClient($configuration);
  173. $client->setUri('http://twitter.com/statuses/update.json');
  174. $client->setMethod(Zend_Http_Client::POST);
  175. $client->setParameterPost('status', $statusMessage);
  176. $response = $client->request();
  177. $data = Zend_Json::decode($response->getBody());
  178. $result = $response->getBody();
  179. if (isset($data->text)) {
  180. $result = 'true';
  181. }
  182. echo $result;
  183. ]]></programlisting>
  184. <para>
  185. Als Notiz zum eigenen Client, kann dieser an den meisten Services von Zend Framework
  186. übergeben werden, oder an andere Klassen welche <classname>Zend_Http_Client</classname>
  187. verwenden um damit den Standardclient zu ersetzen welcher andernfalls verwendet werden
  188. würde.
  189. </para>
  190. </sect2>