由于最近负责的一个互联网APP项目中需要用到Token验证机制,所以这边抽空整理下整体流程。

我们知道现在最通用的Token是基于JWT来实现,简单来说其实就是用PublicKey来进行加密,生成的Token里面包含用户Id等信息,但是作为APP这种C/S体系结构来说,存在这样的问题:

1、PublicKey由客户端来存储,涉及版本更新迭代问题,并不好更改PublicKey;

2、各个用户的PublicKey相同,容易被抓包破解;

那如何保证每个用户的加密密钥不一样,后端又能够准确解密呢?

这里需要借助两张表来操作,后面再来一一介绍

1、APP设备备案表

2、APP登录验证票表

接下来开始介绍Token流程

下面为Token获取的整个流程图:

整体流程这里做一下稍微的介绍:

1、进去APP中先获取Android/Ios设备Id,参数如下:

调用后端接口获取appId和appSecret,如果数据库中有数据,则从APP设备备案表中直接获取,如果未存在数据,则往APP设备备案表中存入一条记录,appId和appSecret可以由UUID生成,并返回APP,appId和appSecret在APP做缓存处理,缓存周期可以为一天。

2、app判断本地是否缓存Token,如果没有则调用获取Token接口,参数如下

这里面需要做验证签名安全验证机制处理,验签加密为(uuid+appSecret+timestamp)做md5加密,保证每个用户验签内容不同,如果验证签名通过则生成Token、sessionKey(UUID)、sessionSecret(UUID),并将生成Token、sessionKey、sessionSecret、appId、appSecret等参数存于Redis内,参数如下:

并将Redis生命周期置为8小时(可自定义)。并将Token、sessionKey、sessionSecret返回APP。APP将Token做缓存处理,周期可以为8小时。

3、此时APP已经缓存有Token,调用接口请求数据,后端可以采用AOP或者Interceptor(拦截器)截取请求参数,验证是否有Token,没有则再获取。如果存在Token,验证Redis是否存在authenUserId和authenTicket(登录验证票),如果未存在则返回未登录状态码,APP跳转登录页。

4、登录账户密码以DES加密传输,以获取Token接口返回参数sessionKey和sessionSecret作为DES加密的key和iv,具体如下:

保证每个用户的不一致性加密,后台接口解密操作为:

登录成功后,更新Redis里面authenUserId和authenTicket(登录验证票)字段,往APP登录验证票表新增一条登录数据,记录用户登录记录,authenUserId和authenTicket可以由UUID生产,将authenUserId和authenTicket返回APP,并做缓存化处理。

5、重新请求接口,拦截器根据Token判断Redis里是否存在authenTicket,如果存在authenUserId和authenTicket(登录验证票)则为登陆成功状态,允许请求接口,至此Token流程基本结束。

原文链接: https://blog.csdn.net/u014526891/article/details/82625438

详解APP的Token验证机制相关推荐

  1. AngularJS 详解Directive(指令)机制

    AngularJS  5个实例详解Directive(指令)机制 大漠穷秋  http://damoqiongqiu.iteye.com/blog/1917971 1.一点小说明 指令的作用:实现语义 ...

  2. linux沙盒机制6,详解Android应用沙盒机制

    前言 Android使用沙盒来保护用户不受恶意应用的侵害,同时也将应用隔离开来,防止他们互相访问其数据,本文主要对Android应用沙盒中的几种技术做简要的总结. 一.Android应用DAC沙盒 稍 ...

  3. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  4. android增加内置存储分区,详解Android10的分区存储机制(Scoped Storage)适配教程

    1. 简介 大家应该都有过这样的体会,手机用着用着里面就充斥着各种不懂的文件夹和文件.甚至是连已经删除的软件的文件夹还存在. 为什么会发生的这样的问题呢? 因为google的缺席,导致android生 ...

  5. easyui js解析字符串_js相关:详解Jquery Easyui的验证扩展

    js相关:详解Jquery Easyui的验证扩展 发布于 2020-7-2| 复制链接 本文主要介绍了Jquery Easyui验证扩展,Easyui验证,Easyui校验,js正则表达式.具有一定 ...

  6. php字段验证规则,详解ThinkPHP中自动验证及验证规则

    本篇文章详细介绍了thinkphp中自动验证及验证规则的方法,希望对学习thinkphp的朋友有帮助! 详解ThinkPHP中自动验证及验证规则 ThinkPHP 内置了数据对象的自动验证功能来完成模 ...

  7. Cron表达式详解和表达式的验证

    Cron表达式详解和表达式的验证 本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表 ...

  8. java阴阳师抽卡算法_阴阳师详解新的抽卡机制 全图鉴和SP获取更加简单

    原标题:阴阳师详解新的抽卡机制 全图鉴和SP获取更加简单 阴阳师随着大岳丸活动的临近,马上大家就要再次进入抽卡的热潮中了,而这次的新SSR大岳丸的获取,又一次更新了新的抽卡机制,本次就带来新抽卡机制详 ...

  9. 微信回调 java_详解APP微信支付(java后台_统一下单和回调)

    1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用微信支付成功后,微信服 ...

最新文章

  1. YOLOv4官方改进版来了!指标炸裂55.8% AP!Scaled-YOLOv4:扩展跨阶段局部网络
  2. spring整合springmvc和mybatis
  3. Mac OS 如何连接windows 文件共享
  4. oracle语句怎么倒退,oracle RETURNING 子句使用方法
  5. OpenCV消除傅立叶域中的周期性噪声的实例(附完整代码)
  6. 使用阿里云火车票查询接口案例——CSDN博客
  7. 第二轮冲刺-Runner站立会议08
  8. execjs执行报: ‘gbk‘ codec can‘t decode byte 0xac in position 62: illegal multibyte sequence
  9. 私藏的开发过程中的那些基类
  10. 710. Random Pick with Blacklist - LeetCode
  11. C# 设置Windows程序窗口为穿透状态
  12. ashx比较完美的权限处理(适合页面,不适合安卓远程读取接口)
  13. ROS install
  14. 电梯仿真模拟,电梯模拟运行,电梯仿真运行,基于西门子博图S7-1200plc与触摸屏HMI的电梯模拟仿真控制系统设计
  15. sql语句练习50题(经典)
  16. python复数类型的虚部通过什么表示_Python小白必备知识:Python复数类型(complex)详解...
  17. 数据结构算法——1097. Hub Connection plan
  18. 2014年的暑假ACM之旅!
  19. joda-time 文档的部分翻译
  20. [presto(trino)]多种日期写法

热门文章

  1. 利用JAX-WS开发Web服务
  2. LCD12864硬件连接
  3. 只有MDF文件如何恢复数据库
  4. CSTgif动图导出 与gif导出失败解决方法
  5. 抢购最低价苹果!暴走香港直营店全攻略
  6. 详解 Pytorch 实现 MNIST
  7. Sqoop MySQL hive 数据库导入导出数据
  8. 彩虹之眼文化集团整体方案设计
  9. Python 中的自动点击器——2 种简单易行的方法
  10. php怎么比较数组长度_php如何计算数组的长度?php数组长度的获取方法