下面我来详细讲解如何实现手机短信登录的完整攻略:
步骤一:申请短信服务
要实现手机短信登录,首先需要申请一个短信服务供应商提供的服务,通常情况下这些服务都需要扣除一定的费用,具体费用因服务供应商而异。以下是两种比较常用的短信服务供应商:
腾讯云短信服务
腾讯云短信服务提供快速、高可靠、低成本、全网覆盖的短信验证码发送服务。首先,你需要去 腾讯云官网 进行注册,然后选择相关的服务选项申请使用云短信服务,申请后可以获得相应的 AppID
、AppKey
等验证信息用于调用短信服务。
阿里云短信服务
阿里云短信服务也是一款非常稳定、高效的短信验证码发送服务,有着国内较为广泛的使用。要使用阿里云短信服务,首先需要去 阿里云官网 进行注册,然后选择相关的短信服务选项,根据官网提供的操作指导即可完成申请,申请后可以获得相应的 AccessKeyId
、AccessKeySecret
等验证信息用于调用该服务。
步骤二:集成短信服务
申请成功后,我们需要将相应的验证信息集成到我们的项目中,以便通过接口随时调用。下面以使用腾讯云短信服务为例,提供一个简单的 Java 工具类:
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Base64;
import java.util.Random;
public class SmsSender {
private static final String SDK_APP_ID = "Your SDKAppID";
private static final String SECRET_ID = "Your SecretID";
private static final String SECRET_KEY = "Your SecretKey";
private static final String SIGN_NAME = "YourSignName";
private static final String TEMPLATE_ID = "YourTemplateId";
/**
* 根据手机号发送验证码短信
*
* @param phoneNumber 手机号码
* @return 发送结果
*/
public static String sendVerificationCode(String phoneNumber) {
try {
long currTime = System.currentTimeMillis() / 1000;
int randomNumber = new Random().nextInt(999999);
String original = String.format(
"apikey=%s&random=%d&time=%d&mobile=%s",
SECRET_KEY, randomNumber, currTime, phoneNumber
);
String hmac = hmacSha256(original, SECRET_ID);
String requestUrl = String.format(
"https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=%s&random=%d",
SDK_APP_ID, randomNumber
);
String requestBody = String.format(
"{"
+ "\"tel\": {\"mobile\": \"%s\"},"
+ "\"sign\":\"%s\","
+ "\"tpl_id\":\"%s\","
+ "\"params\":[\"%d\"]"
+ "}",
phoneNumber, SIGN_NAME, TEMPLATE_ID, randomNumber
);
HttpUtils.HttpResponse response = HttpUtils.post(requestUrl, requestBody, "Content-Type", "application/json", "Authorization", hmac);
String json = response.getContent();
if (response.getStatus() == 200) {
return json;
} else {
return String.format("{\"result\": %d, \"errmsg\": \"%s\"}", response.getStatus(), json);
}
} catch (Exception e) {
return String.format("{\"result\": -1, \"errmsg\": \"%s\"}", e.getMessage());
}
}
/**
* HmacSHA256签名
*
* @param data 原始字符串
* @param secret 私钥
* @return 签名结果
* @throws Exception 异常
*/
private static String hmacSha256(String data, String secret) throws Exception {
byte[] secretBytes = secret.getBytes(StandardCharsets.UTF_8);
SecretKeySpec signingKey = new SecretKeySpec(secretBytes, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
byte[] rawHmac = mac.doFinal(dataBytes);
byte[] signatureBytes = Base64.getEncoder().encode(rawHmac);
return URLEncoder.encode(new String(signatureBytes, StandardCharsets.UTF_8), StandardCharsets.UTF_8.name());
}
}
步骤三:实现手机短信登录接口
有了短信服务,我们就可以开始实现短信登录的接口了。下面提供一个参考实现:
@RestController
public class SmsLoginController {
@Autowired
private UserDetailsService userDetailsService;
/**
* 发送验证码
*
* @param phoneNumber 手机号码
* @return 发送结果
*/
@PostMapping("/login/sms/send")
public String sendVerificationCode(@RequestParam("phoneNumber") String phoneNumber) {
String result = SmsSender.sendVerificationCode(phoneNumber);
if (result.contains("\"result\":0")) {
return "{\"code\":0,\"message\":\"发送成功\"}";
} else {
return "{\"code\":1,\"message\":\"发送失败\"}";
}
}
/**
* 手机验证码登录
*
* @param phoneNumber 手机号码
* @param code 验证码
* @return 登录结果
*/
@PostMapping("/login/sms")
public String smsLogin(@RequestParam("phoneNumber") String phoneNumber, @RequestParam("code") String code) {
UserDetails userDetails = userDetailsService.loadUserByUsername(phoneNumber);
if (userDetails == null) {
return "{\"code\":1,\"message\":\"该手机号未注册\"}";
}
// 模拟验证码与数据库中存储的值进行比较
if (!"123456".equals(code)) {
return "{\"code\":1,\"message\":\"验证码错误\"}";
}
String token = JwtTokenUtil.generateToken(userDetails);
return "{\"code\":0,\"message\":\"登录成功\",\"data\":{\"token\":\"" + token + "\"}}";
}
}
在这个示例中,我们通过 /login/sms/send
接口发送短信验证码,然后使用 /login/sms
接口进行登录认证。认证过程中需要验证验证码是否有效,并通过 JWT 生成一个新的令牌返回给客户端。在生产环境中,你可能需要根据实际情况调整认证方式和参数等内容。
以上就是javaweb项目如何实现手机短信登录的完整攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javaweb项目如何实现手机短信登录 - Python技术站