Hie, I am build a React+Redux app that make ajax calls to our API and right now I am trying to link the user's local account to the SoundCloud account but on the callback endpoint I always receive req.user as undefined.
I tried everything that I could find/imagine, I am hoping that you can give me some guidance.
server.js
import express from 'express'
import path from 'path'
import morgan from 'morgan'
import bodyParser from 'body-parser'
import cookieParser from 'cookie-parser'
import session from 'express-session'
import passport from 'passport'
import cors from 'cors'
import config from '/config'
import bookshelfInit from 'bookshelf'
import knexInit from 'knex'
const app = express()
export const knex = knexInit(config.database)
export const bookshelf = bookshelfInit(knex)
// passport
require('../config/passport')(passport)
app.use(morgan('dev'))
app.use(cookieParser())
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
// app.use(cors({ origin: true }))
app.use(function (req, res, next) {
// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:7770')
// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE')
// Request headers you wish to allow
res.setHeader('Access-Control-Allow-Headers',
'X-Requested-With,Authorization,Content-Type,Access-Control-Allow-Origin')
// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader('Access-Control-Allow-Credentials', true)
// Pass to next layer of middleware
next()
})
app.use(session({ secret: config.secrets.session }))
app.use(passport.initialize())
app.use(passport.session())
// load modules
const modules = require('../src/modules')
modules(app)
app.listen(config.port, () => {
console.log(`Server started on ${config.port}`)
})
export default app
import config from '/config'
import { Strategy as LocalStrategy } from 'passport-local'
import { Strategy as SoundCloudStrategy } from 'passport-soundcloud'
import User from '../src/models/User'
import { validatePassword } from '../src/utils/password'
module.exports = function(passport) {
// =========================================================================
// passport session setup ==================================================
// =========================================================================
// required for persistent login sessions
// passport needs ability to serialize and unserialize users out of session
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
done(null, user.id)
})
// used to deserialize the user
passport.deserializeUser(async function(id, done) {
const user = await User.where('id', id).fetch()
done(null,user.toJSON())
})
passport.use(new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
},
async (req, email, password, done) => {
const user = await User.where('email', email).fetch()
if (!user) {
return done(null, false)
}
if (validatePassword(password, user.passwordHash)) {
return done(null, false)
}
return done(null, user)
}
))
passport.use(new SoundCloudStrategy({
clientID: config.soundcloud.CLIENT_ID,
clientSecret: config.soundcloud.CLIENT_SECRET,
callbackURL: 'http://127.0.0.1:5000/auth/connect/soundcloud/callback',
passReqToCallback: true
},
async (req, accessToken, refreshToken, profile, done) => {
if (req.user){
const user = await User.where('id', session.user.id).fetch()
await user.save({soundcloud_token: accessToken})
return done(null, user)
} else {
return done(null, false)
}
}
))
}
Hie, I am build a React+Redux app that make ajax calls to our API and right now I am trying to link the user's local account to the SoundCloud account but on the callback endpoint I always receive
req.user
as undefined. I tried everything that I could find/imagine, I am hoping that you can give me some guidance.server.js
router.js
passport.js