我用Express制作了一个REST api,它使用Passport和该passport-google-token
策略对用户进行身份验证。当我的服务器在localhost上运行时,它可以按预期工作,但不能在服务器的实时版本上运行。所有呼叫均返回401未经授权的响应。
护照策略的配置如下:
this.passport.use(new GoogleTokenStrategy({
clientID: this.config.auth.googleAuth.clientId,
clientSecret: this.config.auth.googleAuth.clientSecret
}, (accessToken, refreshToken, profile, done) => {
User.findOne({'google.id': profile.id}, (err, user) => {
if(err) return done(err);
if(user) return done(null, user);
var newUser = new User();
newUser.save((err) => {
if (err) throw err;
return done(null, newUser);
});
})
}));
这是端点的示例。当我使用有效的Google访问令牌访问它时,它会返回401响应,但仅在活动域上有效-它可在localhost上运行。
app.get("/api/exists", passport.authenticate("google-token"), (req, res) => {
// stuff happens here
});
如果相关,则本例中的客户端是Chrome扩展程序,该扩展程序使用getAuthToken获取令牌。执行来自客户端的请求的代码如下所示:
chrome.identity.getAuthToken({"interactive": true}, (token) => {
const bodyJson = body ? JSON.stringify(body) : null;
const headers = new Headers();
headers.append("Access_token", token);
headers.append('Accept', 'application/json');
headers.append('Content-Type', 'application/json');
const request = new Request(url, {
headers: headers,
method: method,
body: bodyJson
});
fetch(request);
});
但是,即使我从Google oauth游乐场生成令牌并通过Postman发出请求,我也会得到相同的结果:它在localhost上有效,而在实际域上则无效。
我还需要做什么来对我的实时域中的用户进行身份验证?
问题出在我的Nginx服务器上。默认情况下,它会删除包含下划线的标头(例如access_token
)。我没有想到问题就在那里,因此甚至在我的问题中都没有提及。
有关此的文档在这里。您可以通过设置以下行为来更改行为:
underscores_in_headers on
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句