【问题标题】:nodejs - connect with gmail-apinodejs - 与 gmail-api 连接
【发布时间】:2018-06-19 07:59:59
【问题描述】:

我想让用户使用他们的gmail 连接到我的node.js server。我在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被调用时,它会重定向到谷歌页面来验证用户。用户授予他/她帐户的访问权限后,google 会自动调用以下 api 并带有 code 查询参数:

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 
          }
       */
    });
});

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

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

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

    然后,当您收到令牌时,您将其放入 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);
          }
        }
      });
    

    【讨论】:

      【解决方案2】:

      已解决: 我已经解决了这个问题,只需调用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' 
                    } 
                */
            });
      
          });
      });
      

      谢谢大家。

      【讨论】:

        猜你喜欢
        • 2022-01-01
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-24
        • 2016-12-05
        • 2013-09-05
        • 1970-01-01
        相关资源
        最近更新 更多