2016-04-12 5 views
1

Google OAuth2 API Refresh Tokens

Mon flux de processus est simple:

1) Essayez d'autoriser le client, en utilisant cette fonction:

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) La méthode vérifie l'existence d'un jeton dans un fichier. Si le fichier ne se trouve pas, les fonctions suivantes créer le fichier:

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

J'utilise https://www.googleapis.com/auth/gmail.readonly comme les champs d'application.

Voici un échantillon du fichier créé:

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

Lors de son traitement, voici un échantillon de l'objet auth qui est retourné:

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

Si je supprime le fichier, et passer par le processus de consentement manuel, puis l'authentification fonctionne à 100%, jusqu'à ce que le jeton expire. Après ceci, j'obtiens le message "Credentials Invalid". Mon hypothèse est qu'une fois le jeton expiré, le jeton d'actualisation sera utilisé pour recréer automatiquement le jeton d'accès. Est-ce que je manque quelque chose?

+0

Si vous demandez l'accès à l'utilisateur et que vous recevez un nouveau jeton d'actualisation, l'enregistrez-vous? Vous ne pouvez avoir que 25 réfractaires actifs avec google après qu'ils ont cessé de travailler et vous obtenez des informations d'identification invalides. – DaImTo

+0

@DaImTo, ouais je me doutais que c'est la limite de 25. Ce que je ne comprends pas, c'est quand le jeton d'actualisation est réémis. – go4cas

+0

Je viens de rafraîchir le jeton d'accès, puis je reçois un nouveau access_token, un nouveau refresh_token et un nouveau expiry_date. La date d'expiration est valide pour 1 heure. Donc, mon hypothèse est qu'après la fenêtre d'expiration de 1 heure, le refresh_token sera utilisé pour créer un nouveau access_token automatiquement. Est-ce exact? Ou le refresh_token sera-t-il régénéré après 1 heure? – go4cas

Répondre

2

Bon, alors j'ai découvert la méthode getAccessToken, qui vérifiera la access_token, et de l'utiliser, à moins qu'il ait expiré, auquel cas il utilisera le refresh_token pour générer une nouvelle access_token.