短信验证的背景
-
从用户隐私角度出发,任何一个人都希望尽快能少的提供信息给任何商业公司;从用户体验的角度出发,任何一个产品都应需要最少代价完成「登录」以及合规性的要求,并尽可能少的将用户暴露在风险面之下。最好的策略,目前看起来似乎仍然是基于传统的用户名密码方式的认证,但用户是否埋单、是否懂得保护自己,这是个很值得研究的话题。或许使用巨头提供的登录权衡下来,仍然是折衷的选择:避免巨头的追踪已经十分困难。
-
短信验证码顺应时代的发展需要,是在传统的验证方式不足以再进行保障用户的使用安全,而应时就需出现的。以前大家用到的验证码服务,大多是网站自带的数字验证、滑块验证,而这些传统的验证方式,不能像短信验证码这样可以很好的防止有人利用机器人或是自动程序进行自动批量的注册,或使用特定的程序暴力破解,所以以前网站上会出现很多灌水登录、水军,而短信验证码的出现,则可以更好的避免重复注册、烂数据的产生,保证一个用户对应一个账号,让企业利益得到保障的同时,也让用户的信息变得更加安全。
短信验证的思路
通常而言短信验证码的原理是刚开始时,用户在前台填写资料,点击“获取短信验证码”按钮,后台通过先前的设定,接收到前台指令,就生成一条随机验证码,一般是由一串数字或字母组成,调用短信接口,经过服务器响应做大,发送到用户的移动端。用户在前台相应的输入框内输入验证码,后台经过一定的算法支持,而对用户提交的内容和后台存储好的信息比对,如果两者都没有误差,那么用户的身份得到确认,就能够进行下一步操作。
- 实际操作
- 客户填入手机号,通过客户端点击获取验证码按钮,验证手机号是否有效,有效则客户端发送请求到后台服务器中,客户端开始计时60s,不通过则返回;
- 服务器,验证手机号是否被注册或有效,通过则调用第三方的短信通信接口短信(手机号 + 验证码), 然后回调结果,成功则将验证码存入临时全局变量中,失败则返回提示,不通过则返回。
服务器端,收到请求后,用户发送过来的验证码和事前放入临时存储的验证码阿做对比,相同通过,负责提示验证码无效。
- 验证码通过雪花算法生成
- 通过全局变量暂时存储验证码以便对比用完置空
🍎核心代码
/**
* TODO: 生成手机验证码🔓
* */
public static String getRandomAuthCode(){
IdWorker worker = new IdWorker(1,1,1);
String AuthCodeTmp = String.valueOf(worker.nextId());
return AuthCodeTmp.substring(AuthCodeTmp.length() - 6, AuthCodeTmp.length());
}
/**
* TODO: 发送手机验证码📱
*
* @return
*/
public static void SMSVerification(String phoneNumber, String authCode) throws IOException{
//发送内容
String content = "您的手机号:"+ phoneNumber + ",验证码:"+ authCode + ",请及时完成验证,如不是本人操作请忽略。";
// 创建StringBuffer对象用来操作字符串
StringBuffer sb = new StringBuffer("https://api.chanyoo.net/sendsms?");
// 向StringBuffer追加平台帐号
sb.append("username=******");
// 向StringBuffer追加调用密码
sb.append("&password=******");
// 向StringBuffer追加手机号码
sb.append("&mobile=" + phoneNumber);
// 向StringBuffer追加短信内容转URL标准码
sb.append("&content=").append(URLEncoder.encode(content, "UTF-8"));
// 创建url对象
URL url = new URL(sb.toString());
System.out.println(url.toString());
// 打开url连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置url请求方式GET或者POST
connection.setRequestMethod("GET");
// 发送请求
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
// 返回发送结果
String inputline = in.readLine();
// 输出返回结果
System.out.println(inputline);
}
🍎 控制层
package com.niit.clouddemo.controller;
import com.alibaba.fastjson.JSONObject;
import com.niit.clouddemo.pojo.front.User;
import com.niit.clouddemo.service.IRegisterService;
import com.niit.clouddemo.util.BaseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@Controller
@RequestMapping(value = "/register")
public class RegisterController {
@Autowired
private IRegisterService iRegisterService;
/**
* 👨💻: 定义全局变量
* */
static public String PHONE_AUTH_CODE;
/**
* TODO: 🚗到达注册界面
* */
@RequestMapping(value = "/toRegister.do")
public String toRegisterPage(HttpServletRequest request, HttpServletResponse response, Model model){
System.out.println("-----> " + PHONE_AUTH_CODE);
return "f_register";
}
/**
* TODO: 📱获取短信验证码
* @param: phone 请求手机号
* */
@ResponseBody
@RequestMapping(value = "/getAuthCode.do", method = RequestMethod.GET)
public void getAuthCode(@RequestParam("phone") String phone){
String tempCode = BaseUtil.getRandomAuthCode();
PHONE_AUTH_CODE = tempCode;
System.out.println("phoneNum: " + phone);
System.out.println("tempCode: " + tempCode + "PHONE_AUTH_CODE: " + PHONE_AUTH_CODE);
// // 👨💻: 执行验证码的发送
try {
BaseUtil.SMSVerification(phone,tempCode);
System.out.println("TEST 发送成功----------------->");
} catch (IOException e) {
e.printStackTrace();
}
System.err.println("【手机号码】: " + phone + "【手机验证码:】" + PHONE_AUTH_CODE );
}
/**
* TODO:🔥 用户注册验证
* */
@RequestMapping(value = "/registerValidate.do", method = RequestMethod.POST)
public @ResponseBody
JSONObject regiserValidate(@RequestBody Map<String,Object> map){
String suid = BaseUtil.getUID();
String susername = (String) map.get("username");
String sphone = (String) map.get("phone");
String spassword = (String) map.get("password");
String svercode = (String) map.get("vercode");
System.err.println("用户UID" + suid);
System.err.println("用户名称:" + susername);
System.err.println("用户手机号码:" + sphone);
System.err.println("用户密码:" + spassword);
System.err.println("用户验证码: " + svercode);
User user = new User();
user.setUserid(suid);
user.setUsername(susername);
user.setPhone(sphone);
user.setPassword(spassword);
String result = iRegisterService.registerValidate(user);
//返回异常结果JSON数据
JSONObject jsonObject = new JSONObject();
jsonObject.put("message", result );
return jsonObject;
}
}
网友评论