Токен доступа Gmail Api не меняется после истечения срока действия, но доступ по-прежнему работает - PullRequest
0 голосов
/ 28 февраля 2020

Я занимаюсь разработкой базового 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 не запрашивает другой токен. Я говорю это потому, что:

  1. Я не вижу никаких обновлений для 'token. json'
  2. Даже после успешной загрузки писем, токен, который был бы использован для fetch содержит тот же токен доступа и срок действия.

Я мог бы написать код, чтобы проверить, прошло ли expiry_date и может быть принудительно вызвать refre sh из access_token, Но это не объясняет, почему мое приложение может получать письма с токеном с истекшим сроком действия.

Я бы предпочел использовать рекомендуемый метод и позволить библиотеке обрабатывать токен, если он должен.

Пожалуйста, совет, что мне здесь не хватает.

1 Ответ

1 голос
/ 03 марта 2020

В API Google Node.js Клиент , как указано в этом разделе :

Срок действия маркеров доступа истек. Эта библиотека автоматически использует токен обновления для получения нового токена доступа, если он скоро истекает.

Поэтому вам не нужно беспокоиться о том, чтобы получить новый токен самостоятельно. Хотя, поскольку вы используете Node.js Quickstart и каждый раз, когда вы его запускаете, вы устанавливаете учетные данные, используя .setCredentials(), поэтому вы явно объявляете токен доступа, беря его из json file.

Для получения дополнительной информации об обработке токенов вы можете проверить Google Auth Library .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...