Подтвердить что ты не робот

Nodemailer/Gmail - Что такое токен обновления и как его получить?

Я пытаюсь создать простую форму контакта в приложении node, используя nodemailer. Я хочу, чтобы все сообщения были отправлены из учетной записи gmail, созданной для этой цели, в мою почтовую почту.

на стороне клиента, все, что я делаю, - это получить имя/почту/сообщение клиента и отправить его на сервер. Он работает нормально локально, но не работает при развертывании (на heroku btw).

После быстрого поиска мне кажется, что я должен создать ClientId и ClientSecret из Google Developers Console, что я и сделал, но когда дело доходит до создания "токена обновления", я полностью потерял.

    var smtpTransport = nodemailer.createTransport("SMTP",{
        service:"Gmail",
        auth:{
            XOAuth2: {
                user:"[email protected]",
                clientId:"",
                clientSecret:"",
                refreshToken:""
            }
        }
    });

Я запутался. Что такое токен обновления и как его получить?

4b9b3361

Ответ 1

Примечания по этому ответу автор:

Итак, мне наконец удалось разобраться. Я удивлен, что не мог найти больше ресурсов для этого, поэтому для тех, кто должен использовать Gmail с Nodemailer

Я нашел ответ здесь: http://masashi-k.blogspot.fr/2013/06/sending-mail-with-gmail-using-xoauth2.html

Попробуйте создать нового пользователя, если у вас уже есть один, и все не работает нормально. Это было для меня.

Я надеюсь, что это будет полезно кому-то,

Приветствия


Вопрос 1: Что такое токен обновления?

Из найденной документации здесь:

Ток обновления предоставляет вашему приложению постоянный доступ к API Google, пока пользователь не зашел в ваше приложение.

(...)

Вопросы:

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

  • Существуют ли ограничения на количество токенов обновления, которые выдаются - один лимит на комбинацию клиент/пользователь, а другой - на каждого пользователя для всех клиентов. Если ваше приложение запрашивает слишком много токенов обновления, оно может работать в этих пределах, и в этом случае старые токены обновления перестают работать.

См. также Автономный доступ и Использование токена обновления.


Вопрос 2: Как мне получить?

Шаг 1: Получить учетные данные OAuth 2.0 в Google Developers Console

Как указано здесь, вы должны:

  • Перейдите в Консоль разработчиков Google.
  • Выберите проект или создайте новый.
  • На боковой панели слева разверните API и авторизуйтесь. Затем нажмите API. Выберите ссылку Включенные API в разделе API, чтобы просмотреть список всех поддерживаемых API. Убедитесь, что "API Gmail" включен в список разрешенных API. Если вы не включили его, выберите API-интерфейс Gmail из списка API (в соответствии с API Google Apps), а затем выберите Включить API для API.
  • На боковой панели слева выберите Учетные данные.
  • Если вы еще этого не сделали, создайте свои учетные данные OAuth 2.0 проекта, нажав Создать новый идентификатор клиента и предоставив информацию, необходимую для создания учетных данных.

Image from the blog post linked above

  1. Найдите таблицу Client ID и Client в таблице, связанной с каждым вашим учетным данными.

Image from the blogpost linked above


ОПЛАТИТЬ СПЕЦИАЛЬНОЕ ВНИМАНИЕ, указав https://developers.google.com/oauthplaygroundкак Redirect URI, когда вы создаете нового пользователя в консоли. В противном случае вы получите сообщение об ошибке.


Шаг 2: Получите токен обновления на Google OAuth2.0 Playground

  • Перейдите на Игровая площадка Google Oauth2.0.
  • Нажмите кнопку Gear на правом верхнем углу. Задайте Идентификатор клиента и Клиентская конфиденциальность, полученный из Google Developers Console, и выберите Доступ к токену как Заголовок авторизации с префиксом носителей. Закройте эту конфигурацию.

Image from the blogpost above

  1. Настройте области. Используйте https://mail.google.com/ так, как вам нужно, Nodemailer. Затем нажмите кнопку Авторизовать API.

enter image description here

  1. После авторизации OAuth2.0, код авторизации обмена для токенов и voilá! ваш токен обновления готов к использованию

Image from the blogpost specified above

Ответ 2

Для тех, кто искал рабочий пример/фрагмент кода, следуйте за Radioreve Answer, пока не сможете получить токен доступа и обновить токен. (В принципе, зайдите на игровую площадку, убедитесь, что она запрашивает доступ для отправки почты и mail.google.com, дает разрешение, код авторизации обмена для токенов)

Обратите внимание, что введенное время expires было new Date().getTime() + 2000, которое было близко к секундам, указанным на игровой площадке. Я не уверен, должен ли я вводить токен доступа и время истечения срока точно, поскольку он, кажется, обновляет токен автоматически.

Используйте этот пример кода, написанный в ECMAScript 6:

    const user_name     = '[email protected]';
    const refresh_token = '';
    const access_token  = '';
    const client_id     = '';
    const client_secret = '';

    const email_to = '[email protected]';

    const nodemailer = require('nodemailer');

    let transporter = nodemailer
    .createTransport({
        service: 'Gmail',
        auth: {
            type: 'OAuth2',
            clientId: client_id,
            clientSecret: client_secret
        }
    });
    transporter.on('token', token => {
        console.log('A new access token was generated');
        console.log('User: %s', token.user);
        console.log('Access Token: %s', token.accessToken);
        console.log('Expires: %s', new Date(token.expires));
    });
    // setup e-mail data with unicode symbols
    let mailOptions = {
        from    : user_name, // sender address
        to      : email_to, // list of receivers
        subject : 'Hello ✔', // Subject line
        text    : 'Hello world ?', // plaintext body
        html    : '<b>Hello world ?</b>', // html body

        auth : {
            user         : user_name,
            refreshToken : refresh_token,
            accessToken  : access_token,
            expires      : 1494388182480
        }
    };

    // send mail with defined transport object
    transporter.sendMail(mailOptions, function (error, info) {
        if (error) {
            return console.log(error);
        }
        console.log('Message sent: ' + info.response);
    });