2016-04-12 34 views
1

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

+0

Google’la 25 aktif retrestokens’i yalnızca çalışmayı bıraktıktan sonra geçersiz kimlik bilgileri alabilirsiniz. – DaImTo

+0

@DaImTo, evet 25 limit olduğunu sanıyordum. Anlamadığım şey, yenileme ikramının ne zaman yapıldığıdır. – go4cas

+0

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

cevap

2

, bu yüzden access_token işaretleyin ve kullanmak onu, o zaman geçmedikçe, bu durumda yeni bir access_token oluşturmak için refresh_token kullanacağı olacak getAccessToken yöntemi, keşfettiler. Kullanıcının erişimini istiyor ve yeni bir yenileme belirteci alıyorsanız

İlgili konular