这篇文章我们要建立的群众权益维护平台需要提供用户注册、登录、提交和查看问题或建议的功能,并且支持电话短信登录。在这个过程中,我们需要存储用户的登录信息。
我们将使用Node.js和Express.js作为后端框架,MongoDB作为数据库,并且使用Twilio服务发送短信验证码来实现手机登录。这个过程涉及到前后端的编程,下面将详细解释如何实现。
后端编码
我们首先创建后端应用和相关的路由,首先需要创建一个新的Node.js应用,然后安装相关的库:
mkdir rights-platform cd rights-platform npm init -y npm install express mongoose bcryptjs jsonwebtoken twilio cors
然后,我们创建一个新的Express应用,并且设置路由处理用户的注册和登录请求。以下是一个非常基本的例子:
// server.js const express = require('express'); const mongoose = require('mongoose'); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const cors = require('cors'); const Twilio = require('twilio'); const app = express(); app.use(express.json()); app.use(cors()); // 连接到MongoDB数据库 mongoose.connect('mongodb://localhost:27017/rights-platform', { useNewUrlParser: true, useUnifiedTopology: true }); // 创建用户数据模型 const userSchema = new mongoose.Schema({ username: String, password: String, phone: String }); const User = mongoose.model('User', userSchema); // 用户注册 app.post('/api/register', async (req, res) => { const hashedPassword = await bcrypt.hash(req.body.password, 10); const user = new User({ username: req.body.username, password: hashedPassword, phone: req.body.phone }); try { await user.save(); res.send({ message: 'User registered' }); } catch (error) { res.status(500).send({ message: 'Error registering user' }); } }); // 用户登录 app.post('/api/login', async (req, res) => { const user = await User.findOne({ username: req.body.username }); if (!user || !await bcrypt.compare(req.body.password, user.password)) { return res.status(401).send({ message: 'Invalid username or password' }); } const token = jwt.sign({ id: user.id }, 'secret'); res.send({ token }); }); // 启动应用 const port = process.env.PORT || 5000; app.listen(port, () => console.log(`Server running on port ${port}`));
这个代码涉及到了注册和登录的基本功能,包括了密码的哈希,JWT的生成等,但还没有实现手机验证码登录。我们在下一步中将添加手机验证码登录的功能。
我们将使用Twilio服务发送短信验证码。
在开始之前,您需要在Twilio网站注册一个账户,并获取一个Twilio phone number、Account SID和Auth Token。将这些信息存储在环境变量中,或者直接在代码中使用(不推荐)。
我们也需要添加一个新的数据模型来存储验证码,以便验证用户输入的验证码是否正确。我们同样使用mongoose库来创建数据模型。
以下是如何添加手机验证码登录的代码:
// server.js // 在文件顶部引入相关库 const twilio = require('twilio'); // 创建Twilio客户端 const twilioClient = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN); // 创建验证码数据模型 const verificationSchema = new mongoose.Schema({ phone: String, code: String, createdAt: { type: Date, expires: '10m', default: Date.now } }); const Verification = mongoose.model('Verification', verificationSchema); // 发送验证码 app.post('/api/send-verification', async (req, res) => { const verificationCode = Math.floor(Math.random() * 1000000).toString().padStart(6, '0'); const verification = new Verification({ phone: req.body.phone, code: verificationCode }); try { await verification.save(); await twilioClient.messages.create({ body: `Your verification code is ${verificationCode}`, from: process.env.TWILIO_PHONE_NUMBER, to: req.body.phone }); res.send({ message: 'Verification code sent' }); } catch (error) { res.status(500).send({ message: 'Error sending verification code' }); } }); // 使用验证码登录 app.post('/api/login-with-phone', async (req, res) => { const verification = await Verification.findOne({ phone: req.body.phone, code: req.body.code }); if (!verification) { return res.status(401).send({ message: 'Invalid phone number or verification code' }); } const user = await User.findOne({ phone: req.body.phone }); if (!user) { return res.status(401).send({ message: 'User not found' }); } const token = jwt.sign({ id: user.id }, 'secret'); res.send({ token }); });
此代码添加了发送验证码和使用验证码登录的功能。验证码在创建10分钟后会自动从数据库中删除,以防止其被重新使用。
请注意,这只是一个基本的实现,还有很多细节需要处理,例如错误处理、安全性考虑等。在实际应用中,可能还需要添加更多的功能,例如用户管理、权限控制等。
后续我们将实现这些功能,请关注我们专栏。