package cn.iocoder.yudao.module.member.controller.app.auth; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; import cn.iocoder.yudao.module.member.service.auth.MemberAuthService; import cn.iocoder.yudao.module.system.api.social.SocialClientApi; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "用户 APP - 认证") @RestController @RequestMapping("/member/auth") @Validated @Slf4j public class AppAuthController { @Resource private MemberAuthService authService; @Resource private SocialClientApi socialClientApi; @Resource private SecurityProperties securityProperties; @PostMapping("/login") @Operation(summary = "使用手机 + 密码登录") @PermitAll public CommonResult login(@RequestBody @Valid AppAuthLoginReqVO reqVO) { return success(authService.login(reqVO)); } @PostMapping("/logout") @Operation(summary = "登出系统") @PermitAll public CommonResult logout(HttpServletRequest request) { String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); if (StrUtil.isNotBlank(token)) { authService.logout(token); } return success(true); } @PostMapping("/refresh-token") @Operation(summary = "刷新令牌") @Parameter(name = "refreshToken", description = "刷新令牌", required = true) @PermitAll public CommonResult refreshToken(@RequestParam("refreshToken") String refreshToken) { return success(authService.refreshToken(refreshToken)); } // ========== 短信登录相关 ========== @PostMapping("/sms-login") @Operation(summary = "使用手机 + 验证码登录") @PermitAll public CommonResult smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) { return success(authService.smsLogin(reqVO)); } @PostMapping("/send-sms-code") @Operation(summary = "发送手机验证码") @PermitAll public CommonResult sendSmsCode(@RequestBody @Valid AppAuthSmsSendReqVO reqVO) { authService.sendSmsCode(getLoginUserId(), reqVO); return success(true); } @PostMapping("/validate-sms-code") @Operation(summary = "校验手机验证码") @PermitAll public CommonResult validateSmsCode(@RequestBody @Valid AppAuthSmsValidateReqVO reqVO) { authService.validateSmsCode(getLoginUserId(), reqVO); return success(true); } // ========== 社交登录相关 ========== @GetMapping("/social-auth-redirect") @Operation(summary = "社交授权的跳转") @Parameters({ @Parameter(name = "type", description = "社交类型", required = true), @Parameter(name = "redirectUri", description = "回调路径") }) @PermitAll public CommonResult socialAuthRedirect(@RequestParam("type") Integer type, @RequestParam("redirectUri") String redirectUri) { return CommonResult.success(authService.getSocialAuthorizeUrl(type, redirectUri)); } @PostMapping("/social-login") @Operation(summary = "社交快捷登录,使用 code 授权码", description = "适合未登录的用户,但是社交账号已绑定用户") @PermitAll public CommonResult socialLogin(@RequestBody @Valid AppAuthSocialLoginReqVO reqVO) { return success(authService.socialLogin(reqVO)); } @PostMapping("/weixin-mini-app-login") @Operation(summary = "微信小程序的一键登录") @PermitAll public CommonResult weixinMiniAppLogin(@RequestBody @Valid AppAuthWeixinMiniAppLoginReqVO reqVO) { return success(authService.weixinMiniAppLogin(reqVO)); } @PostMapping("/create-weixin-jsapi-signature") @Operation(summary = "创建微信 JS SDK 初始化所需的签名", description = "参考 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 文档") @PermitAll public CommonResult createWeixinMpJsapiSignature(@RequestParam("url") String url) { SocialWxJsapiSignatureRespDTO signature = socialClientApi.createWxMpJsapiSignature( UserTypeEnum.MEMBER.getValue(), url); return success(AuthConvert.INSTANCE.convert(signature)); } }