Google 来自 Chrome 带 PassportJS 扩展的身份验证令牌 returns 401 未经授权
Google Auth token from Chrome Extension with PassportJS returns 401 Unauthorized
我正在尝试设置一个 Chrome 扩展,它使用 chrome.identity.getAuthToken
获取登录用户的身份验证令牌,然后使用它通过 Express 服务器使用 Passport 和 passport-google-token
策略。
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 服务器和 Passport 策略:
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 和密码来自我在 Google API 管理器中设置的凭据:
如果有人能指出我还需要做什么或我做错了什么,将不胜感激。
这对我来说失败有两个原因。
首先,当我逐步执行某些 passport-google-token
代码时,我意识到,如果 req.body
未定义,它将失败。我通过添加 body-parser
中间件来解决这个问题。
主要问题是我在 header 中发送访问令牌的方式。我从 Google sample apps 之一复制了 x.setRequestHeader('Authorization', 'Bearer ' + token);
但它实际上需要发送为:
x.setRequestHeader('Access_token', token);
或在查询字符串中为:
var url = "http://localhost:30000/auth/chrome?access_token=" + token;
我正在尝试设置一个 Chrome 扩展,它使用 chrome.identity.getAuthToken
获取登录用户的身份验证令牌,然后使用它通过 Express 服务器使用 Passport 和 passport-google-token
策略。
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 服务器和 Passport 策略:
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 和密码来自我在 Google API 管理器中设置的凭据:
如果有人能指出我还需要做什么或我做错了什么,将不胜感激。
这对我来说失败有两个原因。
首先,当我逐步执行某些 passport-google-token
代码时,我意识到,如果 req.body
未定义,它将失败。我通过添加 body-parser
中间件来解决这个问题。
主要问题是我在 header 中发送访问令牌的方式。我从 Google sample apps 之一复制了 x.setRequestHeader('Authorization', 'Bearer ' + token);
但它实际上需要发送为:
x.setRequestHeader('Access_token', token);
或在查询字符串中为:
var url = "http://localhost:30000/auth/chrome?access_token=" + token;