0

パスポートを使ってKOA2でソーシャルログインをしようとしています。Passport.authenticate() を使用してユーザーを認証しようとすると、実行されるはずで、fbログインページに移動する必要がありますが、そうではありません。Not Found と表示され、エラーは発生しません。ここに私のコードサンプルがあります:

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これら2つのルートに使用されているだけで、すべてが同じままで、正常に機能しています。

4

2 に答える 2

1

おっと、多くの発見の後、答えを得ました。問題は依存関係にありました。koa-passport は、@next タグを使用してインストールする必要がありましnpm install koa-passport@nextた。npm install koa-passport@latest

于 2016-12-12T07:30:45.200 に答える
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);
});
于 2016-11-07T14:34:37.123 に答える