2016-11-07 17 views
0

여권을 사용하여 KOA2에서 소셜 로그인을하려고합니다. passport.authenticate() 도움으로 사용자를 인증하려고 할 때. 그것은 실행되어야하고 fb 로그인 페이지로 나를 던져야하지만 그렇게하지는 않습니다. 심지어 그것이 발견되지 않고 어떤 종류의 오류도 던지지 않고 있음을 보여줍니다. 여기 내 코드 예제입니다 :passport.authenticate가 전혀 작동하지 않습니다

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는 소셜 플러그인에 대한 자격 증명을 가지고있다을 app.js.

koa-router 대신 koa-route을 사용할 때 흥미로운 문제가 있습니다. 효과가 있습니다. 같은 나머지

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

많은 검색 결과를 얻은 후 오답을 얻었습니다. 문제는 종속성 문제였습니다. koa-passport는 @next 태그 즉 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

대신에 npm install [email protected]과 함께 설치해야합니다. 질문을 업데이트했습니다. –

+0

BTW와 똑같은 표현을 사용하면 어떻게 koa에서 어떤 문제를 만들 수 있습니까? 것은 우리가 최소한의 데이터를 세션에 저장해야한다는 것입니다. 그래서 우리는 user.id를 사용합니다 –