返回

4 步学会搭建双端登入流程,以增强用户体验与系统安全性

人工智能

前言

春招即将来临,准备完善全栈项目来吸引面试官目光。精心设计的数据库与完整登录流程,为项目亮点之一。在本文中,我们将打造一个安全可靠的双端登录流程,以提升用户体验,同时保证系统安全性。我们将会使用 SQL Copilot 简化代码编写过程,并使用 Spring BootReact 构建应用。

第一步:构建登录表单

首先,创建登录表单,让用户输入用户名与密码。您可以使用 React 搭建登录界面,其代码简洁,易于理解。

import React, { useState } from "react";

const LoginForm = () => {
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

  const handleSubmit = (e) => {
    e.preventDefault();

    // 发送登录请求
    fetch("/login", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ username, password }),
    })
      .then((res) => res.json())
      .then((data) => {
        if (data.success) {
          // 登录成功,跳转到主页
          window.location.href = "/";
        } else {
          // 登录失败,显示错误信息
          alert("登录失败,请检查用户名或密码是否正确");
        }
      })
      .catch((err) => {
        console.error(err);
        alert("登录失败,请重试");
      });
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        placeholder="Username"
        value={username}
        onChange={(e) => setUsername(e.target.value)}
      />
      <input
        type="password"
        placeholder="Password"
        value={password}
        onChange={(e) => setPassword(e.target.value)}
      />
      <button type="submit">登录</button>
    </form>
  );
};

export default LoginForm;

第二步:设置后端登录逻辑

接下来,在 Spring Boot 中设置登录逻辑。首先,我们需要创建用户表,存储用户名、密码等信息,使用 SQL Copilot 快速生成代码:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(255) UNIQUE NOT NULL,
  password VARCHAR(255) NOT NULL
);

然后,编写登录接口:

@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody LoginRequest loginRequest) {
    User user = userRepository.findByUsername(loginRequest.getUsername());
    if (user == null || !user.getPassword().equals(loginRequest.getPassword())) {
        return ResponseEntity.badRequest().body("登录失败,请检查用户名或密码是否正确");
    }

    // 生成 JWT 令牌
    String token = jwtUtil.generateToken(user);

    return ResponseEntity.ok(token);
}

第三步:双端共享 JWT

双端登入的重点在于取得JWT授权码,并且能够透过JWT授权码,取得对应的使用者数据。利用 JWT 这个第三方库,我们可以很简单的达到这种效果。

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;

public class JwtUtil {
    private static final Algorithm ALGORITHM = Algorithm.HMAC256("secret");
    private static final JWTVerifier VERIFIER = JWT.require(ALGORITHM).build();

    public static String generateToken(User user) {
        return JWT.create()
                .withClaim("id", user.getId())
                .withClaim("username", user.getUsername())
                .sign(ALGORITHM);
    }

    public static User verifyToken(String token) {
        try {
            var decodedJwt = VERIFIER.verify(token);
            return new User(
                    decodedJwt.getClaim("id").asInt(),
                    decodedJwt.getClaim("username").asString()
            );
        } catch (JWTVerificationException e) {
            return null;
        }
    }
}

第四步:前后台联动

最后,在前端 React 中,使用 JWT 来保持登录状态,当用户登录成功后,将 JWT 令牌存储在本地存储中。在后续请求中,携带 JWT 令牌,以便后端验证用户身份。

总结

通过这四个步骤,我们构建了一个完整的双端登录流程,并确保了系统的安全性。我们还使用 SQL Copilot 简化了代码编写过程,提高了开发效率。