2016-11-07 4 views
0

Я пытаюсь сделать социальный вход в KOA2 с использованием паспорта. Когда я пытаюсь аутентифицировать пользователя с помощью pass.authenticate(). Он должен быть выполнен и должен выкинуть меня на страницу входа fb, но это не так. Даже он показывает Not Found и не бросает никаких ошибок. Вот мой пример кода:passport.authenticate не работает вообще

app.js

import Koa from 'koa' 
import views from 'koa-views' 
import serve from 'koa-static' 
import rootRoutes from './routes/index' 
import userRoutes from './routes/user' 
import authConfig from './config/oauth' 
import authRoutes from './routes/social' 
const app = new Koa() 
// trust proxy 
app.proxy = true 

// sessions 
const convert = require('koa-convert') 
const session = require('koa-generic-session') 
const passport = require('koa-passport') 
app.keys = ['your-session-secret'] 
// body parser 
const bodyParser = require('koa-bodyparser') 
// require('./auth') 
app.use(bodyParser()) 
app.use(convert(session())) 

// authentication 
app.use(convert(passport.initialize())) 
app.use(convert(passport.session())) 
app.use(views(`${__dirname}/views`, { extension: 'html' })) 
app.use(serve(`${__dirname}/public`)) 
app.use(authRoutes.routes()) 
app.use(authRoutes.allowedMethods()) 
app.use(rootRoutes.routes()) 
console.log("authRoutes", authRoutes); 
app.use(rootRoutes.allowedMethods()) 
app.use(userRoutes.routes()) 
app.use(userRoutes.allowedMethods()) 
app.use(async (ctx, next) => { 
    try { 
    await next(); // next is now a function, await instead of yield 
    } catch (err) { 
    ctx.body = { message: err.message }; 
    ctx.status = err.status || 500; 
    } 
}); 
app.listen(1337,() => { 
    console.log('Server running at http://localhost:1337 and http://127.0.0.1:1337') 
}) 

export default app 

social.js

import Router from 'koa-router' 
const router = new Router() 
import authConfig from '../config/oauth' 
import passport from 'koa-passport' 
var user = { id: 1, username: 'test' } 

passport.serializeUser((user, done) => { 
    console.log(user) 
    done(null, user); 
}); 

passport.deserializeUser((id, done) => { 
    (async() => { 
    try { 
     // const user = await User.findById(id); 
     console.log("user", user); 
     done(null, user); 
    } catch (error) { 
     console.log("error") 
     done(error); 
    } 
    })(); 
}); 

var LocalStrategy = require('passport-local').Strategy 
passport.use(new LocalStrategy(function(username, password, done) { 
    console.log("user", user); 
    // retrieve user ... 
    if (username === 'test' && password === 'test') { 
    done(null, user) 
    } else { 
    done(null, false) 
    } 
})) 

var FacebookStrategy = require('passport-facebook').Strategy 
passport.use(new FacebookStrategy({ 
    clientID: '214873665615110', 
    clientSecret: 'f30ba1c22c6fef150c4b8ffae3cbffe4', 
    callbackURL: 'http://127.0.0.1:1337/auth/facebook/callback' 
    }, 
    function(token, tokenSecret, profile, done) { 
    console.log("profile", profile); 
    // retrieve user ... 
    done(null, user) 
    } 
)) 

var TwitterStrategy = require('passport-twitter').Strategy 
passport.use(new TwitterStrategy({ 
    consumerKey: 'authConfig.twitter.consumerKey', 
    consumerSecret: 'authConfig.twitter.consumerSecret', 
    callbackURL: 'http://127.0.0.1:' + (process.env.PORT || 1337) + '/auth/twitter/callback' 
    }, 
    function(token, tokenSecret, profile, done) { 
    // retrieve user ... 
    done(null, user) 
    } 
)) 

var GoogleStrategy = require('passport-google-auth').Strategy 
passport.use(new GoogleStrategy({ 
    clientId: 'authConfig.google.clientID', 
    clientSecret: 'authConfig.google.clientSecret', 
    callbackURL: 'http://127.0.0.1:' + (process.env.PORT || 1337) + '/auth/google/callback' 
    }, 
    function(token, tokenSecret, profile, done) { 
    // retrieve user ... 
    done(null, user) 
    } 
)) 

// import authConfig from '../config/oauth' 
router.post('/login', async(ctx, next) => { 
    console.log("login"); 
    await passport.authenticate('local', { 
    successRedirect: '/about', 
    failureRedirect: '/' 
    }) 
    return next(); 
}) 

router.get('/auth/facebook', async(ctx, next) => { 
    console.log("call aayi"); 
    await passport.authenticate('facebook'); 
    // ctx.body = "aa gaya bhai "; 
}) 

router.get('/auth/facebook/callback', async(ctx, next) => { 
    passport.authenticate('facebook', { 
     successRedirect: '/about', 
     failureRedirect: '/' 
    }) 
}) 
export default router 

oath.js является имеющие учетные данные для социальных плагинов.

Интересная проблема заключается в том, что я использую koa-route вместо koa-router. Работает.

const route = require('koa-route'); 
app.use(route.get('/auth/facebook', 
    passport.authenticate('facebook') 
)) 

app.use(route.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { 
    successRedirect: '/app', 
    failureRedirect: '/' 
    }) 
)) 

Все остальные же, просто использовали koa-route для этих двух маршрутов, и это работает прекрасно.

ответ

0

Oww черт, после стольких поисков, получил ответ. Проблема была связана с зависимостями. koa-паспорт должен быть установлен с тегом @next, то есть npm install [email protected] вместо npm install [email protected]

0

Первое, что я вижу, это то, что вы не правильно сериализуете своего пользователя в сеансе и вне его. Попробуйте выполнить сериализацию user._id для сеанса, который позже будет использоваться для извлечения всего пользователя из базы данных.

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
done(err, user); 
}); 
+0

все то же самое. Я обновил вопрос. –

+0

BTW такая же работа в экспресс, то как это может создать любую проблему в koa? Дело в том, что мы должны хранить наименьшие данные - это сеанс, поэтому мы используем user.id –

Смежные вопросы