package com.onekeycall.videotablet.controller; import com.onekeycall.videotablet.dto.TokenPair; import com.onekeycall.videotablet.entity.User; import com.onekeycall.videotablet.result.Result; import com.onekeycall.videotablet.service.UserService; import com.onekeycall.videotablet.utils.JwtUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.*; import java.util.*; @RestController @RequestMapping("/public") public class LoginController { private final UserService userService; private final AuthenticationManager authenticationManager; @Autowired private RedisTemplate redisTemplate; @Autowired private JwtUtil jwtUtil; @Autowired public LoginController(UserService userService, AuthenticationManager authenticationManager) { this.userService = userService; this.authenticationManager = authenticationManager; } @PostMapping("/register") public ResponseEntity registerUser(@RequestBody RegisterRequest registerRequest) { try { userService.registerUser(registerRequest.getUsername(), registerRequest.getPassword()); return new ResponseEntity<>("User registered successfully", HttpStatus.CREATED); } catch (RuntimeException e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST); } } @PostMapping("/phone_login") public Result phoneLogin( @RequestHeader("Device-ID") String deviceId, @RequestParam String phone, @RequestParam String password) { User user = userService.getUserByPhone(phone); if (user == null) { return Result.error().message("User not found with phone: " + phone); } String userId = user.getUserId(); // 1. 创建认证令牌 Authentication authenticationToken = new UsernamePasswordAuthenticationToken(userId, password); try { // 2. 使用 AuthenticationManager 进行认证(核心步骤) Authentication authentication = authenticationManager.authenticate(authenticationToken); // 3. 认证成功后生成 JWT User userDetails = (User) authentication.getPrincipal(); TokenPair tokenPair = jwtUtil.generateTokenPair(userDetails.getUserId(), deviceId); // 4. 返回 Token return Result.ok().data(Collections.singletonMap("token", tokenPair.toMap())); } catch (Exception e) { e.printStackTrace(); return Result.error().message("登录失败"); } } @PostMapping("/login") public ResponseEntity login( @RequestHeader("Device-ID") String deviceId, @RequestParam(value = "user_id") String userId, @RequestParam String password) { // 1. 创建认证令牌 Authentication authenticationToken = new UsernamePasswordAuthenticationToken(userId, password); // 2. 使用 AuthenticationManager 进行认证(核心步骤) Authentication authentication = authenticationManager.authenticate(authenticationToken); // 3. 认证成功后生成 JWT User userDetails = (User) authentication.getPrincipal(); TokenPair tokenPair = jwtUtil.generateTokenPair(userDetails.getUserId(), deviceId); // 4. 返回 Token return ResponseEntity.ok(Collections.singletonMap("token", tokenPair.toMap())); } // 注册请求参数类 public static class RegisterRequest { private String username; private String password; // Getters and Setters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } @PostMapping("/phone_register") public Result registerByPhone( @RequestParam String phone, @RequestParam String code, @RequestParam(value = "verify_key") String verifyKey, @RequestParam(value = "device_id") String deviceId) { // // if (TextUtils.isEmpty(verifyKey)) { // return Result.error().message("verify key is empty", HttpStatus.BAD_REQUEST); // } Map map = (Map) redisTemplate.opsForValue().get(phone); if (map != null) { String redisVerifyKey = (String) map.get("verifyKey"); if (!Objects.equals(redisVerifyKey, verifyKey)) { return Result.error().message("verify key is not same"); } String redisCode = map.get("code").toString(); if (!Objects.equals(redisCode, code)) { return Result.error().message("code is not same"); } try { User user = userService.registerByPhone(phone, code, deviceId, new Date()); TokenPair tokenPair = jwtUtil.generateTokenPair(user.getUserId(), deviceId); //返回给app保存,access_token用来加入header请求接口,refresh_token用来更换access_token Map tokenMap = new HashMap<>(); tokenMap.put("new_user", user.isNewUser()); tokenMap.put("user_id", user.getUserId()); tokenMap.put("has_password", user.isHasPassword()); tokenMap.put("token", tokenPair.toMap()); return Result.ok().data(tokenMap); } catch (RuntimeException e) { return Result.error().message(e.getMessage()); } finally { redisTemplate.delete(phone); } } else { return Result.error().message("verify key is expired"); } } @PostMapping("/phone_code_login") public Result loginByPhoneCode( @RequestParam String phone, @RequestParam String code, @RequestParam(value = "verify_key") String verifyKey, @RequestParam(value = "device_id") String deviceId) { Map map = (Map) redisTemplate.opsForValue().get(phone); if (map != null) { String redisVerifyKey = (String) map.get("verifyKey"); if (!Objects.equals(redisVerifyKey, verifyKey)) { return Result.error().message("verify key is not same"); } String redisCode = map.get("code").toString(); if (!Objects.equals(redisCode, code)) { return Result.error().message("code is not same"); } try { User user = userService.loginByPhone(phone, code); // 生成并返回JWT令牌(实际项目中需要实现JWT逻辑) TokenPair tokenPair = jwtUtil.generateTokenPair(user.getUserId(), deviceId); Map tokenMap = new HashMap<>(); tokenMap.put("new_user", user.isNewUser()); tokenMap.put("user_id", user.getUserId()); tokenMap.put("has_password", user.isHasPassword()); tokenMap.put("token", tokenPair.toMap()); return Result.ok().data(tokenMap); } catch (RuntimeException e) { return Result.error().message(e.getMessage()); } } else { return Result.error().message("verify key is expired"); } } }