Google Express 和 Passport 的令牌验证无法正常工作
Google token auth with Express and Passport not working
我用 Express 创建了一个 REST api,它使用 Passport 和 passport-google-token
策略来验证用户。当我的服务器在本地主机上为 运行 时,它按预期工作,但在服务器的实时版本上不起作用。所有呼叫 return 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 访问令牌点击它时,它 return 是一个 401 响应,但仅在活动域上 - 它适用于本地主机。
app.get("/api/exists", passport.authenticate("google-token"), (req, res) => {
// stuff happens here
});
这是我在 Google API 管理器中的凭据:
如果相关,本例中的客户端是一个 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);
});
但即使我从 the Google oauth playground 生成一个令牌并通过 Postman 发出请求,我也会得到相同的结果:它在本地主机上有效,但在真实域上无效。
我还需要做什么来验证我的实时域上的用户?
原来问题出在我的 Nginx 服务器上。默认情况下,它会删除包含下划线的 headers(例如 access_token
)。我没有想到问题会在那里,因此我什至没有在我的问题中提及它。
Docs about that are here。您可以通过设置更改行为:
underscores_in_headers on
我用 Express 创建了一个 REST api,它使用 Passport 和 passport-google-token
策略来验证用户。当我的服务器在本地主机上为 运行 时,它按预期工作,但在服务器的实时版本上不起作用。所有呼叫 return 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 访问令牌点击它时,它 return 是一个 401 响应,但仅在活动域上 - 它适用于本地主机。
app.get("/api/exists", passport.authenticate("google-token"), (req, res) => {
// stuff happens here
});
这是我在 Google API 管理器中的凭据:
如果相关,本例中的客户端是一个 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);
});
但即使我从 the Google oauth playground 生成一个令牌并通过 Postman 发出请求,我也会得到相同的结果:它在本地主机上有效,但在真实域上无效。
我还需要做什么来验证我的实时域上的用户?
原来问题出在我的 Nginx 服务器上。默认情况下,它会删除包含下划线的 headers(例如 access_token
)。我没有想到问题会在那里,因此我什至没有在我的问题中提及它。
Docs about that are here。您可以通过设置更改行为:
underscores_in_headers on