Nodemailer/Gmail - czym dokładnie jest token odświeżania i jak go zdobyć?

Próbuję zrobić prosty formularz kontaktowy w aplikacji węzła, używając nodemailer. Chcę, aby wszystkie msg zostały wysłane z konta gmail, które zrobiłem w tym celu, na moją osobistą pocztę.

Po stronie klienta, wszystko, co robię, to pobranie nazwy/poczty / wiadomości Klienta i wysłanie jej na serwer. Działa dobrze lokalnie, ale nie działa po wdrożeniu (na heroku btw).

Po szybkim wyszukiwaniu wydaje mi się, że muszę wygenerować ClientId i ClientSecret z konsoli programistów Google - którą did - ale jeśli chodzi o generowanie "odświeżania tokena" iI ' M całkowicie stracone.

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

Jestem zdezorientowany: czym dokładnie jest token odświeżania i jak go zdobyć ?

Author: Ignacio Correia, 2014-06-07

2 answers

Uwagi tego autora oryginału:

Więc w końcu udało mi się to rozgryźć. Jestem zaskoczony, że nie mogłem znaleźć więcej ressources na ten temat, więc dla tych, którzy muszą używać Gmail z Nodemailer

Znalazłem odpowiedź tutaj: http://masashi-k.blogspot.fr/2013/06/sending-mail-with-gmail-using-xoauth2.html

Spróbuj utworzyć nowego użytkownika, jeśli już go masz i nie działa dobrze. Tak było w przypadku mnie.

Mam nadzieję, że to przyda się komuś,

Na zdrowie


Pytanie 1: Czym dokładnie jest token odświeżania?

Z dokumentacji znalezionej tutaj :

Token odświeżania zapewnia Twojej aplikacji stały dostęp do interfejsów API Google, gdy użytkownik nie jest zalogowany do Twojej aplikacji.

(...)

Rozważania:

  • Pamiętaj, aby przechowywać token odświeżania bezpiecznie i trwale, ponieważ można uzyskać tylko odśwież token za pierwszym razem, gdy wykonujesz przepływ wymiany kodu.

  • Istnieją limity na liczbę tokenów odświeżania, które są wydawane-jeden limit na kombinację klient / użytkownik, a drugi na użytkownika we wszystkich klientach. Jeśli aplikacja zażąda zbyt wielu tokenów odświeżania, może przekroczyć te limity, w takim przypadku starsze tokeny odświeżania przestaną działać.

Zobacz także Dostęp Offline i przy użyciu odświeżania token .


Pytanie 2: Jak mogę je zdobyć?

Krok 1: Uzyskaj dane uwierzytelniające OAuth 2.0 na konsoli programistów Google]}

Jak stwierdzono tutaj , powinieneś:

  1. przejdź do konsoli programistów Google.
  2. Wybierz projekt lub utwórz nowy.
  3. na pasku bocznym po lewej stronie rozwiń API i auth . Następnie kliknij API . Wybierz łącze Enabled API w sekcji API, aby zobaczyć listę wszystkie włączone interfejsy API. Upewnij się, że "Gmail API" znajduje się na liście włączonych interfejsów API. Jeśli nie została włączona, wybierz API Gmaila z listy interfejsów API (w obszarze interfejsy API Google Apps), a następnie wybierz przycisk włącz API dla tego API.
  4. na pasku bocznym po lewej stronie Wybierz poświadczenia .
  5. jeśli jeszcze tego nie zrobiłeś, Utwórz poświadczenia OAuth 2.0 twojego projektu, klikając Utwórz nowy identyfikator klienta i podając informacje potrzebne do utworzenia poświadczenia.

Obrazek z bloga podlinkowanego powyżej

  1. poszukaj Client ID i Client secret w tabeli związanej z każdym z Twoich danych uwierzytelniających.

Obrazek z bloga podlinkowanego powyżej


Zwróć szczególną uwagę na określenie https://developers.google.com/oauthplayground jako przekierowanie URI {[7] } podczas tworzenia nowego Użytkownika w konsoli. W przeciwnym razie będziesz miał błąd.


Krok 2: Uzyskaj token odświeżania w Google OAuth2.0 Plac zabaw

  1. przejdź do Google OAuth2.0 .
  2. Kliknij przycisk koła zębatego W prawym górnym rogu. Ustaw Client ID i Client Secret uzyskane z Google Developers Console i wybierz Access token location jako Authorization header z prefiksem Bearer . Zamknij tę nakładkę konfiguracji.

Obrazek z bloga powyżej

    Ustaw lunety. Użyj https://mail.google.com/, ponieważ jest to jeden potrzebny przez nodemailer. Następnie kliknij przycisk Autoryzuj interfejsy API .

Tutaj wpisz opis obrazka

  1. po autoryzacji OAuth2.0, wymień kod autoryzacyjny na tokeny i voilá! twój token odświeżania jest gotowy do użycia

Obrazek z podanego powyżej bloga

 92
Author: Radioreve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-02 15:40:35

Dla tych, którzy rozglądali się za działającym przykładem/fragmentem kodu, postępuj zgodnie z odpowiedzią Radioreve, aż będziesz w stanie uzyskać token dostępu i odświeżyć token. (Zasadniczo idź na plac zabaw, upewnij się, że prosi o dostęp do wysyłania poczty i mail.google.com, give permission, exchange authorization code for tokens)

Zauważ, że expires czas, który wprowadziłem był new Date().getTime() + 2000, który był zbliżony do sekund wygaśnięcia widocznych na placu zabaw. Nie jestem pewien, czy musiałem wprowadzić token dostępu i czas wygaśnięcia dokładnie, ponieważ wydaje się automatycznie odświeżać token.

Użyj tego przykładowego kodu napisanego w 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);
    });
 6
Author: Logan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-11 07:12:08