Node mailer - Steinberg99/DogeMeet GitHub Wiki

Node-mailer

Voor het vak back-end heb ik gekozen voor de onderstaande topic:

#10 - Send registration e-mails with Node-mailer
You can use node-mailer to send e-mails to users. For example, when they are trying to log in.

Implementatie

In dit project wil ik nodemailer gaan gebruiken in combinatie met feature, het aanmaken van profielen. Nadat de gebruiker zijn naam, email en wachtwoord heeft gestuurd, krijgt de gebruiker een mail binnen met de ingevoerde gegevens zodat de gebruiker deze later kan terug zien.

Node-mailer

Nodemailer is een node.js module waarbij je emails kan verzenden vanaf jouw eigen server. Het fijne aan nodemailer is dat je het kan toepassen op verschillende manieren in je project. Denk aan het sturen van een email na registratie, een bevestigingsmail, een mail nadat je een formulier hebt opgestuurd, nieuwsbrieven, wachtwoord wijzigen en noem maar op.

SMTP

Nodemailer maakt gebruikt van SMTP dat staat voor 'Simple Mail Transfer Protocol'. Dit protocol wordt gebruikt om een email over het internet te versturen. Hoe gaat dit in zijn werking? Eerst specificeer je de afzender van het bericht, daarna de ontvanger(s) en vervolgens de verzendgegevens en de inhoud van de email. In nodemailer zijn dit de drie stappen:

1. Transporter object

In het transporter object schrijf je je gegevens op van de host service die je gebruikt. In mijn geval is dit Gmail.

  1. Geen OAuth: Als je geen gebruik maakt van OAuth2 kan je de email van de afzender in user zetten en het bijbehorende wachtwoord in pass. Vergeet niet om deze gegevens in je .env file te zetten zodat het geheim blijft.
  2. Wel OAuth: Als je wel gebruik maakt van OAuth ziet het transporter object er iets anders uit. Voeg de gegevens uit Stap 1 van 'Hoe gebruik je OAuth in Nodemailer toe aan het transporter object. Je kan de pass weglaten en vervangen door de credentials. Vergeet ook deze gegevens niet in je .env te zetten.
// create reusable transporter object using the default SMTP transport`
    let transporter = nodemailer.createTransport({`
    auth: {
      service: 'Gmail',
      user: testAccount.user, 
      pass: testAccount.pass, 
    },
  });`

2. Mail options

Het tweede deel van nodemailer is het maken van je email. Wat wil je hier in zetten? Nodemailer heeft verschillende opties die je kan gebruiken in je email. Je kunt ze vinden op message configuration van de nodemailer documentatie.

const mailOptions = {
  from: "[email protected]", // email afzender
  to: "[email protected]", // email ontvanger
  subject: "Message title", // Het onderwerp
  html: "<p>HTML version of the message</p>" //HTML versie van je mail.
};

3. Transporter.sendmail() method

In deze laatste stap kan je de transporter uit stap 1 verzenden met sendMail()

  transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
            return console.log(error);
        } else {
        console.log(`Mail sent to: ${}`);
      }
    });

Als alles goed is gegaan zou de nodemailer nu moeten werken. Het is altijd belangrijk om je applicatie zo goed mogelijk te beveiligen en geen risico's te hoeven lopen. In de volgende stappen zie je hoe je de OAuth kan toevoegen aan je nodemailer.

Emails testen

In mijn applicatie heb ik hier geen gebruik van gemaakt maar om mailtjes te testen zonder dat ze daadwerkelijk worden verstuurd kan je een online tool gebruiken. Deze tools vangen je mail 'op', laten zien hoe je mail eruit ziet en helpt je om ze te analyseren en eventueel te debuggen. Dit kan je bijvoorbeeld gebruiken in een testfase zonder mensen te spammen met mailtjes. Dit zijn een paar voorbeelden die je kan gebruiken:

  1. Mailtrap
  2. Mailgun
  3. Litmus

Gmail en OAuth2

Voor deze applicatie ga ik gebruik maken van Gmail. Gmail is een makkelijke manier om emails te verzender maar is tegelijkertijd ook streng beveiligd, wat geheel terecht is aangezien de tijd waarin we leven en veel geheime gegevens online staan. Daardoor proberen ze alle verdachte activiteiten zoveel mogelijk te blokkeren.

Less secure apps

Aan het begin van het project heb ik gebruik gemaakt van de 'Less secure' apps mogelijkheid die Gmail als optie geeft. Met Less secure bedoelen ze gebruikers die gebruik maken van een 'normaal' wachtwoord en gebruikersnaam. Dit kan je gebruiken in de testfase maar is zeker niet aan te raden als je app live gaat. Dit brengt veel veiligheidsrisico's met zich mee. Hier kan je ook tegen aan lopen als je je applicatie gaat deployen op bijvoorbeeld Heroku. Gmail blokkeert je sign-in om nodemailer te gebruiken omdat het een 'onbekend' device (locatie) is. Dit probleem kan je tijdelijk op lossen door DisplayUnlockCaptcha te gebruiken of door je wachtwoord veiliger te maken door verschillende tekens, nummers en hoofdletters toe te voegen. Maar nogmaals, dit is niet aan te raden.

OAuth 2.0

Wie Gmail zegt, zegt ook OAuth2. Het is van goed belang om je applicatie goed af te schermen en na te denken over de beveiliging van je applicatie. Gmail maakt hiervoor gebruik van OAuth2. OAuth2 staat kort voor Open-standard Authorization protocol (of framework). Met OAuth kun je derde partijen veilig toegang geven. Een voorbeeld is dat een Applicatie op jouw telefoon vraagt om te verbinden met Facebook. OAuth werkt met tokens in plaats van wachtwoorden en geeft dus nooit je wachtwoord vrij tussen partijen. De tokens bevatten allerlei informatie over de aanvrager en kan dus ook rechten en claims bevatten. Vandaar de beperkte toegang.

Acces token

Een acces token is ook maar beperkt geldig (een uur). Na een uur geeft dit token geen toegang meer en moet je weer opnieuw een token aanvragen. Als de acces token ooit in de verkeerde handen vallen dan heeft deze persoon ook maar beperkte toegang tot jouw applicatie en blijft de schade (hopelijk) beperkt. Een acces token kan worden aangevraagd door middel van een client ID en een client Secret.

Refresh token

Als je als gebruiker ergens ingelogd bent op een website of applicatie dat gebruikt maakt van OAuth2 dan zou je in principle na een uur opnieuw moeten inloggen omdat de acces token is verstreken. Voor dit soort gevallen kan je gebruik maken van de refresh token. Met een refresh token kan je een nieuw acces token aanvragen zonder je gegevens weer helemaal opnieuw in te vullen. Een refresh token is wat langer geldig. Als je een nieuwe acces token gaat aanvragen dan moet je ook je client ID en je client secret meegeven. Je kan niet met je refresh token een acces token aanvragen. Als je refresh token ooit in de verkeerde handen valt dan kan de persoon hier niks mee omdat ze je client ID en client secret niet hebben.

Hoe gebruik je OAuth in Nodemailer

Voor de volgende stappen heb je een CLIENT_ID, CLIENT_SECRET en een REDIRECT_URL nodig. Je kan deze vinden in de google developers console onder credentials in APIs & auth.

Stap 1. Maak variabelen aan met je credentials. Via OAuth playground kan je handmatig je OAuth tokens krijgen.

const client_ID = 'client id here'
const client_SECRET ='client secret here';
const redirect_URI = 'https://developers.google.com/oauthplayground';
const refresh_TOKEN = 'refresh token here';

Stap 2. Maak een object aan met de acces en refresh token.

const oAuth2Client = new google.auth.OAuth2(client_ID, client_SECRET, redirect_URI)
oAuth2Client.setCredentials({ refresh_token: refresh_TOKEN })

Stap 3. Fetch je accestoken met de volgende code:

const accessToken = await oAuth2Client.getAccessToken()

Stap 4. Stop je credentials in de nodemailer.createTransport en jouw applicatie is nu beveiligd met OAuth 2.0

  const transporter = nodemailer.createTransport({
        service: 'Gmail',
        auth: {
            type: 'OAuth2',
            user: process.env.EMAIL_ADRESS, 
            clientId: client_ID,
            clientSecret: client_SECRET,
            refreshToken: refresh_TOKEN,
            accessToken: accessToken
        }
          });

DogeMeet Email

Dit is uiteindelijk hoe de email eruit ziet die vanuit de DogeMeet app wordt verzonden:


Bronnen

1. How to send email using Gmail API (uses OAuth2 and nodemailer). (2020, 9 november). YouTube. https://www.youtube.com/watch?v=-rcRf7yswfM&ab_channel=yoursTRULY

2. Sobers, R. (2018, 31 augustus). What is OAuth? Definition and How it Works. Inside Out Security. https://www.varonis.com/blog/what-is-oauth/

3. Duff, W. (2021, 5 februari). What Is an SMTP Server? SendGrid. https://sendgrid.com/blog/what-is-an-smtp-server/

4. Reinman, A. (z.d.). Using Gmail :: Nodemailer. Nodemailer. Geraadpleegd op 20 juni 2021, van https://nodemailer.com/usage/using-gmail/

5. Reinman, A. (z.d.-a). OAuth2 :: Nodemailer. Nodemailer. Geraadpleegd op 20 juni 2021, van https://nodemailer.com/smtp/oauth2/