2017-07-04 2 views
2

J'essaie de créer un simple utilisateur registre/login api utilisant Koa 2 et passeport.ctx.passport indéfini lorsque vous essayez de générer un jsonwebtoken lors de l'utilisation de passeport avec koa?

Le problème survient lors de la tentative de connexion.

Voici le code de l'itinéraire;

import { 
    authEmail, 
    generateToken 
} from '../../auth'; 

import User from '../../models/user'; 

export default (router) => { 
    router.post('/auth/email', authEmail(), generateToken()); 
    router.post('/auth/register', register, generateToken()); 
}; 

async function register(ctx, next) { 
    const { name, email, password } = ctx.request.body; 

    // TODO - improve validation 
    if (name && email && password) { 
     let user = await User.findOne({ email }); 

     if (!user) { 
      user = new User({ 
       name, 
       email 
      }); 
      user.password = user.generateHash(password); 
      await user.save(); 

      ctx.passport = { 
       user: user._id, 
      }; 

      console.log(ctx.passport) 

      await next(); 

     } else { 
      ctx.status = 400; 
      ctx.body = { status: 'error', message: 'E-mail already registered' }; 
     } 
    } else { 
     ctx.status = 400; 
     ctx.body = { status: 'error', message: 'Invalid email or password' }; 
    } 
} 

Voici les fonctions authEmail() + GenerateToken;

export function authEmail() { 
    return passport.authenticate('email'); 
} 

/** After autentication using one of the strategies, generate a JWT token */ 
export function generateToken() { 
    return async ctx => { 
     console.log('generating token....') 
     console.log(ctx.passport) 
     const { user } = ctx.passport; 
     if (user === false) { 
      ctx.status = 401; 
     } else { 
      const _token = jwt.sign({id: user}, config.secret); 
      const token = `JWT ${_token}`; 

      const currentUser = await User.findOne({_id: user}); 

      ctx.status = 200; 
      ctx.body = { 
       token, 
       user: currentUser, 
      }; 
     } 
    }; 
} 

et enfin la stratégie e-mail de passeport:

import User from '../../models/user'; 
import { Strategy as CustomStrategy } from 'passport-custom'; 

export default new CustomStrategy(async(ctx, done) => { 
    console.log('Email Strategy: ', ctx.body); 
    try { 
     /** Test whether is a login using email and password */ 
     if (ctx.body.email && ctx.body.password) { 
      const user = await User.findOne({ email: ctx.body.email.toLowerCase() }); 

      if (!user) { done(null, false, {'message': 'User not found.'}); } 
      const password = ctx.body.password; 
      if (!user.validPassword(password)) 
       return done(null, false, {'message': 'Password not correct.'}); 

      done(null, user); 

     } else { 
      done(null, false, {'message': 'Email and Password are required.'}); 
     } 
    } catch (error) { 
     done(error); 
    } 
}); 

Lorsque vous essayez d'exécuter une demande de poste à /auth/email je reçois l'erreur suivante;

generating token....
undefined
xxx POST /api/auth/email 500 124ms
TypeError: Cannot read property 'user' of undefined...

C'est la première fois que je utilise koa et passeport, donc j'ai essayé de nettoyer un repo github j'ai trouvé. (https://github.com/zombiQWERTY/koa2-starter-kit) et le code est principalement adapté à partir d'ici.

Un conseil sur ce que le problème pourrait être est très apprécié, et si vous avez besoin de plus d'informations/veux que je partage plus de parties du code du serveur s'il vous plaît faites le moi savoir.


EDIT:

Voici la trace de la pile:

TypeError: Cannot read property 'user' of undefined 
     at _callee2$ (C:\api/app/auth/index.js:45:12) 
     at tryCatch (C:\api\node_modules\regenerator-runtime\runtime.js:65:40) 
     at Generator.invoke [as _invoke] (C:\api\node_modules\regenerator-runtime\runtime.js:303:22) 
     at Generator.prototype.(anonymous function) [as next] (C:\api\node_modules\regenerator-runtime\runtime.js:117:21) 
     at step (C:\api\app\auth\index.js:39:191) 
     at C:\api\app\auth\index.js:39:437 
     at Promise (<anonymous>) 
     at C:\api\app\auth\index.js:39:99 
     at C:\api/app/auth/index.js:45:5 
     at dispatch (C:\api\node_modules\koa-router\node_modules\koa-compose\index.js:44:32) 
     at next (C:\api\node_modules\koa-router\node_modules\koa-compose\index.js:45:18) 
     at p.then.cont (C:\api\node_modules\koa-passport\lib\framework\koa.js:144:16) 
     at <anonymous> 
     at process._tickDomainCallback (internal/process/next_tick.js:208:7) 

Uploaded code actuel Repo: https://github.com/alexc101/koa-api

Répondre

3

Selon les koa-passport docs, avec v3, vous devez être des économies votre utilisateur à ctx.state.user au lieu de ctx.passport.user.

https://github.com/rkusa/koa-passport

Je baissai votre pension et changé toutes les références de ctx.passport-ctx.state et la route /email donne un 200 maintenant.