我想让用户用gmail连接到我的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被调用时,它将重定向到google页面来验证用户。用户访问他/她的帐户后,谷歌将使用code查询参数自动调用以下api:
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地址。我少了什么?
有什么建议吗?提前谢谢。
发布于 2018-01-10 08:14:10
解决了:我已经解决了这个问题,只需调用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'
}
*/
});
});
});感谢你们所有人。
发布于 2018-01-10 08:07:53
我建议的第一步是将您的令牌存储在某个地方,这样您就不会一直请求它。
然后当您收到令牌时,将其放入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);
}
}
});https://stackoverflow.com/questions/48182508
复制相似问题