| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <sect1 id="zend.gdata.authsub">
- <title>Authenticating with AuthSub</title>
- <para>
- The AuthSub mechanism enables you to write web applications
- that acquire authenticated access Google Data services,
- without having to write code that handles user credentials.
- </para>
- <para>
- See <ulink url="http://code.google.com/apis/accounts/AuthForWebApps.html">http://code.google.com/apis/accounts/AuthForWebApps.html</ulink>
- for more information about Google Data AuthSub authentication.
- </para>
- <para>
- The Google documentation says the ClientLogin mechanism is appropriate
- for "installed applications" whereas the AuthSub mechanism is
- for "web applications." The difference is that AuthSub requires
- interaction from the user, and a browser interface that can react
- to redirection requests. The ClientLogin solution uses PHP code to
- supply the account credentials; the user is not required to enter her
- credentials interactively.
- </para>
- <para>
- The account credentials supplied via the AuthSub mechanism are
- entered by the user of the web application. Therefore they must be
- account credentials that are known to that user.
- </para>
- <note>
- <title>Registered applications</title>
- <para>
- <classname>Zend_Gdata</classname> currently does not support use of secure tokens, because
- the AuthSub authentication does not support passing a digital certificate
- to acquire a secure token.
- </para>
- </note>
- <sect2 id="zend.gdata.authsub.login">
- <title>Creating an AuthSub authenticated Http Client</title>
- <para>
- Your PHP application should provide a hyperlink to the
- Google URL that performs authentication. The static function
- <classname>Zend_Gdata_AuthSub::getAuthSubTokenUri()</classname>
- provides the correct URL. The arguments to this function include
- the URL to your PHP application so that Google can redirect the
- user's browser back to your application after the user's
- credentials have been verified.
- </para>
- <para>
- After Google's authentication server redirects the user's browser
- back to the current application, a GET request parameter is set,
- called <code>token</code>.
- The value of this parameter is a single-use token that can be
- used for authenticated access.
- This token can be converted into a multi-use token and stored
- in your session.
- </para>
- <para>
- Then use the token value in a call to
- <classname>Zend_Gdata_AuthSub::getHttpClient()</classname>.
- This function returns an instance of <classname>Zend_Http_Client</classname>,
- with appropriate headers set so that subsequent requests your
- application submits using that Http Client are also authenticated.
- </para>
- <para>
- Below is an example of PHP code for a web application
- to acquire authentication to use the Google Calendar service
- and create a <classname>Zend_Gdata</classname> client object using that authenticated
- Http Client.
- </para>
- <programlisting language="php"><![CDATA[
- $my_calendar = 'http://www.google.com/calendar/feeds/default/private/full';
- if (!isset($_SESSION['cal_token'])) {
- if (isset($_GET['token'])) {
- // You can convert the single-use token to a session token.
- $session_token =
- Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
- // Store the session token in our session.
- $_SESSION['cal_token'] = $session_token;
- } else {
- // Display link to generate single-use token
- $googleUri = Zend_Gdata_AuthSub::getAuthSubTokenUri(
- 'http://'. $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'],
- $my_calendar, 0, 1);
- echo "Click <a href='$googleUri'>here</a> " .
- "to authorize this application.";
- exit();
- }
- }
- // Create an authenticated HTTP Client to talk to Google.
- $client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['cal_token']);
- // Create a Gdata object using the authenticated Http Client
- $cal = new Zend_Gdata_Calendar($client);
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.gdata.authsub.logout">
- <title>Revoking AuthSub authentication</title>
- <para>
- To terminate the authenticated status of a given token, use the
- <classname>Zend_Gdata_AuthSub::AuthSubRevokeToken()</classname>
- static function. Otherwise, the token is still valid for
- some time.
- </para>
- <programlisting language="php"><![CDATA[
- // Carefully construct this value to avoid application security problems.
- $php_self = htmlentities(substr($_SERVER['PHP_SELF'],
- 0,
- strcspn($_SERVER['PHP_SELF'], "\n\r")),
- ENT_QUOTES);
- if (isset($_GET['logout'])) {
- Zend_Gdata_AuthSub::AuthSubRevokeToken($_SESSION['cal_token']);
- unset($_SESSION['cal_token']);
- header('Location: ' . $php_self);
- exit();
- }
- ]]></programlisting>
- <note>
- <title>Security notes</title>
- <para>
- The treatment of the <code>$php_self</code> variable in the
- example above is a general security guideline, it is not
- specific to <classname>Zend_Gdata</classname>. You should always filter content you
- output to http headers.
- </para>
- <para>
- Regarding revoking authentication tokens, it is recommended to
- do this when the user is finished with her Google Data session.
- The possibility that someone can intercept the token and use
- it for malicious purposes is very small, but nevertheless it is
- a good practice to terminate authenticated access to any service.
- </para>
- </note>
- </sect2>
- </sect1>
|