Skip to content

TokenError: Missing valid authorization header #42

@cSarcasme

Description

@cSarcasme

I have search a lot a solution for my issue but i dont find it!

you are my last hope :) !

error i have when i connect with twitter i arrive to the twitter page and give the authorization on my twitter account after that i have this error:

TokenError: Missing valid authorization header
at OAuth2Strategy.parseErrorResponse (C:\Users\haatman\Desktop\dbq2formydev-main\dbq2formydev-main\bck\node_modules\passport-oauth2\lib\strategy.js:373:12)
at OAuth2Strategy._createOAuthError (C:\Users\haatman\Desktop\dbq2formydev-main\dbq2formydev-main\bck\node_modules\passport-oauth2\lib\strategy.js:420:16)
at C:\Users\haatman\Desktop\dbq2formydev-main\dbq2formydev-main\bck\node_modules\passport-oauth2\lib\strategy.js:177:45
at C:\Users\haatman\Desktop\dbq2formydev-main\dbq2formydev-main\bck\node_modules\oauth\lib\oauth2.js:191:18
at passBackControl (C:\Users\haatman\Desktop\dbq2formydev-main\dbq2formydev-main\bck\node_modules\oauth\lib\oauth2.js:132:9)
at IncomingMessage. (C:\Users\haatman\Desktop\dbq2formydev-main\dbq2formydev-main\bck\node_modules\oauth\lib\oauth2.js:157:7)
at IncomingMessage.emit (node:events:526:35)
at endReadableNT (node:internal/streams/readable:1359:12)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

my code:

**middleware**
    require('dotenv').config();
const passport = require('passport');
const Strategy = require('@superfaceai/passport-twitter-oauth2').Strategy;
const TwitterUser = require('../models/TwitterUser');
const jwt = require('jsonwebtoken');

passport.serializeUser((user, done) => {
	if (user.provider === 'twitter') {
		//console.log('Twitter-userSerialize', user);
		//console.log('Twitter-userID', user.id);
		done(null, { type: 'twitterUser', idTwitter: user.id });
	} else {
		// L'utilisateur ne provient pas de Twitter, ne rien faire
		done();
	}
});

// Désérialise l'utilisateur à partir de la session
passport.deserializeUser(async (serializedUser, done) => {
	if (serializedUser.type === 'twitterUser') {
		try {
			let user = await TwitterUser.findById(serializedUser.idTwitter);
			// console.log('twitterUser', user)
			done(null, user);
		} catch (error) {
			done(error, null);
		}
	} else {
		done();
	}
});

// Use the Twitter OAuth2 strategy within Passport
passport.use(
	// <2> Strategy initialization
	new Strategy(
		{
			clientID: process.env.TWITTER_CLIENT_ID,
			clientSecret: process.env.TWITTER_CLIENT_ID_SECRET,
			clientType: 'confidential',
			callbackURL: process.env.CALLBACK_TWITTER,
		},
		// <3> Verify callback
		async (accessToken, refreshToken, profile, done) => {
			//console.log(profile);

			try {
				const { id, _json } = profile;
				const name = _json.name;
				const screen_name = _json.screen_name;
				const followers_count = _json.followers_count;
				const findUser = await TwitterUser.findOne({ twitterId: id });

				if (findUser) {
					console.log('access token', accessToken);
					console.log('tokenSecret', refreshToken);
					findUser.accessToken = jwt.sign(
						{ accessToken },
						process.env.JWT_TWITTER_CLIENT_TOKEN
					);
					findUser.refreshToken = jwt.sign(
						{ refreshToken },
						process.env.JWT_TWITTER_CLIENT_TOKEN_SECRET
					);

					await findUser.save();

					return done(null, findUser);
				} else {
					console.log('access token', accessToken);
					console.log('tokenSecret', refreshToken);
					//console.log('pofileTest',id,name, screen_name,followers_count)
					const newUser = await TwitterUser.create({
						twitterId: id,
						userName: name,
						screenName: screen_name,
						followersCount: followers_count,
						accessToken: jwt.sign(
							{ accessToken },
							process.env.JWT_TWITTER_CLIENT_TOKEN
						),
						refreshToken: jwt.sign(
							{ refreshToken },
							process.env.JWT_TWITTER_CLIENT_TOKEN_SECRET
						),
					});
					return done(null, newUser);
				}
			} catch (error) {
				console.error(error);
				return done(error, null);
			}
		}
	)
);

module.exports = passport;

my roads:

require('dotenv').config();
const express = require('express');
const passport = require('passport');
const isAuthenticated = require('../../middleware/authorized');

const router = express.Router();

router.get(
	'/twitter',
	passport.authenticate('twitter', {
		scope: [
			'tweet.read',
			'users.read',
			'like.read',
			'follows.read',
			'space.read',
			'list.read',
			'offline.access',
		],
	}),
	(req, res) => {
		res.status(200);
	}
);

router.get(
	'/twitter/redirect',
	passport.authenticate('twitter', {
		failureRedirect: 'http://localhost:3000/',
	}),
	(req, res) => {
		// Affectez les données de session à req.session.twitterSession
		res.redirect('http://localhost:3000/');
	}
);

router.get('/status', isAuthenticated, (req, res) => {
	//console.log(req);
	if (req.user) {
		res.status(200).send(req.user);
	} else {
		res.status(401).json({ message: 'Unauthorized' });
	}
});
module.exports = router;

express-session and save cookie into mongoose

// appTwitter.js
require('dotenv').config();
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const MongoStore = require('connect-mongo');
require('./middleware/twitter');

const twitterSession = express();

twitterSession.use(
	session({
		secret: process.env.SESSION_SECRET_TWITTER,
		resave: false,
		saveUninitialized: false,
		cookie: {
			maxAge: 6000 * 60 * 24 * 7,
		},
		store: MongoStore.create({
			mongoUrl:
				**********************************************************************************,
			collectionName: 'sessionTwitter',
		}),
		name: 'twitterConnect',
	})
);

twitterSession.use(passport.initialize());

twitterSession.use(passport.session());
// ... autres configurations spécifiques à Twitter

module.exports = twitterSession;

I hope someone can help me i ty by advance :)

If you need other information tell me.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions