首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs -与gmail-api连接

nodejs -与gmail-api连接
EN

Stack Overflow用户
提问于 2018-01-10 07:43:54
回答 2查看 247关注 0票数 0

我想让用户用gmail连接到我的gmail。我在Google Developers Console中创建了一个项目。然后使用以下代码:

代码语言:javascript
复制
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页面来验证用户。用户访问他/她的帐户后,谷歌将使用code查询参数自动调用以下api:

代码语言:javascript
复制
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地址。我少了什么?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-10 08:14:10

解决了:我已经解决了这个问题,只需调用getProfile,userId就是me。我的代码如下:

代码语言:javascript
复制
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' 
              } 
          */
      });

    });
});

感谢你们所有人。

票数 0
EN

Stack Overflow用户

发布于 2018-01-10 08:07:53

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

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

代码语言:javascript
复制
 oauth2Client.getToken(req.query.code, (err, token) => {
      if (err) {
        console.log(err);
        return;
      }
      //TODO: Save token somewhere

      oauth2Client.credentials = token;

    });

然后使用oauth2Client进行API调用。

代码语言:javascript
复制
 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);
      }
    }
  });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48182508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档