jaredhanson / passport-soundcloud

SoundCloud authentication strategy for Passport and Node.js.
MIT License
38 stars 10 forks source link

req.user is undefined on callback #5

Open guilhermeKodama opened 8 years ago

guilhermeKodama commented 8 years ago

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

router.js

router.get('/connect/soundcloud',passport.authorize('soundcloud'))
router.get('/connect/soundcloud/callback', passport.authorize('soundcloud'),
  controller.soundcloudCallback)

passport.js

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

    }
  ))

}
MuhammadHasham23 commented 6 years ago

Same issue, have you found any workaround ?