/** * BladeX Commercial License Agreement * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. *
* Use of this software is governed by the Commercial License Agreement * obtained after purchasing a license from BladeX. *
* 1. This software is for development use only under a valid license * from BladeX. *
* 2. Redistribution of this software's source code to any third party * without a commercial license is strictly prohibited. *
* 3. Licensees may copyright their own code but cannot use segments * from this software for such purposes. Copyright of this software * remains with BladeX. *
* Using this software signifies agreement to this License, and the software * must not be used for illegal purposes. *
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is * not liable for any claims arising from secondary or illegal development. *
* Author: Chill Zhuang (bladejava@qq.com) */ package org.springblade.auth.granter; import jakarta.servlet.http.HttpServletRequest; import org.springblade.core.oauth2.constant.OAuth2TokenConstant; import org.springblade.core.oauth2.exception.UserInvalidException; import org.springblade.core.oauth2.granter.AbstractTokenGranter; import org.springblade.core.oauth2.handler.PasswordHandler; import org.springblade.core.oauth2.props.OAuth2Properties; import org.springblade.core.oauth2.provider.OAuth2Request; import org.springblade.core.oauth2.service.OAuth2ClientService; import org.springblade.core.oauth2.service.OAuth2User; import org.springblade.core.oauth2.service.OAuth2UserService; import org.springblade.core.sms.model.SmsCode; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.SM2Util; import org.springblade.core.tool.utils.StringPool; import org.springblade.core.tool.utils.StringUtil; import org.springblade.core.tool.utils.WebUtil; import org.springblade.resource.feign.ISmsClient; import org.springframework.stereotype.Component; /** * SmsTokenGranter * * @author BladeX */ @Component public class SmsTokenGranter extends AbstractTokenGranter { private final OAuth2UserService userService; private final ISmsClient smsClient; private final OAuth2Properties properties; public SmsTokenGranter(OAuth2ClientService clientService, OAuth2UserService userService, PasswordHandler passwordHandler, ISmsClient smsClient, OAuth2Properties properties) { super(clientService, userService, passwordHandler); this.userService = userService; this.smsClient = smsClient; this.properties = properties; } @Override public String type() { return SMS_CODE; } @Override public OAuth2User user(OAuth2Request request) { // 获取基础信息 String tenantId = request.getTenantId(); SmsCode smsCode = buildSmsCode(); // 校验手机加密认证 String decryptedPhone = SM2Util.decrypt(smsCode.getPhone(), properties.getPublicKey(), properties.getPrivateKey()); if (StringUtil.isBlank(decryptedPhone)) { throw new UserInvalidException(OAuth2TokenConstant.USER_PHONE_NOT_FOUND); } // 获取短信验证信息 R result = smsClient.validateMessage(tenantId, StringPool.EMPTY, smsCode.getId(), smsCode.getValue(), decryptedPhone); if (!result.isSuccess()) { throw new UserInvalidException(OAuth2TokenConstant.CAPTCHA_NOT_CORRECT); } // 获取用户信息 OAuth2User user = userService.loadByPhone(decryptedPhone, request); // 校验用户信息 if (!userService.validateUser(user)) { throw new UserInvalidException(OAuth2TokenConstant.TOKEN_NOT_CORRECT); } // 设置客户端信息 user.setClient(client(request)); return user; } private SmsCode buildSmsCode() { HttpServletRequest request = WebUtil.getRequest(); return new SmsCode().setId(request.getParameter("id")) .setPhone(request.getParameter("phone")) .setValue(request.getParameter("value")); } }