WebAPI后端,处理逻辑是构建随机的验证码并通过短信发送到手机上,并缓存好对应的验证码,后端的处理代码如下所示
/// <summary>/// 发送登录动态码/// </summary>/// <param name="model"></param>/// <returns></returns>[AllowAnonymous][HttpPost][Route("send-login-smscode")]public async Task<CommonResult> SendPhoneLoginSmsCode(PhoneCaptchaModel model){ //获取随机6位数字动态验证码 var code = RandomChinese.GetRandomNumber(6); //使用自定义模板处理短信发送 string message = string.Format(ConfigData.MySmsCodeTemplate, code); var result = await _smsSender.SendAsync(model.PhoneNumber, message); if (result.Success) { var cacheKey = model.PhoneNumber;//以手机号码作为键存储验证码缓存 var cacheItem = new SmsLoginCodeCacheItem { Code = code, PhoneNumber = model.PhoneNumber };RedisHelper.Set(cacheKey, cacheItem, TimeSpan.FromMinutes(ConfigData.SmsCodeExpiredMinutes)); //获取的时候 //var tmp = RedisHelper.Get<SmsLoginCodeCacheItem>(cacheKey); } return result;}顺利发送短信验证码后,前端会提示用户验证码发送情况,并要求输入验证码进行登录,前端登录的代码如下所示 。
//短信验证码登录loginByCode() { var params = { mobile: this.model.mobile, smscode: this.model.code }; console.log(params); user.dynamiclogin(params) .then(res => { uni.$u.toast('验证成功'); this.gotoPage(); }) .catch(error => { console.log('验证失败' + error); uni.$u.toast(error); });},后端的登录处理,主要就是通过在Redis中读取对应的手机验证码,如果匹配进行令牌的生成处理,否则提示错误信息 。
/// <summary>/// 登录授权处理/// </summary>/// <returns></returns>[AllowAnonymous][HttpPost][Route("authenticate-byphone")]public async Task<AuthenticateResultDto> AuthenticateByPhoneCaptcha(PhoneCaptchaModel model){ var authResult = new AuthenticateResultDto(); #region 条件检查 if (string.IsNullOrEmpty(model.PhoneNumber)) { throw new MyApiException("手机号不能为空"); } if (string.IsNullOrEmpty(model.SmsCode)) { throw new MyApiException("验证码不能为空"); } var userInfo = await _userService.GetFirstAsync(s => s.MobilePhone == model.PhoneNumber); if (userInfo == null) { throw new MyApiException("用户手机不存在"); } #endregion var cacheKey = model.PhoneNumber;//以手机号码作为键存储验证码缓存 var item = RedisHelper.Get<SmsLoginCodeCacheItem>(cacheKey); if (item != null && item.Code == model.SmsCode) { //根据用户身份生成tokenresult authResult.AccessToken = GenerateToken(userInfo); //令牌 authResult.Expires = expiredDays * 24 * 3600; //失效秒数 authResult.Success = true;//成功 authResult.UserId = userInfo.Id;//当前用户Id //移除缓存短信键值 RedisHelper.Del(cacheKey); } else { authResult.Error = "登录失败,无法生成令牌"; } return authResult;}
推荐阅读
- AR人体姿态识别,实现无边界的人机交互
- 可处置的 ref 结构 C# 8.0 中的 Disposable ref structs
- 《HelloGitHub》第 79 期
- 5 Java多线程:CAS
- golang中的锁竞争问题
- 19 基于.NetCore开发博客项目 StarBlog - Markdown渲染方案探索
- 原神玛海菈的水色突破材料有哪些
- 原神西福斯的月光突破材料需要哪些
- 原神斩花除根成就怎么达成
- 原神放松疗法成就怎么达成