• Express.js实现注册和登录


     注册接口

    注册接口,用户提供必要的注册信息(如用户名和密码),服务器对用户进行验证并创建用户账号

    1. // 注册接口
    2. app.post('/register', async (req, res) => {
    3. try {
    4. const { username, email, password } = req.body;
    5. // 检查用户名和邮箱是否已被注册
    6. if (users.some(user => user.username === username)) {
    7. return res.status(400).json({ error: '用户名已被注册' });
    8. }
    9. if (users.some(user => user.email === email)) {
    10. return res.status(400).json({ error: '邮箱已被注册' });
    11. }
    12. // 使用bcrypt对密码进行哈希处理
    13. const hashedPassword = await bcrypt.hash(password, 10);
    14. // 创建新用户对象
    15. const user = {
    16. id: Date.now().toString(),
    17. username,
    18. email,
    19. password: hashedPassword
    20. };
    21. // 将用户信息存储到数据库
    22. users.push(user);
    23. // 创建访问令牌
    24. const token = jwt.sign({ userId: user.id }, 'secretKey');
    25. res.status(201).json({ message: '注册成功', token });
    26. } catch (error) {
    27. res.status(500).json({ error: '注册失败' });
    28. }
    29. });

    登录接口

    登录接口,用户提供登录凭据(如用户名和密码),服务器验证凭据的正确性并颁发访问令牌

    1. app.post('/login', (req, res) => {
    2. // 获取登录凭据
    3. const { username, password } = req.body;
    4. // 在此处进行用户名和密码的验证,如检查用户名是否存在、密码是否匹配等;验证成功,颁发访问令牌;
    5. const token = createAccessToken(username);
    6. // 将访问令牌写入 Cookie
    7. res.cookie('token', token, {
    8. httpOnly: true,
    9. secure: true, // 仅在 HTTPS 连接时发送 Cookie
    10. sameSite: 'Strict' // 限制跨站点访问,提高安全性
    11. });
    12. // 返回登录成功的响应
    13. res.status(200).json({ message: '登录成功' });
    14. });

    校验接口 

    校验登录状态,服务器将校验请求中的登录凭据(Cookie 或访问令牌)的有效性

    1. app.get('/protected', (req, res) => {
    2. // 从请求的 Cookie 中提取访问令牌
    3. const token = req.cookies.token;
    4. // 或从请求头部中提取访问令牌,如果采用前端存储和发送访问令牌方式;示例代码,需根据实际情况进行解析 const token = req.headers.authorization.split(' ')[1];
    5. // 检查访问令牌的有效性
    6. if (!token) {
    7. return res.status(401).json({ error: '未提供访问令牌' });
    8. }
    9. try {
    10. // 验证访问令牌
    11. const decoded = verifyAccessToken(token);
    12. // 在此处进行更详细的用户权限校验等操作
    13. // 返回受保护资源
    14. res.status(200).json({ message: '访问受保护资源成功' });
    15. } catch (error) {
    16. res.status(401).json({ error: '无效的访问令牌' });
    17. }
    18. });

    前端存储和发送访问令牌

    1. // 从存储中获取访问令牌
    2. const token = localStorage.getItem('token');
    3. // 设置请求头部
    4. const headers = {
    5. 'Authorization': `Bearer ${token}`
    6. };
    7. // 发送请求时,手动设置请求头部
    8. fetch('/protected', { headers });

    使用前端的 localStorage 来存储访问令牌,并在发送请求时手动设置了请求头部的 Authorization 字段。

    注意:无论使用哪种方式,都需要在服务器端进行访问令牌的验证和安全性检查,以确保请求的合法性和保护用户数据的安全。

  • 相关阅读:
    【校招VIP】产品分析之活动策划宣传
    一道有趣的最长子序列问题
    c语言中链栈的基本操作
    Spring Boot2.7生成用于登录的图片验证码
    计算机毕业设计SSM电竞资讯网站【附源码数据库】
    AI应用开发入门12:登录注册表单路由切换教程
    LeetCode刷题复盘笔记—一文搞懂纯0-1背包问题(动态规划系列第六篇)
    vue3 组件通讯
    Worthington果胶酶的特性及测定方案
    银行分布式存储基础设施创新实践分享
  • 原文地址:https://blog.csdn.net/qq_46344419/article/details/136194448