以下是一个使用Express框架和Redis实现邮箱验证的简单后端示例代码:
const express = require('express');
const redis = require('redis');
const { promisify } = require('util');
const app = express();
const redisClient = redis.createClient();
const setAsync = promisify(redisClient.set).bind(redisClient);
const getAsync = promisify(redisClient.get).bind(redisClient);
const delAsync = promisify(redisClient.del).bind(redisClient);
// 生成验证令牌
function generateToken() {
return new Promise((resolve, reject) => {
require('crypto').randomBytes(20, (err, buffer) => {
if (err) {
reject(err);
} else {
resolve(buffer.toString('hex'));
}
});
});
}
// 邮箱验证接口
app.post('/api/verify-email', async (req, res) => {
const { email } = req.body;
if (!email) {
return res.status(400).send('Email is required.');
}
try {
const token = await generateToken();
await setAsync(token, email);
await setAsync(`${token}:sentAt`, Date.now());
// 这里应当实现发送邮件的逻辑,例如使用Nodemailer
// 模拟发送邮件逻辑
console.log(`Verification email sent to ${email} with token ${token}`);
res.status(200).send('Email verification link has been sent.');
} catch (error) {
console.error('Error generating email verification token:', error);
res.status(500).send('Internal server error.');
}
});
// 验证邮箱接口
app.get('/api/verify-email/:token', async (req, res) => {
const token = req.params.token;
try {
const email = await getAsync(token);
if (!email) {
return res.status(400).send('Invalid or expired token.');
}
await delAsync(token);
await delAsync(`${token}:sentAt`);
// 这里应当实现用户邮箱验证通过后的逻辑处理
// 例如更新用户数据库记录等
console.log(`Email ${email} has been verified.`);
res.status(200).send('Email has been successfully verified.');
} catch (error) {
console.error('Error verifying email:', error);
res.status(500).send('Internal server error.');
}
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
这段代码提供了两个API端点:
/api/verify-email
:接收用户邮箱,生成一个新的令牌,并将邮箱和令牌存储在Redis中。然后,应当实现发送邮件的逻辑。/api/verify-email/:token
:验证令牌是否有效,如果有效,则删除令牌并将用户邮箱标记为已验证。然后,应当实现用户邮箱验证通过后的逻辑处理。
请注意,这个示例并不包括邮件发送逻辑(如使用Nodemailer发送邮件),只是模拟发送邮件的逻辑。实际应用中,你需要实现发送邮件的代码,并确保邮件中包含可以被用来验证用户的URL。