Note that there are some explanatory texts on larger screens.

plurals
  1. POTrying to import gmail contacts using node.js
    text
    copied!<p>I'm trying to import gmail contacts. I have successfully obtained the access_token but when trying to get the contacts browser keeps throwing the error. invalid_grant</p> <p>my codes below.</p> <p>for authentication and callback.</p> <pre><code> authorize: function(req, res){ var CLIENT_ID = '927112080821-vhsphqc79tb5ohfgpuvrp8uhh357mhad.apps.googleusercontent.com'; var CLIENT_SECRET = 'gdgofL0RfAXX0in5JEiQiPW8'; var SCOPE = 'https://www.google.com/m8/feeds'; oa = new oauth.OAuth2(CLIENT_ID, CLIENT_SECRET, "https://accounts.google.com/o", "/oauth2/auth", "/oauth2/token"); res.redirect(oa.getAuthorizeUrl({scope:SCOPE, response_type:'code', redirect_uri:'http://localhost:1234/callback'})); }, callback: function(req, res){ console.log(req.query.code); oa.getOAuthAccessToken(req.query.code, {grant_type:'authorization_code', redirect_uri:'http://localhost:1234/callback'}, function(err, access_token, refresh_token) { if (err) { res.end('error: ' + JSON.stringify(err)); } else { getContactsFromGoogleApi(access_token); //res.write('access token: ' + access_token + '\n'); //res.write('refresh token: ' + refresh_token); //res.end(); } }); }, </code></pre> <p>for importing contacts</p> <pre><code>function getContactsFromGoogleApi (access_token, req, res, next) { console.log('access_token ' + access_token); request.get({ url: 'https://www.google.com/m8/feeds/contacts/default/full', qs: { alt: 'json', 'max-results': 1000, 'orderby': 'lastmodified' }, headers: { 'Authorization': 'OAuth ' + access_token, 'GData-Version': '3.0' } }, function (err, res, body) { if(res.statusCode === 401){ return res.redirect('index'); } var feed = JSON.parse(body); var users = feed.feed.entry.map(function (c) { var r = {}; if(c['gd$name'] &amp;&amp; ['gd$fullName']){ r.name = c['gd$name']['gd$fullName']['$t']; } if (c['gd$email'] &amp;&amp; c['gd$email'].length &gt; 0) { r.email = c['gd$email'][0]['address']; r.nickname = r.email;//c['gd$email'][0]['address'].split('@')[0]; } if(c['link']){ var photoLink = c['link'].filter(function (link) { return link.rel == 'http://schemas.google.com/contacts/2008/rel#photo' &amp;&amp; 'gd$etag' in link; })[0]; if(photoLink) { r.picture = '/users/photo?l=' + encodeURIComponent(photoLink.href); } else if (r.email) { r.picture = gravatar.url(r.email, { s: 40, d: "https://ssl.gstatic.com/s2/profiles/images/silhouette80.png"}); } } return r; }).filter(function (u) { return !!u.email &amp;&amp; //we can only give access to persons with email at this point !~u.email.indexOf('@reply.'); //adress with @reply. are usually temporary reply address for forum kind of websites. }); res.json(users); }); </code></pre> <p>}</p> <p>really appreciate help.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload