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ć ?
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
zNodemailer
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ś:
- przejdź do konsoli programistów Google.
- Wybierz projekt lub utwórz nowy.
- 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.
- na pasku bocznym po lewej stronie Wybierz poświadczenia .
- 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.
- poszukaj Client ID i Client secret w tabeli związanej z każdym z Twoich danych uwierzytelniających.
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
- przejdź do Google OAuth2.0 .
- 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.
-
Ustaw lunety. Użyj
https://mail.google.com/
, ponieważ jest to jeden potrzebny przez nodemailer
. Następnie kliknij przycisk Autoryzuj interfejsy API .
- po autoryzacji OAuth2.0, wymień kod autoryzacyjny na tokeny i voilá! twój token odświeżania jest gotowy do użycia
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);
});
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