# PluginAuthController.java

    package com.yumu.noveltranslator.adapter.in.rest.plugin;

    import com.yumu.noveltranslator.domain.model.User;
    import com.yumu.noveltranslator.port.dto.common.Result;
    import com.yumu.noveltranslator.enums.ErrorCodeEnum;
    import com.yumu.noveltranslator.port.in.AuthPort;
    import com.yumu.noveltranslator.port.in.DeviceTokenPort;
    import com.yumu.noveltranslator.util.SecurityUtil;
    import lombok.RequiredArgsConstructor;
    import org.springframework.web.bind.annotation.*;

    import java.util.Map;

    /**
     * 插件端认证接口（设备 Token）
     * 路径前缀: /user
     */
    @RestController
    @RequestMapping("/user")
    @RequiredArgsConstructor
    public class PluginAuthController {

        private final AuthPort authPort;
        private final DeviceTokenPort deviceTokenPort;

        /**
         * 网站登录后，注册设备 Token
         * POST /user/register-device
         */
        @PostMapping("/register-device")
        public Result<String> registerDevice(@RequestBody Map<String, String> request) {
            String deviceId = request.get("deviceId");

            if (deviceId == null || deviceId.trim().isEmpty()) {
                return Result.error(ErrorCodeEnum.PARAMETER_ERROR, "设备 ID 不能为空");
            }

            Long userId = SecurityUtil.getRequiredUserId();
            User user = authPort.getUserById(userId).orElse(null);
            if (user == null) {
                return Result.error(ErrorCodeEnum.USER_NOT_FOUND, "用户不存在");
            }

            deviceTokenPort.generateAndRegisterToken(deviceId, user.getId(), user.getEmail(), user.getTenantId());

            return Result.ok("设备注册成功", "200");
        }

        /**
         * 插件获取 Token（通过设备 ID）
         * GET /user/get-token/{deviceId}
         */
        @GetMapping("/get-token/{deviceId}")
        public Result<Map<String, String>> getToken(@PathVariable String deviceId) {
            if (deviceId == null || deviceId.trim().isEmpty()) {
                return Result.error(ErrorCodeEnum.PARAMETER_ERROR, "设备 ID 不能为空");
            }

            Map<String, String> result = deviceTokenPort.verifyAndGetUserInfo(deviceId);

            if (result == null) {
                return Result.error(ErrorCodeEnum.NOT_FOUND, "未找到登录信息，请先在网站登录");
            }

            return Result.ok(result, "200");
        }
    }