在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:superman66/koa-jwt-sample开源软件地址:https://github.com/superman66/koa-jwt-sample开源编程语言:JavaScript 85.4%开源软件介绍:koa 实现 jwt 认证关于 Token 认证机制,这里不做更多解释。不清楚的可以看我的这篇文章:Web开发中常见的认证机制 所需库
实现思路整个方案实现的流程和思路很清晰,大致分为下面几步:
运行项目该项目需要你已经装好 mongodb,并启动。关于 mongodb 的配置见
该项目提供了三个 api
其中 自定义 401 handler使用了 // server/middlewares/errorHandle.js
export default errorHandle = (ctx, next) => {
return next().catch((err) => {
if (err.status === 401) {
ctx.status = 401;
ctx.body = {
error: err.originalError ? err.originalError.message : err.message,
};
} else {
throw err;
}
});
} 然后在 app
.use(errorHandle) 使用 koa-jwt在 const secert = 'jwt_secret'
app
.use(jwt({
secret,
}).unless({
path: [/\/register/, /\/login/],
})) 其中 // https://github.com/koajs/jwt#token-verification-exceptions
var publicKey = fs.readFileSync('/path/to/public.pub');
app.use(jwt({ secret: publicKey }));
在使用 注册实现注册很简单,这里只是简单的将密码加密,将信息存入数据库。实际项目中,还需要对用户输入的字段进行验证。 /**
* you can register with
* curl -X POST http://localhost:3200/api/register -H 'cache-control: no-cache' -H 'content-type: application/x-www-form-urlencoded' -d 'username=superman2&password=123456'
*/
async register(ctx) {
const { body } = ctx.request;
try {
if (!body.username || !body.password) {
ctx.status = 400;
ctx.body = {
error: `expected an object with username, password but got: ${body}`,
}
return;
}
body.password = await bcrypt.hash(body.password, 5)
let user = await User.find({ username: body.username });
if (!user.length) {
const newUser = new User(body);
user = await newUser.save();
ctx.status = 200;
ctx.body = {
message: '注册成功',
user,
}
} else {
ctx.status = 406;
ctx.body = {
message: '用户名已经存在',
}
}
} catch (error) {
ctx.throw(500)
}
} 登录实现用户输入用户名和密码登录,如果用户名和密码正确的话,使用 /** you can login with
* curl -X POST http://localhost:3200/api/login/ -H 'cache-control: no-cache' -H 'content-type: application/x-www-form-urlencoded' -d 'username=superman2&password=123456'
*/
async login(ctx) {
const { body } = ctx.request
try {
const user = await User.findOne({ username: body.username });
if (!user) {
ctx.status = 401
ctx.body = {
message: '用户名错误',
}
return;
}
// 匹配密码是否相等
if (await bcrypt.compare(body.password, user.password)) {
ctx.status = 200
ctx.body = {
message: '登录成功',
user: user.userInfo,
// 生成 token 返回给客户端
token: jsonwebtoken.sign({
data: user,
// 设置 token 过期时间
exp: Math.floor(Date.now() / 1000) + (60 * 60), // 60 seconds * 60 minutes = 1 hour
}, secret),
}
} else {
ctx.status = 401
ctx.body = {
message: '密码错误',
}
}
} catch (error) {
ctx.throw(500)
}
} 需要注意的是,在使用 更多关于 在登录后,拿着返回的 token,这时候去访问
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论