首页 > 其他分享 >实名认证

实名认证

时间:2023-08-21 16:32:11浏览次数:33  
标签:code String idCard 认证 实名 import public name

1. 实名认证开发   117

实名认证_java

业务逻辑

实名认证_登录_02

1.1 实名认证配置类  118

micr-web

JdwxRealnameConfig

package com.bjpowernode.front.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 实名认证配置类   118
 */
@Component
@ConfigurationProperties(prefix = "jdwx.realname")
public class JdwxRealnameConfig {
    private String url;
    private String appkey;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getAppkey() {
        return appkey;
    }

    public void setAppkey(String appkey) {
        this.appkey = appkey;
    }
}

1.2 配置文件  118

micr-web

application.yml

实名认证_java_03

#短信配置   85
jdwx:
  sms:
    url: https://way.jd.com/chuangxin/dxjk
    appkey: 3680fa919b771148da626bbcbd459475
    content: 【大富科技】你的验证码是:%s,3分钟内有效,请勿泄露给他人
    login-text: 【大富科技】登录验证码是:%s,3分钟内有效,请勿泄露给他人
  realname:  #实名认证   118
    url: https://way.jd.com/youhuoBeijing/test
    appkey: 3680fa919b771148da626bbcbd459475

1.3 实名认证实体类   118

micr-web

RealnameVO

package com.bjpowernode.front.vo;

/**
 * 实名认证实体类   118
 */
public class RealnameVO {
    private String phone;
    private String name;
    private String idCard;
    private String code;

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

1.4 实名认证实现类   119

发送HttpClientUtils的工具类  119

micr-common

E:\java学习\盈利宝\资料\资料\04-httpclient\HttpClient\src\main\java\com\bjpowernode\http

业务接口   120

micr-api

UserService
//更新实名认证的信息   120
    boolean modifyRealname(String phone, String name, String idCard);

业务接口实现类   120

micr-dataservice

UserServiceImpl
//更新实名认证的信息的实现类   120
    @Override
    public boolean modifyRealname(String phone, String name, String idCard) {
        int rows = 0;
        if(!StringUtils.isAnyBlank(phone,name,idCard)){
            rows  = userMapper.updateRealname(phone,name,idCard);
        }
        return rows > 0 ;
    }

在mapper中定义方法   120

micr-dataservice

UserMapper
//更新实名认证的信息   120
    int updateRealname(String phone, String name, String idCard);

编写sql   120

micr-dataservice

UserMapper.xml
<!--更新实名认证的信息   120-->
  <update id="updateRealname">
    update u_user set name=#{name} , id_card = #{idCard} where phone = #{phone}
  </update>

实名认证实现类RealnameServiceImpl   119

micr-web

RealnameServiceImpl
package com.bjpowernode.front.service;

import com.alibaba.fastjson.JSONObject;
import com.bjpowernode.api.model.User;
import com.bjpowernode.api.service.UserService;
import com.bjpowernode.common.util.HttpClientUtils;
import com.bjpowernode.front.config.JdwxRealnameConfig;
import com.fasterxml.jackson.databind.node.POJONode;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

/**
 * 实名认证实现类   119
 */
@Service
public class RealnameServiceImpl {

    @Resource
    private JdwxRealnameConfig realnameConfig;

    //120
    @DubboReference(interfaceClass = UserService.class,version = "1.0")
    private UserService userService;


    /*true:认证通过*/
    public boolean handleRealname(String phone,String name,String idCard){

        boolean realname = false;
        Map<String, String> params = new HashMap<>();
        params.put("cardNo",idCard);
        params.put("realName",name);
        params.put("appkey",realnameConfig.getAppkey());
        try {
           //我们为了方便查询注释真实发送,就模拟成功发送
           // String resp = HttpClientUtils.doGet(realnameConfig.getUrl(),params);
            String resp="{\n" +
                    "    \"code\": \"10000\",\n" +
                    "    \"charge\": false,\n" +
                    "    \"remain\": 1305,\n" +
                    "    \"msg\": \"查询成功\",\n" +
                    "    \"result\": {\n" +
                    "        \"error_code\": 0,\n" +
                    "        \"reason\": \"成功\",\n" +
                    "        \"result\": {\n" +
                    "            \"realname\": \""+name+"\",\n" +
                    "            \"idcard\": \"350721197702134399\",\n" +
                    "            \"isok\": true\n" +
                    "        }\n" +
                    "    }\n" +
                    "}";
            if(StringUtils.isNotBlank(resp)){
                JSONObject respObject = JSONObject.parseObject(resp);
                if( "10000".equalsIgnoreCase(respObject.getString("code"))){
                    //解析result
                    realname = respObject.getJSONObject("result")
                                    .getJSONObject("result")
                                    .getBooleanValue("isok");

                    //处理更新数据库
                    boolean modifyResult =  userService.modifyRealname(phone,name,idCard);
                    realname = modifyResult;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return realname;
    }
}

1.5 消费者controller    119-120

添加枚举类  120

micr-common

实名认证_登录_04

micr-web

UserController

//实名认证  118
    @ApiOperation(value = "实名认证",notes = "提供手机号和姓名,身份证号。认证姓名和身份证号是否一致")
    @PostMapping("/realname")
    public RespResult userRealname(@RequestBody RealnameVO realnameVO){
        RespResult result = RespResult.fail();
        result.setRCode(RCode.REQUEST_PARAM_ERR);
        //1验证请求参数   119
        if( CommonUtil.checkPhone(realnameVO.getPhone())){
            if(StringUtils.isNotBlank(realnameVO.getName()) &&
                    StringUtils.isNotBlank(realnameVO.getIdCard())){

                //判断用户已经做过
                User user = userService.queryByPhone(realnameVO.getPhone());
                if( user != null ){
                    if( StringUtils.isNotBlank(user.getName())){
                        result.setRCode(RCode.REALNAME_RETRY);
                    } else {

                        //有短信验证码,先不写

                        //调用第三方接口,判断认证结果   120
                        boolean realnameResult  = realnameService.handleRealname(
                                realnameVO.getPhone(),realnameVO.getName(),
                                realnameVO.getIdCard());

                        if( realnameResult == true ){
                            result = RespResult.ok();
                        } else {
                            result.setRCode(RCode.REALNAME_FAIL);
                        }
                    }
                }
            }
        }
        return result;
    }

3.6 小测试   121

使用postman

http://localhost:8000/api/v1/user/realname

这里提示参数的身份证号就写这个,因为后端我没改

实名认证_登录_05

发送请求,成功

实名认证_java_06

看看数据库,ok没问题

实名认证_java_07

2. 实名认证前端  115

2.1 添加路由   115

index.js

{
    path: '/page/user/realname',
    name: 'RealNameView',
    component: () => import('../views/RealNameView.vue')
  }

添加按钮  122

实名认证_登录_08

2.2 创建页面  115、122-123

RealNameView.vue

<template>
  <div>
    <Header> </Header>
    <div class="login-content">
      <div class="login-flex">
        <div class="login-left"></div>
        <!---->
        <div class="login-box">
          <h3 class="login-title">实名认证</h3>
          <form action="" id="renZ_Submit">
            <div class="alert-input">
              <input type="text" class="form-border user-name" name="username" v-model="name" @blur="checkName" placeholder="请输入您的真实姓名">
              <div class="err">{{nameErr}}</div>
              <p class="prompt_name"></p>
              <input type="text" class="form-border user-sfz" name="sfz" v-model="idCard" @blur="checkIdCard" placeholder="请输入15位或18位身份证号">
              <div class="err">{{idCardErr}}</div>
              <p class="prompt_sfz"></p>
              <input type="text" class="form-border user-num" name="mobile" v-bind:value="phone" readonly placeholder="请输入11位手机号">
              <p class="prompt_num"></p>
              <div class="form-yzm form-border">
                <input class="yzm-write" type="text" v-model="code" @blur="checkCode" placeholder="输入短信验证码">
                <input class="yzm-send" type="text" value="获取验证码" disabled="disabled" id="yzmBtn" readonly="readonly" >
              </div>
              <div class="err">{{codeErr}}</div>
              <p class="prompt_yan"></p>
            </div>
            <div class="alert-input-agree">
              <input type="checkbox" v-model="agree">我已阅读并同意<a href="javascript:;" target="_blank">《动力金融网注册服务协议》</a>
            </div>
            <div class="alert-input-btn">
              <input type="button" @click="requestRealname" class="login-submit" value="认证">
            </div>
          </form>
          <div class="login-skip">
            暂不认证? <a href="javascript:;" @click="goLink('/page/user/usercenter')">跳过</a>
          </div>
        </div>
      </div>
    </div>


    <Footer></Footer>
  </div>
</template>

<script>
import Header from "@/components/common/Header";
import Footer from "@/components/common/Footer";
import {doPostJson} from "@/api/httpRequest";
import layx from "vue-layx";

export default {
  name: "RealNameView",
  components: {
    // eslint-disable-next-line vue/no-unused-components
    Header,
    // eslint-disable-next-line vue/no-unused-components
    Footer
  },
  data(){
    return {
      name:'',
      nameErr:'',
      idCard:'350721197702134399',
      idCardErr:'',
      code:'1234',
      codeErr:'',
      phone:'',
      agree:false
    }
  },
  mounted() {
    //获取localStorage中的用户数据
    let userinfo = window.localStorage.getItem("userinfo");
    if( userinfo ){
      this.phone = JSON.parse(userinfo).phone;
    }
  },
  methods:{
    goLink(url,params){
      //使用router做页面跳转, vue中的对象
      this.$router.push({
        path: url,
        query: params
      })
    },
    checkName(){
      if( this.name == '' || this.name == null ){
        this.nameErr = '必须输入姓名';
      } else if( this.name.length < 2 ){
        this.nameErr = '姓名不正确';
      } else if( !/^[\u4e00-\u9fa5]{0,}$/.test(this.name)){
        this.nameErr ='姓名必须是中文';
      } else {
        this.nameErr = '';
      }
    },
    checkIdCard(){
      if( this.idCard == '' || this.idCard == null){
        this.idCardErr = '请输入身份证号';
      } else if(!/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(this.idCard)){
        this.idCardErr='身份证号格式不正确';
      } else {
        this.idCardErr = '';
      }
    },
    checkCode() {
      if (this.code == '' || this.code == undefined) {
        this.codeErr = '必须输入验证码';
      } else if (this.code.length != 4) {
        this.codeErr = '验证码是4位的';
      } else {
        this.codeErr = '';
      }
    },
    requestRealname(){  //发送请求  124

      if(this.agree == false ){
        layx.msg('请阅读注册协议.',{dialogIcon:'warn',position:'ct'});
        return;
      }

      this.checkName();
      this.checkIdCard();
      this.checkCode();
      if( this.codeErr == '' && this.nameErr == '' && this.idCardErr == ''){
        let param = {
          name:this.name,
          phone:this.phone,
          idCard:this.idCard,
          code:this.code
        }
        doPostJson('/v1/user/realname',param).then(resp=>{
          if(resp && resp.data.code == 1000){
            //跳转到用户中心
            this.$router.push({
              path:'/page/user/usercenter'
            })
          }
        })
      }
    }
  }

}
</script>

<style scoped>
.err {
  color: red;
  font-size: 18px;
}
</style>

测试  

填好参数

实名认证_登录_09

发送

实名认证_java_10

实名认证_登录_11

实名认证_登录_12

跳转到了认证空间,成功

实名认证_登录_13

看看数据库

实名认证_java_14

在次重新认证会提示

实名认证_java_15

3. 前端请求拦截器  携带token    126

httpRequest.js

//创建拦截器   126
axios.interceptors.request.use(function(config){

    //在需要用户登录后的操作,在请求的url中加入token
    //判断访问服务器的url地址, 需要提供身份信息,加入token
    console.log("url==="+config.url);
    if( config.url == '/v1/user/realname') {
        let storageToken = window.localStorage.getItem("token");
        let userinfo = window.localStorage.getItem("userinfo");
        if( storageToken && userinfo ){
            //在header中传递token 和一个userId
            config.headers['Authorization']='Bearer ' + storageToken;
            config.headers['uid'] = JSON.parse(userinfo).uid;
        }
    }
    return config;
},function(err){
    console.log("请求错误"+err);
})

测试一下

认证,当我们发送认证请求时,会同时发两个请求一个是我们真正的实名post请求,一个是被前端拦截的OPTIONS

实名认证_java_16

实名认证_登录_17

经过前端拦截器拦截后,我们的认证请求会被携带token等相关数据

实名认证_java_18

实名认证_java_19

4. 后端验证token   127

4.1 读取token  128

micr-common

JwtUtil

实名认证_登录_20

//读取jwt   128
    public Claims readJwt(String jwt) throws  Exception{
        SecretKey secretKey = Keys.hmacShaKeyFor(selfKey.getBytes(StandardCharsets.UTF_8));
        Claims body = Jwts.parserBuilder().setSigningKey(secretKey)
                .build().parseClaimsJws(jwt).getBody();
        return body;
    }

4.2 拦截器   127

添加枚举类

micr-common

实名认证_java_21

TokenInterceptor  127-129

micr-web

package com.bjpowernode.front.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.bjpowernode.common.enums.RCode;
import com.bjpowernode.common.util.JwtUtil;
import com.bjpowernode.front.view.RespResult;
import io.jsonwebtoken.Claims;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

//拦截器,验证token   127
public class TokenInterceptor implements HandlerInterceptor {

    private String secret = "";

    public TokenInterceptor(String secret) {
        this.secret = secret;
    }

    //  127
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //如果是OPTIONS,放行
        if("OPTIONS".equalsIgnoreCase(request.getMethod())){
            return true;
        }

        //获取token,进行验证  128
        boolean  requestSend = false;
        try{
            //2.获取token的,进行验证
            String headerUid = request.getHeader("uid");
            String headerToken = request.getHeader("Authorization");
            if(StringUtils.isNotBlank(headerToken)){
                //Bearer eyxxxxx
                String jwt = headerToken.substring(7);
                //读jwt
                JwtUtil jwtUtil = new JwtUtil(secret);
                Claims claims = jwtUtil.readJwt(jwt);

                //获取jwt中的数据,uid
                Integer jwtUid = claims.get("uid",Integer.class);
                if( headerUid.equals( String.valueOf(jwtUid))){
                    //token和发起请求用户是同一个。 请求可以被处理
                    requestSend = true;
                }
            }
        }catch (Exception e){
            requestSend = false;
            e.printStackTrace();
        }

        //token没有验证通过,需要给vue错误提示
        if( requestSend == false ){
            //返回json数据给前端
            RespResult result = RespResult.fail();
            result.setRCode(RCode.TOKEN_INVALID);

            //使用HttpServletResponse输出 json
            String respJson = JSONObject.toJSONString(result);
            response.setContentType("application/json;charset=utf-8");
            PrintWriter out = response.getWriter();
            out.print(respJson);
            out.flush();
            out.close();
        }

        return  requestSend;

    }
}

4.3 在全局配置类中添加拦截器  130

micr-web

WebMvcConfiguration

实名认证_登录_22

//配置拦截器   130
    @Value("${jwt.secret}")
    private String jwtSecret;

    //增加拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //创建一个拦截器
        TokenInterceptor tokenInterceptor = new TokenInterceptor(jwtSecret);
        //addPath是要拦截的地址,后面还可以加
        String [] addPath = {"/v1/user/realname"};
        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns(addPath);

    }

4.4 测试

首先我们去登录

实名认证_java_23

登录成功,token和用户数据也被存入了Local Storage中了

实名认证_java_24

下面开始认证

实名认证_java_25

请求别拦截器拦截

实名认证_登录_26

携带了token

实名认证_java_27

看看后端,在debug模式下成功被后端拦截

实名认证_java_28

结束,成功

实名认证_java_29

5. 前端应答拦截器  131

httpRequest.js   131

//创建应答拦截器,统一对错误处理, 后端返回 code > 1000 都是错误    131
axios.interceptors.response.use(function(resp){
    if(resp && resp.data.code > 1000 ){
        let code = resp.data.code;
        if( code == 3000){
            //token无效,重新登录
            window.location.href='/page/user/login';
        } else {
            layx.msg(resp.data.msg,{dialogIcon:'warn',position:'ct'});
        }
    }
    return resp;
},function (err){
    console.log("应答拦截器错误:"+err)
    //回到首页
    window.location.href = '/';
})

测试   131

实名认证_java_30

实名认证_java_31

被拦截跳转登录界面

实名认证_java_32

标签:code,String,idCard,认证,实名,import,public,name
From: https://blog.51cto.com/u_15784725/7176739

相关文章

  • 基础认证
    HTTP基础认证暴力破解挂上BurpSuite的代理,随便输个账号密码(比如:账号aaa密码bbb)访问,查看HTTP响应报文:得到提示doukonwadmin?,于是猜测账号是admin,那么接下来就只需要爆破密码了注意看到HTTP请求头部的Authorization字段:Authorization:BasicYWFhOmJiYg......
  • 2023 LGR 非专业级别软件能力认证第一轮(初赛)S组
    计算器、背包、代码都不能带进考场禁赛三年并全国通报B选项符合while语句弱类型编程语言指的是可以进行类型转换,可以参与各种类型变量的运算\[3\times60(秒)\times44.1\times1000(赫兹)\times16\div8(字节)\times2(声道数)\div1024\div1024\approx30MiB\]......
  • 华为认证考试每日刷题与解析 Part4
    1、关于IGMPSnooping工作机制的描述,正确的是?A、二层交换机通过不断监听IGMP报文,在二层建立和维护PIM路由表B、没有运行IGMPSnooping时,组播报文将在二层广播:运行IGMPSnooping后,报文将不再在二层广播,而是进行二层组播C、如果主机发出IGMP离开报文时,交换机将该主机加入到相应......
  • NineData x SelectDB完成产品兼容互认证
    近日,新一代实时数据仓库厂商SelectDB与云原生智能数据管理平台NineData完成产品兼容互认证。经过严格的联合测试,双方软件完全相互兼容、功能完善、整体运行稳定且性能表现优异。基于本次的合作,双方将进一步为数据管理与大数据分析业务的融合持续助力,帮助企业实现数字化转型,提......
  • 统一认证授权
    统一认证授权session和cookie的区别session是服务端,cookie是浏览器客户端,session无法解决分布式问题,手机端无法弄cookie,无法跨域请求。jwt是一种用于token生成的加密算法。jwt三部分组成:header、信息,签名。openid是oauth2.0的升级版saml是基于xml标准协议的认证。rbac的权......
  • 认证过滤器
    我们需要自定义一个过滤器,这个过滤器会去获取请求头中的token,对token进行解析取出其中的userid。使用userid去redis中获取对应的LoginUser对象。然后封装Authentication对象存入SecurityContextHolderpackagecom.security.filter;importcom.security.domain.LoginUser;......
  • 红帽认证RedHat-RHCSA shell的基本应用用户和组管理网络配置和防火墙管理笔记汇总
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • 在 Ubuntu 22.04 系统上为 SSH 开启基于时间的 TOTP 认证
    前言一次性密码(英语:one-timepassword,简称OTP),又称动态密码或单次有效密码,是指电脑系统或其他数字设备上只能使用一次的密码,有效期为只有一次登录会话或一段短时间内。基于时间的一次性密码算法(英语:Time-basedOne-TimePassword,简称:TOTP)是一种根据预共享的密钥与当前时间计算一次......
  • 劳务实名制 工地劳务管理系统智慧工地 信息化可视系统源码
    智慧工地管理云平台系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段,实现对工地施工、设备状态、人员安全等方面的实时监控和管理。智慧工地平台系统工作原理:1、感知设备的部署智慧工地智能监控系统会在工......
  • 2023年9月北京/杭州/深圳DAMA-CDGA/CDGP认证报名
    据DAMA中国官方网站消息,2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启,相关事宜通知如下: 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA)数据治理专家(CertifiedDataGovernanceProfessional,CDGP) 考试时间: CDGA:2023......