Node编写用户登录接口

目录

前言

服务器

编写登录接口API

使用sql语句查询数据库中是否有该用户

判断密码是否正确

生成JWT的Token字符串

配置解析token的中间件

配置捕获错误中间件

完整的登录接口代码


前言

本文介绍如何使用node编写登录接口以及解密生成token,如何编写注册接口已经在Node编写用户注册接口这篇文章中介绍,本文是建立在编写注册接口这篇文章的基础之上

同时也可以在在前端html页面中向服务器发送post登录请求这篇文章中了解登录请求

服务器

关于创建服务器,本文中和Node编写用户注册接口共用一个服务器,已经引入了router对象

// 导入express模块
const express = require('express')

// 创建express服务器实例
const app = express()

// 导入跨域cors
const cors = require('cors')

// 全局挂载
app.use(cors())

// 配置解析表单数据中间件
app.use(express.urlencoded({extended:false}))

// 导入用户路由对象
const userRouter = require('./router/user')
app.use('/api',userRouter)

// 启动服务器
app.listen(3007,()=> {
    console.log('running the http://127.0.0.1:3007');
})

编写登录接口API

使用sql语句查询数据库中是否有该用户
const userinfo = req.body
    const sql = 'select * from ev_users where username = ?'
    db.query(sql, userinfo.username, function (err, results) {
        // 执行 SQL 语句失败
        if (err) {
            return res.send({status:1,message:err.message})
        }
        // 执行 SQL 语句成功,但是查询到数据条数不等于 1
        if (results.length !== 1) {
            return res.send({status:1,message:'登录失败'})
        }
        res.send('登录成功')
    })

使用postman模拟发送登录请求,查询是否有用户名为b

返回登录成功

数据库中有b用户

如果未注册

数据库中没有c用户

判断密码是否正确

调用了bcrypt.compareSync()方法,用来解密,因为在注册时已经把密码加密了,所以需要解密

bcrypt.compareSync(用户提交的密码,数据库中的密码)

// 判断密码是否正确
        const compareResult = bcrypt.compareSync(userinfo.password,results[0].password)
        if(!compareResult) return res.send({status:1,message:'密码错误'})
        res.send('登录成功')

验证b的密码是否正确

b的密码是000000

当把b的密码换成111111时,也就是错误密码

返回密码错误

生成JWT的Token字符串

关于JWT认证,可以浏览JWT认证这篇文章

生成token字符串时,要把密码和用户头像剔除,因为生成的token会保留在浏览器中,很容易泄露

// 剔除完毕之后,user 中只保留了用户的 id, username, nickname, email 这四个属性的值
const user = { ...results[0], password: '', user_pic: '' }

先安装jsonwebtoken

npm i jsonwebtoken

导入jwt

const jwt = require('jsonwebtoken')

导入成功后调用jwt.sign()生成JWT字符串

jwt.sign(用户的信息,加密的密钥,配置对象有效token的时间)

// 生成 Token 字符串
        const tokenStr = jwt.sign(user, jwtSecreKey, {
        expiresIn: '10h', // token 有效期为 10 个小时
            })

将生成的token字符串发送给客户端

在生成的的token字符串前拼接上"Bearer",固定用法

res.send({
                status: 0,
                message: '登录成功!',
                // 为了方便客户端使用 Token,在服务器端直接拼接上 Bearer 的前缀
                token: 'Bearer ' + tokenStr,
              })

使用postman模拟发送请求

配置解析token的中间件

将jwt字符串还原为JSON对象,在get请求时,可以获得用户信息

安装express-jwt

npm i express-jwt

导入

/ 导入解析token字符串
const exoressjwt = require('express-jwt')

解析token

// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
app.use(expressjwt.expressjwt({
    secret:jwtSecreKey,
    algorithms:['HS256'],
}).unless({path:[/^\/api\//]}))
配置捕获错误中间件
// 错误中间件
app.use(function (err, req, res, next) {
    // 捕获身份认证失败的错误
   if (err.name === 'UnauthorizedError') return res.send({satus:1,message:'身份认证失败'})
    // 未知错误
    res.send({status:1,message:err.message})
  })

完整的登录接口代码

// 导入express模块
const express = require('express')
// 导入数据库对象
const db = require('../db/index')

// 导入加密模块
const bcrypt = require('bcryptjs')

// 创建路由对象
const router = express.Router()

// 导入JWT
const jwt = require('jsonwebtoken')
// 定义密钥
const jwtSecreKey = 'notbald'


// 登录接口
router.post('/login',(req,res)=>{
    const userinfo = req.body
    const sql = 'select * from ev_users where username = ?'
    db.query(sql, userinfo.username, function (err, results) {
        // 执行 SQL 语句失败
        if (err) {
            return res.send({status:1,message:err.message})
        }
        // 执行 SQL 语句成功,但是查询到数据条数不等于 1
        if (results.length !== 1) {
            return res.send({status:1,message:'登录失败'})
        }
        // 判断密码是否正确
        const compareResult = bcrypt.compareSync(userinfo.password,results[0].password)
        if(!compareResult) return res.send({status:1,message:'密码错误'})
        // 生成token字符串,展开运算符,剔除密码和用户头像
        const user = {...results[0],password:'',user_pic:''}
        // console.log(user);
        
        // 生成 Token 字符串
        const tokenStr = jwt.sign(user, jwtSecreKey, {
        expiresIn: '10h', // token 有效期为 10 个小时
            })
            
            res.send({
                status: 0,
                message: '登录成功!',
                // 为了方便客户端使用 Token,在服务器端直接拼接上 Bearer 的前缀
                token: 'Bearer ' + tokenStr,
              })
    })
})

解析token以及全局捕获错误中间件在服务器中

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
好的,下面是一个简单的使用 node.js 和 express 框架编写登录注册接口示例: ```javascript const express = require('express'); const bodyParser = require('body-parser'); const bcrypt = require('bcryptjs'); const app = express(); app.use(bodyParser.json()); // 模拟数据库中的用户数据 const users = [ { id: 1, name: 'Alice', email: '[email protected]', password: '$2a$10$N8l4ZvMwzG8dD0.SbVLU6OT7S8.PQPGJYiKkkLZ5zR5nHZQ4q9n4W', // 密码为 "password" }, { id: 2, name: 'Bob', email: '[email protected]', password: '$2a$10$N8l4ZvMwzG8dD0.SbVLU6OT7S8.PQPGJYiKkkLZ5zR5nHZQ4q9n4W', // 密码为 "password" }, ]; // 注册接口 app.post('/register', async (req, res) => { try { // 从请求体中获取用户名、邮箱和密码 const { name, email, password } = req.body; // 检查用户名和邮箱是否已经被注册 const existingUser = users.find(user => user.name === name || user.email === email); if (existingUser) { return res.status(400).json({ message: 'User already exists' }); } // 对密码进行哈希处理 const salt = await bcrypt.genSalt(); const hashedPassword = await bcrypt.hash(password, salt); // 创建新用户 const newUser = { id: users.length + 1, name, email, password: hashedPassword, }; users.push(newUser); res.status(201).json({ message: 'User created' }); } catch (err) { res.status(500).json({ message: err.message }); } }); // 登录接口 app.post('/login', async (req, res) => { try { // 从请求体中获取邮箱和密码 const { email, password } = req.body; // 查找用户 const user = users.find(user => user.email === email); if (!user) { return res.status(400).json({ message: 'Invalid credentials' }); } // 验证密码 const isMatch = await bcrypt.compare(password, user.password); if (!isMatch) { return res.status(400).json({ message: 'Invalid credentials' }); } res.json({ message: 'Login successful' }); } catch (err) { res.status(500).json({ message: err.message }); } }); // 启动服务器 app.listen(3000, () => console.log('Server started')); ``` 在上面的示例中,我们使用了 `bcrypt` 库对用户密码进行哈希处理,并使用 `express` 框架编写了两个接口:`/register` 和 `/login`。其中,`/register` 接口用于注册新用户,`/login` 接口用于用户登录验证。接口返回的是 JSON 格式的数据。如果请求出现错误,接口会返回相应的错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软工不秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值