H5调用数据平台验证授信项

。 (1) mobile : 默认手机号。传入该值合法,页面手机号文本框赋值并不可修改
(2) applyNo: 进件号(必填)
(3) cardId:身份证号
(4) userName: 用户姓名
(5) successDirectUrl: 成功跳转地址(必填)

       String requestIdRes = restTemplate.postForObject(url, null, String.class);LOGGER.info("getRequestIdUrl res {}", requestIdRes);String requestId = JSONObject.parseObject(requestIdRes).getString("data");HashMap<String, Object> map = new HashMap<>();map.put("applyNo", requestId);map.put("cardId", CommonUtils.decrypt(userIdnoInfo.getIdNo()));map.put("mobile", CommonUtils.decrypt(user.getMobile()));map.put("userName", userIdnoInfo.getName());map.put("token", System.currentTimeMillis());map.put("accessToken", MD5Utils.getMD5String(UrlConfig.JWT_SECRET + map.get("token")));JSONObject jsonObject = new JSONObject();jsonObject.put("custId", user.getToken());map.put("relationalParam", jsonObject.toJSONString());map.put("color", "blue");StringBuilder sb = new StringBuilder();sb.append(mobileSuccessdirectUrl).append("/").append(requestId).append("/").append(user.getToken());map.put("successDirectUrl", sb.toString());LOGGER.info("mobileValid map:{} ", map.toString());String token = JwtUtils.sign(map);StringBuilder resUrl = new StringBuilder();resUrl.append(UrlConfig.MobileCrawler.MOBILE_H5_URL).append("?color=blue&corpId=").append(requestId.substring(0, 3)).append("&token=").append(token);

* 进件号从风控获取,requestid

*token是当前时间戳,最后给数据平台的token是jwt加密后的string串

*accessToken 是密钥和当前时间戳进行md5加密

*JwtUtils是封装的工具栏,具体代码下面有,主要把通用参数放入map

所有参数放入map后,利用jwt把map生产token,发送给数据平台,其实数据平台需要的只是下面几个:

String token = JwtUtils.sign(map);
StringBuilder resUrl = new StringBuilder();
resUrl.append(UrlConfig.MobileCrawler.MOBILE_H5_URL).append("?color=blue&corpId=").append(requestId.substring(0, 3)).append("&token=").append(token);

回头看看数据平台文档:

加密方式

我们会分配一个渠道号(corpId,比如301),每个渠道就相当于一个商户,有自己corpSecret,即密钥,调用的所有步骤都需要加上corpId、token以及accessToken这个参数,accessToken是md5(corpSecret + token)

corpId string 由我们分配
token string   兼容现在的token(即当前毫秒值)
accessToken string  

md5(corpSecret + token)

corpSecret跟corpId一起由我们分配

applyNo string   进件号,如果该参数有值,则最终的返回值为该参数。
serviceType string 服务类型,比如手机、淘宝等()

credit_card 信用卡

mobile 手机运营商

alipay 支付宝

credit_report 征信报告

taobao 淘宝

bank_card 银行卡

jingdong 京东

insurance 社保

fund 公积金

bank_credit 网银信用卡

sdk_device_info sdk设备基本信息

sdk_location_info sdk设备地理位置信息

sdk_contact_info sdk设备通讯录信息

sdk_gsm_info sdk设备通话记录信息

sdk_sms_info sdk设备短信记录信息

sdk_info sdk信息(此种类型只针对第三方推送的信息,比如融360推送的信息)

 
serviceProvider string 服务提供方 KingChan,魔蝎等  
interfaceType string 接口方式 api, h5  
cardId string   进件人身份证号  
mobile string   进件人手机号  
userName string   进件人姓名  
relationalParam string

关联参数

json串,格式如下:

{ "custId":"111","other":"The other infomation"}

custId 在调用方系统中的用户id varchar(64)

other 在调用方系统中的用户其它信息 varchar(256)

我们会把最终返回的进件号与该参数做绑定,最后在回调的时候一并推给调用方,好让调用方知道是他们系统哪个用户的数据

public class JwtUtils {static String secret = UrlConfig.JWT_SECRET; // 默认私钥,各个渠道会在联调时分配static Algorithm algorithm = Algorithm.HS256;private JwtUtils() {}/*** 加密* * @return*/public static String sign(Map<String, Object> params) {Options opt = new Options();opt.setAlgorithm(algorithm);long iat = System.currentTimeMillis() / 1000L; // 生成时间,秒long exp = iat + 600L; // 失效时间JWTSigner signer = new JWTSigner(secret);HashMap<String, Object> claims = new HashMap<>();claims.put("iss", "datapi");claims.put("exp", exp);claims.put("iat", iat);for (Entry<String, Object> entry : params.entrySet()) {claims.put(entry.getKey(), entry.getValue());}return signer.sign(claims, opt);}
}
重新梳理一下:

1. jwt加密,加密的输入参数

密钥(服务方指定),待加密的内容,指定加密算法为HS256

 Options opt = new Options();opt.setAlgorithm(algorithm);long iat = System.currentTimeMillis() / 1000L; // 生成时间,秒
    long exp = iat + 600L; // 失效时间
    JWTSigner signer = new JWTSigner(secret);HashMap<String, Object> claims = new HashMap<>();claims.put("iss", "datapi");claims.put("exp", exp);claims.put("iat", iat);for (Entry<String, Object> entry : params.entrySet()) {claims.put(entry.getKey(), entry.getValue());}return signer.sign(claims, opt);
}

2.服务方收到后用公钥解密,读取加密的消息体

解密JWT

第一段落从实际应用展示了如果应用jwt。下面我们从理论学习一下jwt

什么是jwt

简单来说jwt就是一个string串,格式如下:

header.payload.signature

jwt原理

header:

{
  "typ": "JWT",
  "alg": "HS256"
  }

payloader

{
  "userId": "b08f86af-35da-48f2-8fab-cef3904660bd"
  }

可以放很多属性,包括iss发行者,sub主题,exp失效时间。

签名

利用头部alg指定的算法对header和payload进行加密,生成

data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
signature = Hash( data, secret );

jwt应用场景

认证而非加密

jwt不足

安全性不足,一般用https

jwt验证

package com.xt.tutorial.utils;import java.util.HashMap;
import java.util.Map;import com.auth0.jwt.JWTSigner;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;public class JWT {private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK sdfkjsdrow32234545fdf>?N<:{LWPW";private static final String EXP = "exp";private static final String PAYLOAD = "payload";/*** get jwt String of object* @param object*            the POJO object* @param maxAge*            the milliseconds of life time* @return the jwt token*/public static <T> String sign(T object, long maxAge) {try {final JWTSigner signer = new JWTSigner(SECRET);final Map<String, Object> claims = new HashMap<String, Object>();ObjectMapper mapper = new ObjectMapper();String jsonString = mapper.writeValueAsString(object);claims.put(PAYLOAD, jsonString);claims.put(EXP, System.currentTimeMillis() + maxAge);return signer.sign(claims);} catch(Exception e) {return null;}}/*** get the object of jwt if not expired* @param jwt* @return POJO object*/public static<T> T unsign(String jwt, Class<T> classT) {final JWTVerifier verifier = new JWTVerifier(SECRET);try {final Map<String,Object> claims= verifier.verify(jwt);if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {long exp = (Long)claims.get(EXP);long currentTimeMillis = System.currentTimeMillis();if (exp > currentTimeMillis) {String json = (String)claims.get(PAYLOAD);ObjectMapper objectMapper = new ObjectMapper();return objectMapper.readValue(json, classT);}}return null;} catch (Exception e) {return null;}}
}

互联网金融系统实现之数据平台交互验证方式相关推荐

  1. 互联网金融售前心得数据脱敏分析 | PMCAFF微分享

     本期主题 | 互联网金融售前心得&数据脱敏分析 分享嘉宾 | Gina 文字整理 | Mayi-天享 入群请联系管理员37°C微信号:erhuoyimei Gina 本期嘉 ...

  2. 史海峰:构建产业互联网金融系统的正确姿势

    史海峰 IT民工闲话 读完需要 12 分钟 速读仅需 5 分钟 引言 互联网下半场从 ToC 进入 ToB 阶段,玩法不再是烧钱拉流量转化变现,而是深入产业核心领域,通过技术提升生态链整合能力,优化生 ...

  3. 互联网金融风控中的数据科学

    内容来源:2016年12月16日,宜人贷数据部数据科学家王婷在"GIAC全球互联网架构大会"进行<互联网金融风控中的数据科学>演讲分享.IT大咖说作为独家视频合作方,经 ...

  4. 互联网金融系统——交易防重设计实战

    为什么需要防范重复提交呢?举个最直接的栗子:你在商城里买了7888元的iphone x,付款后页面卡顿导致你重复点击了付款按钮,这时候如果后端不加重复交易验证的话,相当于付款15766元买了Iphon ...

  5. 【源码】ThingSpeak支撑工具箱:与物联网数据平台交互的工具

    ThingSpeak是由MathWorks托管的免费Web服务,允许您收集.分析和处理各种传感器数据,并开发相应的物联网应用程序.ThingSpeak支撑工具箱可以让您使用MATLAB来读取数据中,并 ...

  6. 【解决方案】互联网直播系统RTMP推流网关平台EasyRTMPlive在幼儿园家长直播中的应用

    校园.幼儿园安全越来越受到重视的情况下,我们可以看到市面上出现了越来越多关于视频监控解决方案,但是很多平台都有不同的原因,导致用户使用困难,比如价格昂贵.部署困难.推流效果不理想等.为了解决行业这一难 ...

  7. linux服务器登录次数,Linux 服务器和Windows服务器 用户登录失败次数限制【互联网金融系统漏洞排查】...

    1.Linux服务器用户登录失败次数限制(使用pam模块实现) /etc/pam.d/sshd    (远程ssh) /etc/pam.d/login    (终端) 1.1.用户通过ssh登录失败次 ...

  8. hybris导出系统已有数据的两种方式

    参考SAP帮助文档: https://help.sap.com/viewer/d0224eca81e249cb821f2cdf45a82ace/1905/en-US/a8beb8ac6b684228a ...

  9. 基于python的爬虫系统金融数据_基于Python的互联网金融数据采集

    基于Python的互联网金融数据采集 □文/王 蕾1安英博1刘佳杰2 [提要] 互联网金融数据中潜藏着未知的知识价值,但也存在着巨量的数据冗余.通过Python可以进行互联网金融数据的获取.解析.提取 ...

最新文章

  1. AOP||动态代理||AOP专业术语;
  2. Matplotlib实例教程(十四)误差条形图
  3. OpenYurt 如何 “0 侵入” 攻破云边融合难点
  4. 2021年中国物流地产行业发展报告
  5. java虚拟机:虚拟机栈
  6. 读书笔记-----Oracle字符处理函数列表
  7. 华为计算机网络技术试题,(完整版)华为试题答案
  8. 计算机网络(第六版)
  9. SQL 事务(Tran | Transation)与 Try...Catch 的使用
  10. eclipse使用maven新建类目录时,提示The folder is already a source folder
  11. php euc-cn,php配置中文解说
  12. 哈尔滨工业大学邮件系统客户端设置
  13. 股票精灵接口的脚本策划
  14. 笔记本连WiFi共享网络给台式机 Ubuntu
  15. [安装fastfds中的nginx执行make命令报错]src/core/ngx_murmurhash.c:37:11: error
  16. java_重写hashCode
  17. FPGA到底是什么?
  18. 朱有鹏嵌入式免费课程
  19. 淘东电商项目(35) -SSO单点登录(登录功能完善)
  20. 【此后无良辰】实验二 CPU部件实现之ALU和寄存器堆

热门文章

  1. Android Qcom USB Driver学习(六)
  2. 什么是安时数(AH)
  3. SCI论文从入门到精通——IEEE论文那些事儿
  4. 老夫带你深度剖析Redisson实现分布式锁的原理
  5. 你真的理解C语言的灵魂 “ 指针 ” 吗?(初阶篇)
  6. Manifest merger failed with multiple errors, see logs问题处理
  7. python爬取某壁纸网站壁纸
  8. 华为p30应用软件开启速度测试,华为P30Pro速度测试,与iPhoneXS Max的差距,果粉无法淡定了!...
  9. 数据库云管平台 zCloud v3.5发布,智能化和国产数据库支持能力再增强
  10. crh寄存器_STM32的GPIO的寄存器介绍和设置