2016-05-23 8 views
0

Bei der Verwendung des google-auth-library-Knotenmoduls von Google werden die Anforderungen von meinem Aktualisierungstoken nicht korrekt wiedergegeben.google-auth-library: Aktualisierungs-Token, das die Anforderung nicht wiederholt

Die Botschaft, die ich in dem err Rückruf erhalten ist:

Error: Invalid Credentials 

ich andere Fragen Umgang mit diesem Thema gesehen habe, aber die dort vorgestellten Lösungen in haben mein Problem nicht lösen.

Details:

Im folgenden Code, übernehmen das Argument googleAccessToken aussehen:

{ 
    "access_token": "AN ACCESS TOKEN", 
    "refresh_token": "A REFRESH TOKEN" 
} 

Eine minimale Version meines Klienten:

exports.nextEvent = function (googleAccessToken, cb) { 
    // Load client secrets from a local file. 
    fs.readFile('client_secret.json', function processClientSecrets(err, clientSecretContent) { 
     if (err) { 
      console.error('Error loading client secret file: ' + err); 
      return; 
     } 
     authorize(JSON.parse(clientSecretContent), getNextEvent); 
    }); 

    /** 
    * Create an OAuth2 client with the given credentials, and then execute the 
    * given callback function. 
    * 
    * @param {Object} credentials The authorization client credentials. 
    * @param {function} callback The callback to call with the authorized client. 
    */ 
    function authorize(clientCredentials, callback) { 
     var clientSecret = clientCredentials.web.client_secret; 
     var clientId = clientCredentials.web.client_id; 
     var redirectUrl = clientCredentials.web.redirect_uris[0]; 
     var auth = new googleAuth(); 
     var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); 

     oauth2Client.setCredentials(googleAccessToken); 
     callback(oauth2Client); 
    } 

    /** 
    * 
    * 
    * @param {google.auth.OAuth2} auth An authorized OAuth2 client. 
    */ 
    function getNextEvent(auth) { 
     var calendar = google.calendar('v3'); 
     calendar.events.list({ 
      auth: auth, 
      calendarId: 'primary', 
      timeMin: (new Date()).toISOString(), 
      maxResults: 10, 
      singleEvents: true, 
      orderBy: 'startTime' 
      }, 
      function (err, response) { 
       if(err){ 
        console.error(err) 
       } 
       console.log("your next events are : " + response); 
      } 
     ); 
    } 
}; 

Antwort

1

wenn dies nicht sicher, ist Ihr exakter Anwendungsfall, aber ich verwende passport-google-oauth2, um den ersten Zugriff zu erhalten und Token zu aktualisieren.

Dann verwende ich googleapis für die API-Anfragen.

oauth2Client.setCredentials({ 
    access_token: 'ACCESS TOKEN HERE', 
    refresh_token: 'REFRESH TOKEN HERE' 
}); 
plus.people.get({ userId: 'me', auth: oauth2Client }, function(err, response) { 
    // handle err and response 
}); 

Die Dokumentation erwähnt, dass, wenn die Zugriffstoken abgelaufen ist, oauth2Client wird es automatisch erneuert die Aktualisierungs-Token verwenden und dann die Anforderung wiederholen.

Nun, dieser Teil funktionierte nicht für mich und ich würde immer Invalid Credentials bekommen.

Versuchen Sie, die expiry_date zu einem Unix-Zeitstempel mehr als eine Stunde in der Vergangenheit zu setzen.

oauth2Client.setCredentials({ 
    access_token: 'ACCESS TOKEN HERE', 
    refresh_token: 'REFRESH TOKEN HERE' 
    expiry_date: '1469787756005' // unix timestamp more than an hour in the past (access tokens expire after an hour) 
}); 
plus.people.get({ userId: 'me', auth: oauth2Client }, function(err, response) { 
    // handle err and response 
}); 

Das hat bei mir funktioniert!

+0

In der Tat! Genau so habe ich es gehandhabt :) –

Verwandte Themen