ctx.passport 在 koa 中使用护照时尝试生成 jsonwebtoken 时未定义?
ctx.passport undefined when trying to generate a jsonwebtoken when using passport with koa?
我正在尝试使用 Koa 2 和 passport 创建一个简单的用户 register/login api。
尝试登录时出现问题。
这是路线的代码;
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' };
}
}
这是 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,
};
}
};
}
最后是护照电子邮件策略:
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);
}
});
当尝试 运行 向 /auth/email
发出 post 请求时,出现以下错误;
generating token....
undefined
xxx POST /api/auth/email 500 124ms
TypeError: Cannot read property 'user' of undefined...
这是我第一次使用 koa 和 passport,所以我一直在尝试清理我发现的 github 存储库。 (https://github.com/zombiQWERTY/koa2-starter-kit) 代码大部分改编自这里。
非常感谢任何关于问题的建议,如果您需要更多信息/希望我分享服务器代码的更多部分,请告诉我。
编辑:
这是堆栈跟踪:
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)
已将当前代码上传到 repo:https://github.com/alexc101/koa-api
根据 koa-passport
文档,对于 v3,您应该将用户保存到 ctx.state.user
而不是 ctx.passport.user
。
https://github.com/rkusa/koa-passport
我删除了你的 repo,并将 ctx.passport
的所有引用更改为 ctx.state
,/email
路由现在给出了 200。
我正在尝试使用 Koa 2 和 passport 创建一个简单的用户 register/login api。
尝试登录时出现问题。
这是路线的代码;
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' };
}
}
这是 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,
};
}
};
}
最后是护照电子邮件策略:
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);
}
});
当尝试 运行 向 /auth/email
发出 post 请求时,出现以下错误;
generating token....
undefined
xxx POST /api/auth/email 500 124ms
TypeError: Cannot read property 'user' of undefined...
这是我第一次使用 koa 和 passport,所以我一直在尝试清理我发现的 github 存储库。 (https://github.com/zombiQWERTY/koa2-starter-kit) 代码大部分改编自这里。
非常感谢任何关于问题的建议,如果您需要更多信息/希望我分享服务器代码的更多部分,请告诉我。
编辑:
这是堆栈跟踪:
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)
已将当前代码上传到 repo:https://github.com/alexc101/koa-api
根据 koa-passport
文档,对于 v3,您应该将用户保存到 ctx.state.user
而不是 ctx.passport.user
。
https://github.com/rkusa/koa-passport
我删除了你的 repo,并将 ctx.passport
的所有引用更改为 ctx.state
,/email
路由现在给出了 200。