2

Ich versuche eine Chrome-Erweiterung einzurichten, die chrome.identity.getAuthToken verwendet, um das Authentifizierungs-Token des angemeldeten Benutzers abzurufen und anschließend mit einem Express-Server unter Verwendung von Passport und zu authentifizieren Strategie.Google Auth-Token von Chrome Extension mit PassportJS gibt 401 Unauthorized zurück

getAuthToken gibt mir das Token, aber wenn es an meinen Server gesendet wird, bekomme ich einen Fehler.

Ich bin ziemlich neu in Passport und Token basierte Autorisierung im Allgemeinen, so bin ich mir nicht sicher, ob ich einen Fehler gemacht oder missverstanden habe, wie es funktionieren soll.

Meine Chrome-Erweiterung tut dies:

chrome.identity.getAuthToken({"interactive": true}, function(token){ 
    var url = "http://localhost:30000/auth/chrome"; 
    var x = new XMLHttpRequest(); 
    x.open("GET", url); 
    x.setRequestHeader('Authorization', "Bearer " + token); 
    x.send(); 
}); 

und das Token in meinen Rückruf korrekt übergeben wird.

ich mein Express Server und Passport-Strategie wie folgt auf:

import * as express from "express"; 
import * as passport from "passport"; 
const GoogleTokenStrategy = require("passport-google-token").Strategy; 

// set up Express and Passport... 

passport.use(new GoogleTokenStrategy({ 
    clientID: --client id--, 
    clientSecret: --client secret-- 
}, (accessToken, refreshToken, profile, done) => { 
    return done(null, profile); 
})); 

app.get('/auth/chrome', passport.authenticate("google-token"), (req, res) => { 
    res.send(req.user); 
}); 

Die Client-ID und Geheimnis aus den Anmeldeinformationen kommen Ich habe in der Google API-Manager einzurichten: Google credentials

Wenn Jeder kann mich darauf hinweisen, was ich sonst noch tun oder was ich falsch mache, es wäre sehr geschätzt.

+0

wo Sie Redirect-URL angegeben haben? –

Antwort

2

Es gab zwei Gründe, warum dies für mich fehlgeschlagen ist.

Die erste, die ich erkannte, als ich durch einige der passport-google-token Code ging, ist, dass es fehlschlägt, wenn req.body nicht definiert ist. Ich habe das behoben, indem ich die body-parser Middleware hinzugefügt habe.

Das Hauptproblem war jedoch die Art, wie ich das Zugriffs-Token in der Kopfzeile sendete. Ich hatte x.setRequestHeader('Authorization', 'Bearer ' + token); von einem der Google sample apps kopiert, aber es tatsächlich benötigt als gesendet werden:

x.setRequestHeader('Access_token', token); 

oder in der Abfragezeichenfolge als:

var url = "http://localhost:30000/auth/chrome?access_token=" + token;