web-dev-qa-db-fra.com

Nodemailer / Gmail - Qu'est-ce qu'un jeton d'actualisation et comment en obtenir un?

J'essaie de faire un simple formulaire de contact dans une application de nœud, en utilisant nodemailer. Je souhaite que tous les msg soient envoyés depuis un compte gmail créé à cet effet, vers mon mail personnel.

côté client, je ne fais qu'obtenir le nom/mail/message du client et l'envoyer au serveur. Il fonctionne bien localement mais ne fonctionne pas lors du déploiement (sur heroku btw).

Après une recherche rapide, il semble que je doive générer un ClientId et ClientSecret à partir de Google Developers Console - ce que j'ai fait - mais quand il s'agit de générer un "jeton d'actualisation" je suis complètement perdu .

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

Je suis confus: Qu'est-ce qu'un jeton d'actualisation et comment en obtenir un?

29
Radioreve

Notes de l'auteur de cette réponse:

Alors, j'ai finalement réussi à le comprendre. Je suis surpris de ne pas avoir trouvé plus de ressources à ce sujet, donc pour ceux qui ont besoin d'utiliser Gmail avec Nodemailer

J'ai trouvé la réponse ici: http://masashi-k.blogspot.fr/2013/06/sending-mail-with-gmail-using-xoauth2.html

Essayez de créer un nouvel utilisateur si vous en avez déjà un et que les choses ne fonctionnent pas bien. C'était le cas pour moi.

J'espère que cela sera utile à quelqu'un,

À votre santé


Question 1: Qu'est-ce qu'un jeton d'actualisation exactement?

D'après la documentation trouvée ici :

Un jeton d'actualisation fournit à votre application un accès continu aux API Google lorsque l'utilisateur n'est pas connecté à votre application.

(...)

Considérations:

  • Veillez à stocker le jeton d'actualisation en toute sécurité et de façon permanente, car vous ne pouvez obtenir un jeton d'actualisation que la première fois que vous effectuez le flux d'échange de code.

  • Le nombre de jetons d'actualisation émis est limité: une limite par combinaison client/utilisateur et une autre par utilisateur sur tous les clients. Si votre application demande trop de jetons d'actualisation, elle peut s'exécuter dans ces limites, auquel cas les anciens jetons d'actualisation cessent de fonctionner.

Voir aussi Accès hors ligne et tilisation d'un jeton d'actualisation .


Question 2: Comment en obtenir un?

Étape 1: Obtenez OAuth 2.0 informations d'identification sur Google Developers Console

Comme indiqué ici , vous devez:

  1. Accédez à Google Developers Console .
  2. Sélectionnez un projet ou créez-en un nouveau.
  3. Dans la barre latérale à gauche, développez APIs & auth. Ensuite, cliquez sur API. Sélectionnez le lien API activées dans la section API pour voir une liste de toutes vos API activées. Assurez-vous que l '"API Gmail" figure dans la liste des API activées. Si vous ne l'avez pas activé, sélectionnez l'API Gmail dans la liste des API (sous API Google Apps), puis sélectionnez le bouton Activer l'API pour l'API.
  4. Dans la barre latérale à gauche, sélectionnez Informations d'identification.
  5. Si vous ne l'avez pas déjà fait, créez les informations d'identification OAuth 2.0 de votre projet en cliquant sur Créer un nouvel ID client, et fournissez les informations nécessaires pour créer les informations d'identification.

Image from the blog post linked above

  1. Recherchez le ID client et Client secret dans le tableau associé à chacune de vos informations d'identification.

Image from the blogpost linked above


FAITES ATTENTION À spécifiant https://developers.google.com/oauthplayground en tant que Rediriger l'URI lorsque vous créez un nouvel utilisateur dans la console. Sinon, vous aurez une erreur.


Étape 2: Obtenez le jeton d'actualisation sur Google OAuth2.0 Playground

  1. Allez dans le Google Oauth2.0 Playground .
  2. Cliquez sur le bouton Gear en haut à droite. Définissez votre ID client et Secret client obtenu à partir de la Google Developers Console , et sélectionnez Accéder à l'emplacement du jeton as En-tête d'autorisation avec préfixe de porteur. Fermez cette superposition de configuration.

Image from the blogpost above

  1. Configurez les étendues. Utilisation https://mail.google.com/ car c'est le seul besoin de nodemailer. Cliquez ensuite sur le bouton Autoriser les API.

enter image description here

  1. Après l'autorisation OAuth2.0, échangez le code d'autorisation pour les jetons et voilá! votre jeton d'actualisation est prêt à l'emploi

Image from the blogpost specified above

70
Radioreve

Pour ceux qui ont cherché un exemple de travail/extrait de code, suivez la réponse de Radioreve jusqu'à ce que vous puissiez obtenir le jeton d'accès et le jeton d'actualisation. (Fondamentalement, allez sur le terrain de jeu, assurez-vous qu'il demande l'accès pour envoyer du courrier et mail.google.com, donnez la permission, échangez le code d'autorisation pour les jetons)

Notez que l'heure expires que j'ai entrée était new Date().getTime() + 2000, ce qui était proche des secondes d'expiration vues sur le terrain de jeu. Je ne sais pas si j'ai dû entrer le jeton d'accès et l'heure d'expiration avec précision car il semble actualiser automatiquement le jeton.

Utilisez cet exemple de code écrit dans 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);
    });
5
Logan