E-posta listelerini almak için bir dizi GMail hesabına entegre etmek için google-auth-library-nodejs
kütüphanesini kullanıyorum.Google OAuth2 API Yenileme Jetonları
Benim süreç akışı basit:
1) Bu fonksiyonu kullanarak, müşteri yetkilendirmek için deneyin:
function _authorise(mailBox, callback) {
let auth = new googleAuth();
let clientId = eval(`process.env.GMAIL_API_CLIENT_ID_${mailBox.toUpperCase()}`);
let clientSecret = eval(`process.env.GMAIL_API_CLIENT_SECRET_${mailBox.toUpperCase()}`);
let redirectUri = eval(`process.env.GMAIL_API_REDIRECT_URI_${mailBox.toUpperCase()}`);
let tokenFile = process.env.GMAIL_API_TOKEN_PATH + mailBox.toLowerCase()+ process.env.GMAIL_API_TOKEN_BASE_FILE_NAME;
let oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUri);
fs.readFile(tokenFile, ((err, token) => {
if (err) {
_getNewToken(mailBox,oauth2Client,callback);
} else {
oauth2Client.credentials = JSON.parse(token);
callback(oauth2Client);
}
}))
}
2) yöntemi, bir dosyada bir token bulunup bulunmadığını kontrol eder.
function _getNewToken(mailBox, oauth2Client, callback) {
var authUrl = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: process.env.GMAIL_API_SCOPES
});
console.log('To authorize this app, please use this url: ', authUrl);
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Enter the code from that page here: ', ((code) => {
rl.close();
oauth2Client.getToken(code, function(err, token) {
if (err) {
console.log('Error while trying to retrieve access token', err);
return;
}
oauth2Client.credentials = token;
_storeToken(mailBox,token);
callback(oauth2Client);
});
}));
}
function _storeToken(mailBox, token) {
let tokenFile = process.env.GMAIL_API_TOKEN_PATH + mailBox.toLowerCase()+ process.env.GMAIL_API_TOKEN_BASE_FILE_NAME;
fs.writeFile(tokenFile, JSON.stringify(token));
}
Ben kapsamları olarak https://www.googleapis.com/auth/gmail.readonly
kullanıyorum: dosyasını NOT bulunursa, aşağıdaki işlevleri dosyası oluşturur.
OAuth2Client {
transporter: DefaultTransporter {},
clientId_: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
clientSecret_: 'xxxxxxxxxxxxxxxxxxxxxxxx',
redirectUri_: 'urn:ietf:wg:oauth:2.0:oob',
opts: {},
credentials: {
access_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
token_type: 'Bearer',
refresh_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
expiry_date: 1460509994081
}
}
Ben dosyasını silin ve geçmesi durumunda:
işlenen{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","token_type":"Bearer","refresh_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","expiry_date":1460509994081}
, burada döndürülen auth nesnenin bir örneği verilmiştir: Burada
oluşturulan dosyanın bir örneği var manuel izin süreci, daha sonra kimlik doğrulama, belirtecin süresi dolana kadar% 100 çalışır. Bundan sonra "Geçersiz Kimlik Bilgileri" iletisini alıyorum.Varsayım, belirtecin süresi dolduğunda, yenileme belirtecinin erişim belirtecini otomatik olarak yeniden oluşturmak için kullanılacağıdır. Bir şey mi eksik? Tamam
Google’la 25 aktif retrestokens’i yalnızca çalışmayı bıraktıktan sonra geçersiz kimlik bilgileri alabilirsiniz. – DaImTo
@DaImTo, evet 25 limit olduğunu sanıyordum. Anlamadığım şey, yenileme ikramının ne zaman yapıldığıdır. – go4cas
Erişim belirtecini yeni tazeledim, sonra yeni bir access_token, yeni bir refresh_token ve yeni bir expiry_date alıyorum. Son kullanma tarihi 1 saat geçerlidir. Öyleyse, benim varsayımım, 1 saatlik süre dolduğunda, refresh_token otomatik olarak yeni bir access_token oluşturmak için kullanılacaktır. Bu doğru mu? Yoksa refresh_token ALSO 1 saat sonra yeniden üretilecek mi? Bir kullanıcı kimlik doğrulamayı kabul ettiğinde – go4cas