nodejs - 与gmail-api连接

时间:2018-01-10 07:43:54

标签: node.js

我想让用户使用gmail连接到我的Google Developers Console。我在const express = require('express'); const google = require('googleapis'); const googleAuth = require('google-auth-library'); const credentials = require('../link/of/some/file.json'); // google credential let clientSecret = credentials.web.client_secret; let clientId = credentials.web.client_id; let redirectUrl = credentials.web.redirect_uris[0]; const SCOPES = [ 'https://mail.google.com/', 'https://www.googleapis.com/auth/gmail.modify', 'https://www.googleapis.com/auth/gmail.readonly' ]; let auth = new googleAuth(); let oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); app.get('/connect', (req, res) => { let authUrl = oauth2Client.generateAuthUrl({ access_type: 'offline', scope: SCOPES }); res.redirect(authUrl); }); 创建了一个项目。然后使用以下代码:

/connect

调用code时,会重定向到Google页面以验证用户。用户访问他/她的帐户后,Google会自动使用app.get('/auth/callback', (req, res) => { // 'req.query.code' is provided by google return oauth2Client.getToken(req.query.code, (err, token) => { // token value: /* { access_token: 'ya29.Gls2Ba_rXEA5EoBaFH5bPdDDzgaSWOtb0GSJcnaTP47Jh7HwHdF2ZJZOlQaCJBC5wjpq-sOLBVlIM9L8BMslVyHw22nveU0MwQ4iJPTq5vkjXDeitqtoYH8JO83w', refresh_token: '1/S0C3w-8vnqcrGE4Z2mSW9ctYkaitVuZquBSJ0WJJHUs', token_type: 'Bearer', expiry_date: 1514897380473 } */ }); }); 查询参数调用以下API:

 Intent i = new Intent(context, YourAcitivityName.class);
     i.putExtra("position",p);
    startActivityForResult(i, 1);

现在,我的问题是,在上面的令牌值中,我无法理解如何从该令牌获取gmail地址。我错过了什么?

有什么建议吗?提前致谢。

2 个答案:

答案 0 :(得分:0)

我建议的第一步是将您的令牌存储在某处,这样您就不会一直请求它。

然后,当您收到令牌时,请将其放入oauth2Client.credentials

 oauth2Client.getToken(req.query.code, (err, token) => {
      if (err) {
        console.log(err);
        return;
      }
      //TODO: Save token somewhere

      oauth2Client.credentials = token;

    });

然后您使用oauth2Client进行API调用

 var gmail = google.gmail('v1');
  gmail.users.labels.list({
    auth: oauth2Client,
    userId: 'me',
  }, function(err, response) {
    if (err) {
      console.log('The API returned an error: ' + err);
      return;
    }
    var labels = response.labels;
    if (labels.length == 0) {
      console.log('No labels found.');
    } else {
      console.log('Labels:');
      for (var i = 0; i < labels.length; i++) {
        var label = labels[i];
        console.log('- %s', label.name);
      }
    }
  });

答案 1 :(得分:0)

<强>解决: 我已经解决了这个问题,只需调用getProfile,其中userId为me。我的代码如下:

const SCOPES = [
   'https://mail.google.com/',
   'https://www.googleapis.com/auth/gmail.modify',
   'https://www.googleapis.com/auth/gmail.readonly',
   'https://www.googleapis.com/auth/gmail.compose'
];

app.get('/auth/callback', (req, res) => {

return oauth2Client.getToken(req.query.code, (err, token) => {
    oauth2Client.credentials = token;
    var gmail = google.gmail('v1');
    gmail.users.getProfile({
      auth: oauth2Client,
      userId: "me",
    }, function(error, response) {
          console.log("getProfile : ", {error, response});
          /*
             output:
               {
                 emailAddress: 'some.address@gmail.com',
                 messagesTotal: xxx,
                 threadsTotal: xxx,
                 historyId: 'xxxxx' 
              } 
          */
      });

    });
});

感谢你们所有人。