googleclientlogin
Version:
Log in to Google services using CllientLogin method
216 lines (215 loc) • 8.49 kB
HTML
<h2 id="google-s-clientlogin-authentication-implementation-for-node-js">Google's ClientLogin authentication implementation for Node.js</h2>
<h3 id="requires-at-least-nodejs-0-4-1">Requires at least nodejs 0.4.1</h3>
<h4 id="properties-">Properties:</h4>
<h5 id="errors-">errors:</h5>
<p><em>That is an object, filled with the possible error messages.</em></p>
<h5 id="accounttypes-">accountTypes:</h5>
<p><em>An object, where you can set the type of account to request authorization for.</em>
properties are: <em>google</em>, <em>hosted</em>, <em>hostedOrGoogle</em> default is <strong>hostedOrGoogle</strong></p>
<h4 id="events-">Events:</h4>
<h5 id="login-">login:</h5>
<p><em>emitted when login was success</em></p>
<h5 id="error-">error:</h5>
<p><em>emitted when an error occured. Has two parameters, the response object and the received data</em></p>
<p>You can access to their names via constants: GoogleClientLogin.events.login or
GoogleClientLogin.events.error or you can use 'login' and 'error' as string.</p>
<h4 id="methods-">Methods:</h4>
<h5 id="login">login</h5>
<p><em>Starts the login process. It has one optional parameter, which should be an object with two properties:</em></p>
<p><strong>logincaptcha</strong>, <strong>logintoken.</strong></p>
<p>The logincaptcha is the user's answer to the captcha question</p>
<p>You will receive the logintoken if the login failed and the CaptchaRequired error code arrived</p>
<p>You must pass both the logincaptcha and logintoken if you must pass a captcha challange</p>
<h5 id="getauthid">getAuthId</h5>
<p><em>Returns the value of the authId key from the response.</em> If the login was success you will need to use this value to perform additional requests. You must put it into a the Authorization header like this:
<code style="margin:0 0.1em;padding:0 0.2em;background-color:#f8f8f8;border:1px solid #eaeaea;border-radius:3px;">'Authorization': 'GoogleLogin auth=' + googleAuth.getAuthId(),</code></p>
<h5 id="getsid">getSID</h5>
<p><em>Returns the value of SID key from the response.</em></p>
<h5 id="getlsid">getLSID</h5>
<p><em>Returns the value of LSID key from the response.</em></p>
<h5 id="iscaptcharequired">isCaptchaRequired</h5>
<p><em>If the login was not success and the user need to pass a captcha challenge this method will return true</em></p>
<h5 id="getcaptchaurl">getCaptchaUrl</h5>
<p><em>Url of the captcha image</em></p>
<h5 id="getcaptchatoken">getCaptchaToken</h5>
<p><em>You will need to pass it back to the google with the user's answer to the captcha if the login failed and captcha authentication required.</em></p>
<h5 id="geterror">getError</h5>
<p><em>If the login was not success, google will send back an error code what you can get with this method</em></p>
<p>After the login was success, you should use the AuthId in each of your requests, see example below</p>
<p><a href="http://code.google.com/apis/gdata/faq.html#clientlogin">http://code.google.com/apis/gdata/faq.html#clientlogin</a>
list of services:</p>
<table>
<thead>
<tr>
<th>Name</th>
<th>name in googleclientlogin module</th>
<th>value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Google Adwords APIs:</td>
<td>adwords:</td>
<td>'adwords'</td>
</tr>
<tr>
<td>Google Analytics Data APIs:</td>
<td>analytics:</td>
<td>'analytics'</td>
</tr>
<tr>
<td>Google Apps APIs (Domain Information & Management):</td>
<td>apps:</td>
<td>'apps'</td>
</tr>
<tr>
<td>Google Base Data API:</td>
<td>base:</td>
<td>'gbase'</td>
</tr>
<tr>
<td>Google Sites Data API:</td>
<td>sites:</td>
<td>'jotspot'</td>
</tr>
<tr>
<td>Blogger Data API:</td>
<td>blogger:</td>
<td>'blogger'</td>
</tr>
<tr>
<td>Book Search Data API:</td>
<td>book:</td>
<td>'print'</td>
</tr>
<tr>
<td>Calendar Data API:</td>
<td>calendar:</td>
<td>'cl'</td>
</tr>
<tr>
<td>Google Code Search Data API:</td>
<td>codesearch:</td>
<td>'codesearch'</td>
</tr>
<tr>
<td>Contacts Data API:</td>
<td>contacts:</td>
<td>'cp'</td>
</tr>
<tr>
<td>Documents List Data API:</td>
<td>docs:</td>
<td>'writely'</td>
</tr>
<tr>
<td>Finance Data API:</td>
<td>finance:</td>
<td>'finance'</td>
</tr>
<tr>
<td>Gmail Atom feed:</td>
<td>mail:</td>
<td>'mail'</td>
</tr>
<tr>
<td>Health Data API:</td>
<td>health:</td>
<td>'health'</td>
</tr>
<tr>
<td>Health Data API H9 Sandbox</td>
<td>weaver:</td>
<td>'weaver'</td>
</tr>
<tr>
<td>Maps Data APIs:</td>
<td>maps:</td>
<td>'local'</td>
</tr>
<tr>
<td>Picasa Web Albums Data API:</td>
<td>picasaweb:</td>
<td>'lh2'</td>
</tr>
<tr>
<td>Sidewiki Data API:</td>
<td>sidewiki:</td>
<td>'annotateweb'</td>
</tr>
<tr>
<td>Spreadsheets Data API:</td>
<td>spreadsheets:</td>
<td>'wise'</td>
</tr>
<tr>
<td>Webmaster Tools API:</td>
<td>webmastertools:</td>
<td>'sitemaps'</td>
</tr>
<tr>
<td>YouTube Data API:</td>
<td>youtube:</td>
<td>'youtube'</td>
</tr>
<tr>
<td>C2DM Push Notification Service:</td>
<td>c2dm:</td>
<td>'ac2dm'</td>
</tr>
<tr>
<td>Google Reader Data API (unofficial):</td>
<td>reader:</td>
<td>'reader'</td>
</tr>
<tr>
<td>Google Voice API (unoffical):</td>
<td>voice:</td>
<td>'grandcentral'</td>
</tr>
<tr>
<td>Google Music API (unoffical):</td>
<td>sj:</td>
<td>'sj'</td>
</tr>
</tbody>
</table>
<h3 id="how-to-use-">How to use:</h3>
<pre><code style="display:block;padding:0.5em;background:#fdf6e3;color:#657b83;"><span class="keyword" style="color:#859900;">var</span> GoogleClientLogin = import(<span class="string" style="color:#2aa198;">'googleclientlogin'</span>).GoogleClientLogin;
<span class="keyword" style="color:#859900;">var</span> googleAuth = <span class="keyword" style="color:#859900;">new</span> GoogleClientLogin({
email: <span class="string" style="color:#2aa198;">'yourmail@gmail.com'</span>,
password: <span class="string" style="color:#2aa198;">'yourpassword'</span>,
service: <span class="string" style="color:#2aa198;">'contacts'</span>,
accountType: GoogleClientLogin.accountTypes.google
});
googleAuth.on(GoogleClientLogin.events.login, <span class="keyword" style="color:#859900;">function</span>(){
<span class="comment" style="color:#93a1a1;font-style:italic;">// do things with google services</span>
require(<span class="string" style="color:#2aa198;">'https'</span>).request({
host: <span class="string" style="color:#2aa198;">'www.google.com'</span>,
port: <span class="number" style="color:#2aa198;">443</span>,
path: path,
method: <span class="string" style="color:#2aa198;">'GET'</span>,
headers: {
<span class="string" style="color:#2aa198;">'Authorization'</span>: <span class="string" style="color:#2aa198;">'GoogleLogin auth='</span> + googleAuth.getAuthId(),
...
}
});
});
googleAuth.on(GoogleClientLogin.events.error, <span class="keyword" style="color:#859900;">function</span>(e) {
<span class="keyword" style="color:#859900;">switch</span>(e.message) {
<span class="keyword" style="color:#859900;">case</span> GoogleClientLogin.errors.loginFailed:
<span class="keyword" style="color:#859900;">if</span> (<span class="keyword" style="color:#859900;">this</span>.isCaptchaRequired()) {
requestCaptchaFromUser(<span class="keyword" style="color:#859900;">this</span>.getCaptchaUrl(), <span class="keyword" style="color:#859900;">this</span>.getCaptchaToken());
} <span class="keyword" style="color:#859900;">else</span> {
requestLoginDetailsAgain();
}
<span class="keyword" style="color:#859900;">break</span>;
<span class="keyword" style="color:#859900;">case</span> GoogleClientLogin.errors.tokenMissing:
<span class="keyword" style="color:#859900;">case</span> GoogleClientLogin.errors.captchaMissing:
<span class="keyword" style="color:#859900;">throw</span> <span class="keyword" style="color:#859900;">new</span> Error(<span class="string" style="color:#2aa198;">'You must pass the both captcha token and the captcha'</span>)
<span class="keyword" style="color:#859900;">break</span>;
}
<span class="keyword" style="color:#859900;">throw</span> <span class="keyword" style="color:#859900;">new</span> Error(<span class="string" style="color:#2aa198;">'Unknown error'</span>);
<span class="comment" style="color:#93a1a1;font-style:italic;">// damn..</span>
});
googleAuth.login();</code></pre>