Я занимаюсь разработкой базового c приложения, которое просто считывает электронные письма из определенной c учетной записи gmail (скажем, fakeEmail@gmail.com). При первом запуске приложению предоставляется разрешение на чтение электронных писем fakeEmail@gmail.com. И access_token , expiry_date (1 час) и refresh_token et c сохраняются в файле 'token. json'.
При последующих запусках даже после истечения срока действия токена доступа я НЕ вижу запрос на обновление токена sh, но приложение может получать и читать электронные письма с fakeEmail@gmail.com.
Приложение запускается из командной строки как 'узел приложения. js' , оно извлекает электронные письма со специфической меткой c и печатает содержимое электронной почты на консоли.
Метод authorize () - первый, вызываемый при каждом запуске приложения. getNewToken () вызывается только при первом запуске и создает файл '. json' , когда пользователь fakeEmail@gmail.com разрешает приложению читать его электронные письма.
Вот соответствующий код для этого простого приложения:
const SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
const TOKEN_PATH = 'token.json';
const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');
function authorize(credentials, callback) {
const {client_secret, client_id, redirect_uris} = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);
// Check if we have previously stored a token.
fs.readFile(TOKEN_PATH, (err, token) => {
if (err) return getNewToken(oAuth2Client, callback);
oAuth2Client.setCredentials(JSON.parse(token));
callback(oAuth2Client);
});
}
function getNewToken(oAuth2Client, callback) {
const authUrl = oAuth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES,
});
console.log('Authorize this app by visiting this url:', authUrl);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.question('Enter the code from that page here: ', (code) => {
rl.close();
oAuth2Client.getToken(code, (err, token) => {
if (err)
return console.error('Error retrieving access token', err);
oAuth2Client.setCredentials(token);
// Store the token to disk for later program executions
fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
if (err) return console.error(err);
console.log('Token stored to', TOKEN_PATH);
});
callback(oAuth2Client);
});
});
}
function startApp(){
fs.readFile('gmailCredentials.json', (err, content) => {
if (err)
return console.log('Error loading client secret file:', err);
authorize(JSON.parse(content), function(auth){
checkForMailsWithLabel(auth, strLabel, function(err, res){
console.log("auth holds: " + util.inspect(auth) );
// this prints the same accessToken and expiration as the one we have in 'token.json'
// Even though the token is expired, the app is still able to read the emails
});
});
});
}
Код, который вы видите здесь, является почти точной копией образца, который они имеют на github: https://github.com/gsuitedevs/node-samples/blob/master/gmail/quickstart/index.js
Если это имеет значение, я еще не завершил процесс проверки с помощью Google для этого приложения. Поскольку я тестирую свою собственную учетную запись электронной почты, ненадежное предупреждение во время предоставления разрешения на данный момент не является проблемой.
Мой вопрос / предположение состояло в том, что библиотека googleapi проверит чтобы проверить, не истек ли токен доступа, и если он есть, он автоматически запросит другой токен и запишет его в файл 'token. json' .
Но, насколько я могу судить по запуску этого кода, файл 'token. json' создается при первом запуске. И даже если срок действия expiry_date (1 час) истек, библиотека Google не запрашивает другой токен. Я говорю это потому, что:
- Я не вижу никаких обновлений для 'token. json'
- Даже после успешной загрузки писем, токен, который был бы использован для fetch содержит тот же токен доступа и срок действия.
Я мог бы написать код, чтобы проверить, прошло ли expiry_date и может быть принудительно вызвать refre sh из access_token, Но это не объясняет, почему мое приложение может получать письма с токеном с истекшим сроком действия.
Я бы предпочел использовать рекомендуемый метод и позволить библиотеке обрабатывать токен, если он должен.
Пожалуйста, совет, что мне здесь не хватает.