-
Notifications
You must be signed in to change notification settings - Fork 12
Description
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.