详解APP的Token验证机制

由于最近负责的一个互联网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流程基本结束。

猜你喜欢

转载自blog.csdn.net/u014526891/article/details/82625438