2

我试图设置使用chrome.identity.getAuthToken来获得登录用户的身份验证令牌,然后使用该使用护照和passport-google-token一个Express服务器身份验证的Chrome扩展战略。谷歌验证令牌PassportJS返回401未授权

getAuthToken给我的令牌,但当它发送到我的服务器,我得到一个401 unauthorized错误。

我对Passport以及基于令牌的授权非常陌生,所以我不确定是否犯了错误或误解了它的工作原理。

我的Chrome扩展做到这一点:

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

和令牌被正确地传递到我的回调。

我成立这样我的Express服务器和护照策略:

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

客户端ID和秘密来自我已经设置了在谷歌API管理凭据: Google credentials

如果任何人都可以指出我还需要做什么或者我做错了什么,这将是非常感谢。

+0

? –

回答

2

有两个原因对我没有帮助。

第一个是我在步进passport-google-token代码时意识到的,如果req.body未定义,它会失败。我通过添加body-parser中间件来解决这个问题。

虽然主要问题是我在标头中发送访问令牌的方式。我从Google sample apps的一个拷贝x.setRequestHeader('Authorization', 'Bearer ' + token);但它实际上需要发送为:

x.setRequestHeader('Access_token', token); 

或查询字符串为:你在哪里指定重定向URL

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