From 8a282e88ccd40c17023183cf8d4e71afd6d42595 Mon Sep 17 00:00:00 2001 From: jackyu66git Date: Tue, 15 Sep 2026 00:26:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E5=A2=9E=E5=8A=A0=E5=86=85?= =?UTF-8?q?=E9=83=A8=E7=AD=BE=E5=8F=91=E5=B0=8F=E7=A8=8B=E5=BA=8F=20token?= =?UTF-8?q?=EF=BC=8C=E4=BE=9B=20Go=20=E8=BF=87=E6=B8=A1=E7=BD=91=E5=85=B3?= =?UTF-8?q?=E6=8D=A2=E7=A5=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 空密钥时拒绝签发,避免未配置环境对外开接口。 Co-authored-by: Cursor --- .../controller/app/InternalSsoController.java | 47 +++++++++++++++++++ .../com/oneone/auth/service/LoginService.java | 2 + .../auth/service/impl/LoginServiceImpl.java | 21 +++++++++ oneone-auth/src/main/resources/bootstrap.yml | 6 ++- 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 oneone-auth/src/main/java/com/oneone/auth/controller/app/InternalSsoController.java diff --git a/oneone-auth/src/main/java/com/oneone/auth/controller/app/InternalSsoController.java b/oneone-auth/src/main/java/com/oneone/auth/controller/app/InternalSsoController.java new file mode 100644 index 0000000..c4504ce --- /dev/null +++ b/oneone-auth/src/main/java/com/oneone/auth/controller/app/InternalSsoController.java @@ -0,0 +1,47 @@ +package com.oneone.auth.controller.app; + +import com.oneone.auth.service.LoginService; +import com.oneone.common.base.LocalToken; +import com.oneone.common.result.Result; +import io.swagger.v3.oas.annotations.Hidden; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Hidden +@RestController +@RequestMapping("/oauth/internal") +@RequiredArgsConstructor +public class InternalSsoController { + private final LoginService loginService; + + @Value("${auth.internal-issue-key:}") + private String internalIssueKey; + + @PostMapping("/issue-mini-app") + public Result issueMiniApp( + @RequestHeader(value = "X-Internal-Key", required = false) String key, + @RequestBody IssueMiniAppParam body + ) { + if (!StringUtils.hasText(internalIssueKey) || !internalIssueKey.equals(key)) { + return Result.failed("unauthorized"); + } + if (body == null || !StringUtils.hasText(body.getOpenid())) { + return Result.failed("openid required"); + } + return Result.success(loginService.issueMiniAppByOpenid(body.getOpenid(), body.getUnionId(), body.getPhone())); + } + + @Data + public static class IssueMiniAppParam { + private String openid; + private String unionId; + private String phone; + } +} diff --git a/oneone-auth/src/main/java/com/oneone/auth/service/LoginService.java b/oneone-auth/src/main/java/com/oneone/auth/service/LoginService.java index 053007c..03e2dcd 100644 --- a/oneone-auth/src/main/java/com/oneone/auth/service/LoginService.java +++ b/oneone-auth/src/main/java/com/oneone/auth/service/LoginService.java @@ -27,6 +27,8 @@ public interface LoginService { LocalToken miniApp(String code,String miniAppParamStr); + LocalToken issueMiniAppByOpenid(String openid, String unionId, String phone); + LocalToken officialAccount(String officialAccountParamStr); LocalToken appleJwt(String token); diff --git a/oneone-auth/src/main/java/com/oneone/auth/service/impl/LoginServiceImpl.java b/oneone-auth/src/main/java/com/oneone/auth/service/impl/LoginServiceImpl.java index eac98db..72b8845 100644 --- a/oneone-auth/src/main/java/com/oneone/auth/service/impl/LoginServiceImpl.java +++ b/oneone-auth/src/main/java/com/oneone/auth/service/impl/LoginServiceImpl.java @@ -272,6 +272,27 @@ public class LoginServiceImpl implements LoginService { return token; } + @Override + public LocalToken issueMiniAppByOpenid(String openid, String unionId, String phone) { + if (!StringUtils.hasText(openid)) { + throw new BusinessException("登录失败,请稍后再试"); + } + AccountInfo accountInfo = accountInfoService.getAccountInfo(AccountTypeEnum.MINI_APP.getCode(), openid); + if (accountInfo == null) { + RegisterParam registerParam = new RegisterParam(AccountTypeEnum.MINI_APP.getCode(), openid); + registerParam.setPhone(phone); + registerParam.setUnionId(unionId); + accountInfo = accountInfoService.register(registerParam); + } + if (accountInfo.getStatus() == 0) { + log.error("微信登录,账号被封禁,账号:{}", openid); + throw new BusinessException(ErrorCodeConstants.USER_ACCOUNT_LOCKED); + } + LocalToken token = TokenUtil.generateToken(tokenValid, AccountTypeEnum.MINI_APP.getCode(), openid, accountInfo.getPlatformUserId(), GrantTypeEnum.MINI_APP.getCode()); + appRedisTokenStore.storeAccessToken(token); + return token; + } + @Override public LocalToken officialAccount(String officialAccountParamStr) { OfficialAccountParam officialAccountParam = JsonUtils.strToClass(officialAccountParamStr, OfficialAccountParam.class); diff --git a/oneone-auth/src/main/resources/bootstrap.yml b/oneone-auth/src/main/resources/bootstrap.yml index 066ad72..5065a4f 100644 --- a/oneone-auth/src/main/resources/bootstrap.yml +++ b/oneone-auth/src/main/resources/bootstrap.yml @@ -19,4 +19,8 @@ springdoc: knife4j: enable: true # 2.2 是否开启 Swagger 文档的 Knife4j UI 界面 setting: - language: zh_cn \ No newline at end of file + language: zh_cn + +# ECR-049:Go 内网换小程序 token。须与 Go JAVA_INTERNAL_KEY 一致;空则拒绝签发。 +auth: + internal-issue-key: ${AUTH_INTERNAL_ISSUE_KEY:} \ No newline at end of file