App和后台通信基于session_id的登录验证

来源:互联网 发布:excel找相同数据 编辑:程序博客网 时间:2024/06/06 02:58

场景介绍

众所周知,App 和 后台的通信是通过无状态的短连接实现的,当App发起请求是创建连接,待到请求结束则关闭连接。实现方式要么是HTTP协议,要么是TCP协议(短连接)。既然是无状态的短连接,那么问题来了。比如:App的 一些 action 都是需要登陆之后才有权限操作的,但是通过什么信息来确定 当前用户是登陆状态呢。

我们先来一个场景看看:

某个银行的手机App,使用的过程中可能发现以下现象:

1. 需要登陆才能查询和操作

        2. 当前手机上是登陆状态,但是我从另一个手机用相同用户登陆之后,再到当前手机上执行一些操作,结果App强制重新登录。

        3. 登陆后长时间没有操作,然后再去操作时,App强制重新登录

我们来分析以下以上现象:

        关于1. 这个不需要说明了吧 ^_^

         关于2. 从现象可以得知,用户在App上同一时间只允许一个登陆,怎么知道我的手机上不是最近时间登陆的呢?可能是发现某个ID不是我的,或者登陆时间不是我之前的登录时间。

        关于3. 可知有一个超时机制,超过设定时间后,强制重新登录。


Session ID 的设计

那么我们根据以上场景来设计一个机制吧,原理很简单。

用户在App和后台通信,通过一个 session_id 来识别。

       1. 用户登录的时候更新 session_id, 且设置失效时间

        2.App和后台通信的每次请求都捎上session_id,后台从库中读出session_id,然后与App传过来的session_id比较,如session_id不一样或者失效,都强制重新登录。


        实现

        使用KV存储如 memcached 或者 redis, 用户登录的时候生成一个 session_id(要唯一),然后写到KV存储,然后设置失效时间。当用户请求过来的时候,后台从KV存储中读取出对应的session_id, 若结果为空,说明失效了,若结果和用户传过来的session_id不同,说明不是最近时间登陆的,返回强制重新登陆给App。

        redis 例子:

        > SET  用户ID  343875485SHDD      //  设置session_id为343875485SHDD 

        > EXPIRE  用户ID  300                         //  设置失效时间为 300 秒


1 0
原创粉丝点击