Node-登录注册接口

举报
林太白 发表于 2024/11/22 09:57:35 2024/11/22
【摘要】 Node-登录注册接口

登录注册接口

接下来我们在node 之中实现一个/api/login 登录接口,并且从数据库user表中校验用的账号和密码是否存在,存在返回token。

1、用户登录接口开发

(1) 登录接口编写尝试

接下来我们利用登录接口返回我们的token认证,我们做一个简单的模拟


// 用户登录接口
app.post('/api/login', (req, res) => {
    let query = 'SELECT * FROM user';
     // 登录失败
    if (req.body.username !== 'admin' && req.body.password !== '123456') {
      return res.send({
        status: '400',
        message: '登录失败'
      })
    }
    // 登录成功
    // 格式:jwt.sign({用户信息},密钥,token有效时长)
    var tokenStr = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '2h' })
    res.send({
      status: 200,
      message: '登录成功',
      token: tokenStr
    })
});

整个流程是这样子的:

请求接口,开始认证是否在白名单中
在白名单中,进行账号密码判断
失败=》返回信息
正确=》 jwt注册账号名,然后加密以后返回token

当我们输入正确的账号密码时:


{
  "status": 200,
  "message": "登录成功",
  "token": "eyJXXXXXXXXXJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

错误时:


{
  "status": 200,
  "message": "登录成功",
  "token": "eyJXXXXXXXXXJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

{
  "status": "400",
  "message": "登录失败"
}

这里遇到了一下小问题,写的判断居然市失效了,最后清理了一下缓存,重新优化一下判断


// 用户登录接口
app.post('/api/login', (req, res) => {
    // let query = 'SELECT * FROM user';
    console.log(req.body,'req');
    console.log(req.body.username == 'admin');
    console.log(req.body.password == '123456');
    if (req.body.username == 'admin' && req.body.password == '123456') {
      // 登录成功
      console.log(111);
        // 先制作jwt字符串 记住千万不要把密码加密到 token 字符串中,这样容易被人破解密码
        // 格式:jwt.sign({用户信息},密钥,token有效时长)
        var tokenStr = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '2h' })
        res.send({
          status: 200,
          message: '登录成功',
          token: tokenStr
        })
    }else{
       // 登录失败
       console.log(222);
       res.send({
        status: '400',
        message: '登录失败'
      })
    }
});

ok! 问题成功解决!到这里我们的登录接口就已经开发成功了!

(2)数据库调用尝试

接下来我们先设置一个固定的账号密码进行一下调用尝试:

这里需要住的的是账号密码自己取的值部分从哪里来,一开始我经常混淆req.body和req.query的取值部分,这里可以都打印出来看看取值的部分,免得错误,然后怎么找也发现不了问题!


// 用户登录接口
app.post('/api/login', (req, res) => {
    // let query = 'SELECT * FROM user';
    console.log(req.body,'req');
    console.log(req.body.username == 'admin');
    console.log(req.body.password == '123456');

    if (req.body.username == 'admin' && req.body.password == '123456') {
        // 登录成功
        console.log(111);
        // 先制作jwt字符串 记住千万不要把密码加密到 token 字符串中,这样容易被人破解密码
        // 格式:jwt.sign({用户信息},密钥,token有效时长)
        var tokenStr = jwt.sign({username: req.body.username },secretKey, { expiresIn: '24h' })
        res.send({
          code: 200,
          message: '登录成功',
          token: tokenStr,
        })
    }else{
       // 登录失败
       console.log(222);
       res.send({
        code: '400',
        message: '账号不存在!'
      })
    }
   
});

然后对返回结果进行查看,没问题:


{
  "status": 200,
  "message": "登录成功",
  "token": "eyJhbxxxXVCJ9.eyJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

(3)数据库匹配账号密码

接下来从数据库里面查询我们的账号密码是否匹配


// 用户登录接口
app.post('/api/login', (req, res) => {
    // let query = 'SELECT * FROM user';
    // console.log(req.body,'req');
    // console.log(req.body.username == 'admin');
    // console.log(req.body.password == '123456');
     const { username, password } = req.body;

    // if (req.body.username == 'admin' && req.body.password == '123456') {}

     let sql='SELECT * FROM user WHERE username = ?';
      // 查询数据库中是否存在匹配的用户名
    connectionpool.query(sql,[username],(error, results) => {

      if (error) throw error;
      // 检查查询结果是否为空
      if (results.length === 0) {
        return res.status(401).json({ message: '用户名不存在' });
      }
      console.log(results[0].passward,'results-passward');
      console.log('password',password);

      // const user = results[0];
      if(results[0].passward==password){
        var tokenStr = jwt.sign({username: req.body.username },secretKey, { expiresIn: '24h' });
        console.log('登录成功');
        res.send({
          code: 200,
          message: '登录成功',
          token: tokenStr,
        })
      }else{
        console.log('登录失败',user.password,password);
        return res.status(401).json({ message: '密码不正确',code:401 });
      }
    }
  ); 
});

成功时候给与我们的提示:



{
  "status": 200,
  "message": "登录成功",
  "token": "eyJhbxxxXVCJ9.eyJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

失败时候给与我们的提示:



{
  "code": 500,
  "message": "密码不正确"
}

2、用户注册接口开发

(1)接口开发和思考

先起个名:(用户注册接口名称为)'/api/register'

思考

用户的注册其实本质上不就是新用户的增加吗,所以我们这里其实本质上也是直接对于用户的一个增加,这里我们只需要将用户增加的接口迁移过来即可
这里需要注意的点就是:我们在增加直接应该先去数据库里面看一下用户是否已经存在,如果存在的话,那我们就应该让用户重新拟定自己的昵称,避免和数据库之中的重复!

先来看看我们数据库的指令需要什么


// 查询用户 
SELECT * FROM user WHERE username = admin


//添加用户 
INSERT INTO user (name,username, password,state) VALUES (?,?,?,1)

接下来我们开始写一个注册用户的接口


// 用户注册接口
app.post('/api/register', (req, res) => {
  
    console.log(req.body,'req');
    const { username, password } = req.body;
    
    let sql='SELECT * FROM user WHERE username = admin';
      // 查询数据库中是否存在匹配的用户名
    connectionpool.query(sql,[username],(error, results) => {
        // console.log(results,'查询结果!');

      if (error) throw error;
        const name=username;
        const values = [name,username, password];
        // 准备 SQL 插入语句
        const insertSql = ``;
        connectionpool.query(insertSql, values, (err, results) => {
            console.log(results,'results-插入结果!');
            if (err) {
                console.error('Error querying database:', err);
                res.status(500).json({ error: 'Internal server error' });
            }
            res.json({
                code: '200',
               );
        });
     

    }
  ); 
});

(2)优化存在用户的情况

完善添加一下是否添加的用户已经跟数据库里面的用户重复的情况


// 用户注册接口
app.post('/api/register', (req, res) => {
  
    console.log(req.body,'req');
    const { username, password } = req.body;
    
    let sql='SELECT * FROM user WHERE username = ?';
      // 查询数据库中是否存在匹配的用户名
    connectionpool.query(sql,[username],(error, results) => {
        // console.log(results,'查询结果!');

      if (error) throw error;
      // 检查查询结果是否为空
      if (results.length !== 0) {
        res.json({
                code: 401,
                data: results,
                message:'用户名已经存在!'
        });
      }else{
        const name=username;
        const values = [name,username, password];
        // 准备 SQL 插入语句
        const insertSql = `INSERT INTO user (name,username, password,state) VALUES (?,?,?,1)`;
        connectionpool.query(insertSql, values, (err, results) => {
            console.log(results,'results-插入结果!');
            if (err) {
                console.error('Error querying database:', err);
                res.status(500).json({ error: 'Internal server error' });
                return;
            }
            res.json({
                code: '200',
                data: results,
                message:'用户注册成功,欢迎你去登陆!'
            });
        });
      }
    }
  ); 
});

测试成功 ! 当用户注册成功的时候,用户应该去进行登陆!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。