1. 实现登录功能
所需字段:username password
所需npm包:jsonwebtoken 生成token express-jwt 解析token
npm install jsonwebtoken express-jwt
express-jwt官方文档:https://www.npmjs.com/package/express-jwt
jsonwebtoken官方文档:https://www.npmjs.com/package/jsonwebtoken
实现步骤
- 定义登录字段校验规则对象
// schema/user.js
const joi = require('joi')
const reg_login = {
body: {
username: joi.string().alphanum().min(1).max(10).required(),
password: joi.string().pattern(/^[\S]{6,12}$/).required()
}
}
module.exports = {
reg_login
}
登录和注册实际上都是校验username 和 password,可以共用,注意修改 用户注册路由验证
// 用户注册
router.post('/reguser', validateJoi(userSchema.reg_login), user_handler.regUser)
- 创建路由
// router/user.js
// 添加登录路由
// 用户登录
router.post('/login', validateJoi(userSchema.reg_login), user_handler.login)
- 创建路由处理函数
登录实现:
拿到用户名查询数据库有没有此人,没有,返回查无此人,有则继续下一步
拿到当前用户在数据库的密码,使用bcrypt和当前输入的密码进行对比,密码错误,返回密码错误,登陆失败,否则进行下一步
使用jsonwebtoken创建token,返回登陆成功以及token,再加上用户的基本信息
// router_handler/user.js
// 登录
const login = (req, res) => {
const userInfo = req.body
const sql = `select * from users where username = ?`
// 查询用户在不在数据库中
db.query(sql, userInfo.username, (err, result) => {
if (err) return res.cc(err)
if (result.length !== 1) return res.cc('登陆失败,查无此人!')
// TODO:判断用户输入的登录密码是否和数据库中的密码一致
const compareResult = bcrypt.compareSync(userInfo.password, result[0].password)
if (!compareResult) return res.cc('密码错误,登录失败!')
const user = { ...result[0], password: '' } // 将查询到的用户信息的密码剔除
// 创建token jwt.sign(加密信息, 加密秘钥, 有效期)
const token = jwt.sign(user, 'cjaliwbfsia1sa', {expiresIn: '24h'})
res.send({
status: 0,
msg: '登陆成功!',
userInfo: user,
token: 'Bearer ' + token
})
})
}
可以将jwt加密秘钥和有效期抽离成一个文件 config.js,在根目录创建
// config.js
const jwtConfig = {
jwtKey: 'cjaliwbfsia1sa', // jwt秘钥
expiresIn: '24h' // token有效期
}
module.exports = {
jwtConfig
}
哪里要用就引入
// 修改 登录路由
const { jwtConfig } = require('../config')
const token = jwt.sign(user, jwtConfig.jwtKey, {expiresIn: jwtConfig.expiresIn})
- 测试登录接口:
http://127.0.0.1:8086/api/login
- 请求路径:/api/login
- 请求方法:post
- 请求参数:
请求参数 | 参数类型 | 参数说明 | 备注 |
---|---|---|---|
username | String | 用户名 | 不能为空 长度1-10位 |
password | String | 密码 | 不能为空 长度6-12位 |
评论 (0)