2016-04-12 7 views
1

Ich verwende die Bibliothek google-auth-library-nodejs, um sie in eine Reihe von Google Mail-Konten zu integrieren, um E-Mail-Listen zu erhalten.Google OAuth2-API-Aktualisierungs-Token

Mein Prozessablauf ist einfach:

1) Nutzen Sie den Client, mit dieser Funktion zu genehmigen:

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) Das Verfahren in einer Datei auf die Existenz eines Token prüft. Wenn die Datei nicht gefunden wird, werden die folgenden Funktionen, um die Datei zu erstellen:

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)); 
} 

Ich verwende https://www.googleapis.com/auth/gmail.readonly wie die Bereiche.

Hier ist ein Beispiel für die Datei erstellt:

{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","token_type":"Bearer","refresh_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","expiry_date":1460509994081} 

Bei der Verarbeitung ist hier eine Probe des Auth-Objekt, das zurückgegeben wird:

löschen
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 
    } 
} 

Wenn ich die Datei aus, und gehen Sie durch die manuelle Zustimmung, dann funktioniert die Authentifizierung zu 100%, bis das Token abläuft. Danach erhalte ich die Meldung "Ungültige Anmeldeinformationen".

Meine Annahme ist, dass das Refresh-Token nach dem Ablauf des Tokens zum automatischen Neuerstellen des Zugriffstokens verwendet wird. Fehle ich etwas?

+0

Wenn Sie den Zugriff des Benutzers anfordern und ein neues Aktualisierungstoken erhalten, speichern Sie es? Sie können nur 25 aktive refrestokens mit google haben, danach hören sie auf zu arbeiten und Sie erhalten ungültige Zugangsdaten. – DaImTo

+0

@DaImTo, ja, ich vermutete, dass es das Limit von 25 ist. Was ich nicht verstehe, ist genau wann der Refresh-Token neu ausgegeben wird. – go4cas

+0

Ich habe gerade das Access Token aktualisiert, dann bekomme ich ein neues access_token, ein neues refresh_token und ein neues expiration_date. Das Ablaufdatum ist für 1 Stunde gültig. Also, meine Annahme ist, dass nach dem Ablaufdatum von 1 Stunde das refresh_token verwendet wird, um automatisch ein neues access_token zu erstellen. Ist das korrekt? Oder wird das refresh_token auch nach 1 Stunde neu generiert? – go4cas

Antwort

2

Okay, so habe ich die getAccessToken Methode entdeckt, die die access_token zu überprüfen, und es verwenden, es sei denn, es abgelaufen ist, wobei in diesem Fall wird es die refresh_token verwenden, um ein neues access_token zu erzeugen.

Verwandte Themen