最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - TokenError: Bad Request; Google OAuth2; Passport.js on Node.js; Able to console.log data, however delivers error -

programmeradmin1浏览0评论

I am attempting to use Passport.js to authorize Google OAuth2 on Node.js. I have tried all week to make it work and have no idea why it isn't, so am now resorting to stack for some potential help. I have tried all solutions to similar problems available on forums online.

Each time it sends the request it returns TokenError: Bad Request, however, it is able to console.log the required data, so this to me demonstrates that the token was in fact successful. I cannot explain why this is occurring.

I have tried being more specific in callback request e.g http://localhost:3000/auth/google/redirect. I have tried every other type of Oauth type google has Node server, web application, html ect. I have tried different ports.

AUTH ROUTES

 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_SETUP

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

When submitted the process progresses through SignIn page, delivers desired result the console.log and then just sits for about 1 minute awaiting localhost.

As you can see the very thing it is trying to retrieve is already in the console.

It then progresses to throw and Error:

I am attempting to use Passport.js to authorize Google OAuth2 on Node.js. I have tried all week to make it work and have no idea why it isn't, so am now resorting to stack for some potential help. I have tried all solutions to similar problems available on forums online.

Each time it sends the request it returns TokenError: Bad Request, however, it is able to console.log the required data, so this to me demonstrates that the token was in fact successful. I cannot explain why this is occurring.

I have tried being more specific in callback request e.g http://localhost:3000/auth/google/redirect. I have tried every other type of Oauth type google has Node server, web application, html ect. I have tried different ports.

AUTH ROUTES

 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_SETUP

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

When submitted the process progresses through SignIn page, delivers desired result the console.log and then just sits for about 1 minute awaiting localhost.

As you can see the very thing it is trying to retrieve is already in the console.

It then progresses to throw and Error:

Share Improve this question edited Aug 13, 2019 at 18:45 tzrm 5911 gold badge9 silver badges16 bronze badges asked Aug 13, 2019 at 17:42 psquizzlepsquizzle 1851 gold badge5 silver badges19 bronze badges 6
  • Is your callBackURL '/auth/google/redirect' missing the domain? – Train Commented Aug 13, 2019 at 17:49
  • You are not pleting the login process, you should call the done method after it has been authenticated.Add this and check if it makes a difference (accessToken, refreshToken, profile, done) = > { done(null, {somedummyobj}); }. – Aritra Chakraborty Commented Aug 13, 2019 at 17:55
  • Adding a done() method, appears to close the callback instantly but delivers 'unauthorized' to client-side browser, data is still appearing in the console and no error in the server-side console. Adding domain to callBackURL makes no difference. – psquizzle Commented Aug 14, 2019 at 1:47
  • I am getting the same issue, I have tried every possible thing, but nothing works even the mongoose DB is not working, previously it was working. – Malik Commented Dec 21, 2019 at 20:45
  • @psquizzle : please post the solution if you managed to resolve the issue – Vishwanath Commented May 5, 2020 at 11:53
 |  Show 1 more ment

1 Answer 1

Reset to default 3

Sorry for the late reply, dug up some old code this is the point where it was marked as 'All auth methods functioning'. As stated by Aritra Chakraborty in the ments, "done" method was not being called. See the following implementation with 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 }, (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 }, (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, (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./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>");
    });
});

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论