Javascript 令牌错误:请求错误;谷歌OAuth2;Node.js上的Passport.js;但是,能够控制台.log数据会传递错误

Javascript 令牌错误:请求错误;谷歌OAuth2;Node.js上的Passport.js;但是,能够控制台.log数据会传递错误,javascript,node.js,authentication,oauth-2.0,Javascript,Node.js,Authentication,Oauth 2.0,我正试图使用Passport.js在Node.js上授权GoogleOAuth2。我整个星期都在努力让它工作,但不知道为什么不行,所以现在我求助于stack寻求一些潜在的帮助。我已经尝试了在线论坛上所有类似问题的解决方案 每次发送请求时,它都返回TokenError:Bad request,但是,它能够将所需的数据记录到console.log中,因此这向我证明了令牌实际上是成功的。我无法解释为什么会发生这种情况 我尝试过在回调请求中更具体一些,例如。 我已经尝试过谷歌所有其他类型的Oauth节点

我正试图使用
Passport.js
Node.js
上授权Google
OAuth2
。我整个星期都在努力让它工作,但不知道为什么不行,所以现在我求助于stack寻求一些潜在的帮助。我已经尝试了在线论坛上所有类似问题的解决方案

每次发送请求时,它都返回TokenError:Bad request,但是,它能够将所需的数据记录到console.log中,因此这向我证明了令牌实际上是成功的。我无法解释为什么会发生这种情况

我尝试过在回调请求中更具体一些,例如。 我已经尝试过谷歌所有其他类型的Oauth节点服务器、web应用程序、html等。 我尝试了不同的端口

认证路由

 const router = require('express').Router();
 const passport = require('passport');

 // auth login
 router.get('/login', (req, res) => {
     res.render('login', { user: req.user });
 });

 // auth logout
 router.get('/logout', (req, res) => {
     // handle with passport
     res.send('logging out');
 });

 // auth with google+
 router.get('/google', passport.authenticate('google', {
     scope: ['profile']
 }));

 // callback route for google to redirect to
 // hand control to passport to use code to grab profile info
     router.get('/google/redirect', passport.authenticate('google'), 
   (req, 
   res) => {
      res.send('you reached the redirect URI');
   });

module.exports = router;
PASSPORT\u设置

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const keys = require('./keys');

passport.use(
new GoogleStrategy({
    // options for google strategy
    clientID: keys.google.clientID,
    clientSecret: keys.google.clientSecret,
    callbackURL: '/auth/google/redirect'
   }, (accessToken, refreshToken, profile, done) => {
    // passport callback function
    console.log('passport callback function fired:');
    console.log(profile);
    })
);
提交后,流程将通过登录页面进行,通过console.log交付所需的结果,然后只需等待localhost大约1分钟

正如您所看到的,它正试图检索的东西已经在控制台中

然后继续抛出并出错:


很抱歉回复太晚,我找到了一些旧代码,这就是它被标记为“所有身份验证方法都在运行”的地方。正如Aritra Chakraborty在评论中所说,“完成”方法没有被调用。请参阅以下使用Nedb的实现

const GoogleStrategy = require('passport-google-oauth20').Strategy;
const Datastore = require('nedb');
const database = new Datastore('database.db');
database.loadDatabase();

passport.serializeUser((user, done) => {
    done(null, user.googleId||user.id);
});

passport.deserializeUser((googleId, done) => {
    database.findOne({googleId : googleId}, function (err, user) {

        done(null, user);
    });
});

var strategy=   new GoogleStrategy({
    // options for google strategy
    clientID: keys.google.clientID,
    clientSecret: keys.google.clientSecret,
    callbackURL: '/auth/google/redirect'
}, (accessToken, refreshToken,object0, profile, done) => {
    // check if user already exists in our own db



    database.findOne({ googleId: profile.id }, function (err, currentUser) {
        if (currentUser !== null){


                done(null,currentUser)

        } else {
            var d = new Date();
                var n = d.getTime();
                var duoID = uuidv1() 
                 var User = {
                duoVocalID: duoID,
                googleId: profile.id,
                username: profile.displayName,
                thumbnail: profile._json.image.url,
                oscope: object0.scope,
                oaccess_token: object0.access_token,
                otoken_type: object0.token_type,
                oid_token: object0.id_token,
                oexpires_in: object0.expires_in,
                oemails: profile.emails,
                olanguage: profile._json.language,
                oname: profile.name,
                TimeOfLastLogon:  n,
                RefreshToken: refreshToken
            };


            database.insert(User, function(err,newUser){ })
                var newUser = User
                done(null,newUser);
        }
      });




    })



passport.use(strategy)


// auth with google+
app.get('/auth/google', passport.authenticate('google', {
    scope: ['profile','email','https://www.googleapis.com/auth/spreadsheets'],accessType: 'offline', approvalPrompt: 'force' })
);
// callback route for google to redirect to
// hand control to passport to use code to grab profile info
app.get('/auth/google/redirect', passport.authenticate('google'), async (req, res) => {

var userString = JSON.stringify(req.user)
jwt.sign({userString}, 'secretKey', { expiresIn: '365d' }, (err, token) => {

  res.send("<script>localStorage.setItem('token', '"+token+"'); window.close(); window.opener.document.getElementById('modal-toggle').checked = false;</script>");
  });
});
const GoogleStrategy=require('passport-google-oauth20')。策略;
const Datastore=require('nedb');
const database=新数据存储('database.db');
loadDatabase();
passport.user((用户,完成)=>{
完成(null,user.googleId | | user.id);
});
passport.deserializeUser((谷歌ID,完成)=>{
findOne({googleId:googleId},函数(err,user){
完成(空,用户);
});
});
var战略=谷歌新战略({
//谷歌战略的选择
clientID:keys.google.clientID,
clientSecret:keys.google.clientSecret,
回调URL:“/auth/google/redirect”
},(accessToken、refreshToken、object0、配置文件、完成)=>{
//检查用户是否已经存在于我们自己的数据库中
database.findOne({googleId:profile.id},函数(err,currentUser){
如果(currentUser!==null){
完成(空,当前用户)
}否则{
var d=新日期();
var n=d.getTime();
var duoID=uuidv1()
变量用户={
duoVocalID:duoID,
googleId:profile.id,
用户名:profile.displayName,
缩略图:profile.\u json.image.url,
示波器:object0.scope,
oaccess\u令牌:object0.access\u令牌,
otoken_类型:object0.token_类型,
oid_令牌:object0.id_令牌,
oexpires_in:object0.expires_in,
oemails:profile.emails,
olalanguage:profile.\u json.language,
oname:profile.name,
LastLogon的时间:n,
RefreshToken:RefreshToken
};
insert(用户,函数(err,newUser){})
var newUser=User
完成(null,newUser);
}
});
})
护照使用(策略)
//谷歌认证+
app.get('/auth/google',passport.authenticate('google'{
范围:['profile','email','https://www.googleapis.com/auth/spreadsheets'],accessType:'offline',approvalPrompt:'force'})
);
//google重定向到的回调路径
//手动控制passport以使用代码获取配置文件信息
app.get('/auth/google/redirect',passport.authenticate('google'),async(req,res)=>{
var userString=JSON.stringify(req.user)
sign({userString},'secretKey',{expiresIn:'365d'},(err,token)=>{
res.send(“localStorage.setItem('token','“+token+”);window.close();window.opener.document.getElementById('modal-toggle')。checked=false;”;
});
});

您的callBackURL
'/auth/google/redirect'
是否缺少域?您没有完成登录过程,您应该在验证后调用
done
方法。添加此方法并检查是否有差异
(accessToken,refreshtToken,profile,done)=>{done(null,{somedummoyobj})
。添加一个done()方法似乎会立即关闭回调,但会将“未经授权”的数据传递到客户端浏览器,数据仍会显示在控制台中,服务器端控制台中没有错误。将域添加到callBackURL没有任何区别。我遇到了同样的问题,我已经尝试了所有可能的方法,但没有任何效果,即使mongoose DB不工作,以前它工作正常。@psquizzle:如果您成功解决了问题,请发布解决方案