使用token实现在有效期内APP自动登录功能
实现此功能的场景是在当下用户对手机APP体验要求高,并且相对安全前提的推动下诞生;当你下载了一个QQ,微信第一次进行了账号和密码的登录,你从此以后打开应用免去了你每日打开应用都要输入账号跟密码的痛苦过程,在产品体验方面来讲,这种体验更为让用户容易接受。那么,这种自动登录如何实现;
之前在APP里面接入达达配送的时候,看到他们提供的API接口里面大致有了这个一个认证的过程,自己琢磨了一下,依稀的弄出了一个类似这样的自动登录的流程;
一、获取token登录令牌接口(可以理解为登录接口)
这一步是需要用户使用账号和密码进行登录去获取,用户如果登录成功,那么后台返回一个token及token的失效时间,及未来如果token失效之后刷新token的令牌!
返回参数示例及说明:
{
//状态位,ok表示成功
"status":"0",
//申请的有效token值
"token":"4a28d8516d42f4821e6d5782d1a79a7a",
//token的有效时间,单位为秒,这里设定7天有效期(604800秒)
"expires_in":"604800",
//token过期情况下,用来刷新access_token值,设置30天的有效期
"refresh_token":"8ab486662d50e6d51a5a5dd6a25c9a4b"
}
说明:
用户第一次进入APP,APP判断手机上是否存在token值,不存在,表明用户第一次进入APP,跳转登录界面让用户进行登录
用户使用账号和密码登录成功,后台进行认证,认证成功,返回token、expires_in、refresh_token,APP需把这几个值安全保存在手机本地,便于下一次用户进入app的一些流程判断
继续上一步中间插入一个小细节,后台在登录成功之后,需要把token、expires_in、refresh_token(其他附加值:如设备唯一编号、或其他密令…)保存在数据库和用户关联的表里,便于未来用户自动登录认证使用
上面步骤进行完毕,APP即跳入到应用首页,用户可以完全使用APP
二、刷新token登录令牌接口
此接口是对第一个接口的一些弥补,token的过期时间原理上可以说是越短越安全,那么存在的问题就是token有一个过期时间,那么过期之后是不可能让用户重新输入用户名和密码来重新获取token的,那样完全违背了提升体验的初衷,相当于此功能是一个累赘了;
在token过期的情况,我们可以使用保存在手机本地的refresh_token去后台刷新一下token,重新获取一组令牌信息,覆盖掉以前保存在手机上的令牌信息,这也算是提升了一点安全性,为避免以前的令牌信息如果真落入别人之手;
此接口的请求参数可以参考以下参数:
{
//用户账号,大多数APP用的是手机号登录,这里也可以是其他值,能表名是将要自动登录的用户即可
"username":"13000000007",
//手机设备的唯一值
"imei":"928347024892343",
//刷新token的令牌
"refresh_token":"8ab486662d50e6d51a5a5dd6a25c9a4b"
}
返回参数示例及说明:
{
//状态位,ok表示成功
"status":"0",
//申请的有效token值
"token":"4a28d8516d42f4821e6d5782d1a79a7a",
//token的有效时间,单位为秒,这里设定7天有效期(604800秒)
"expires_in":"604800",
//token过期情况下,用来刷新access_token值,设置30天的有效期
"refresh_token":"8ab486662d50e6d51a5a5dd6a25c9a4b"
}
说明:
看着是不是和获取token的接口返回值一样,对,你没有看错,这确实就是和获取token的接口是一样的,把返回的这些令牌信息覆盖掉之前保存在手机上的老的令牌信息就可以了;特别是这里为了节省请求接口的次数,刷新token成功之后就可以让用户跳转到首页进行使用app了,不用再次请求其他认证token的接口了
从请求到响应之后的一系列处理流程为:
场景是用户过了1天之后再次打开了APP,APP首先获取本地是否存在token,如存在,会去请求第三步的token认证接口,需要用到刷新token这个接口的前提必须是token认证接口的返回值表示token过期了,那么此时本接口(刷新登录令牌的接口就有了作用),这里可以使用账号、设备编号、刷新token的令牌或者你还可以自己定一些加密方案的参数一同传入后台进行认证,当后台认证此刷新令牌(refresh_token)有效且合法,那么重新生成一组令牌保存在数据库,同时返回这一组令牌到APP(这一组令牌全部都是需要重新生成,并且过期时间重新全部初始化)
APP同样把成功响应的一组令牌值覆盖掉以前保存在本地的令牌值
成功的情况,此时,可以让用户跳转到首页让用户使用APP
失败的情况,如refresh_token也过期了,这里特别说一下,一般refresh_token的过期时间是比较长的,如果连这个也过期的话,说明用户已经太久没有使用过APP了,需要让用户重新登录
三、token认证接口(可理解为自动登录接口)
此接口相当而言算是请求频率比较多的一个接口,他对token进行认证成功和失败有不同的处理方式;
此接口的请求参数可以参考以下参数:
{
//用户账号,大多数APP用的是手机号登录,这里也可以是其他值,能表名是将要自动登录的用户即可
"username":"13000000007",
//手机设备的唯一值
"imei":"928347024892343",
//token认证令牌
"token":"4a28d8516d42f4821e6d5782d1a79a7a"
}
返回参数示例及说明:
{
"status":"0"//响应结果,成功
}
or
{
"status":"1"//响应结果,token过期
}
说明:
这里如果返回成功,可以让用户跳转到首页使用APP
如果返回token过期,调用第二步的刷新token令牌的接口去重新获取令牌
使用token实现在有效期内APP自动登录功能的更多相关文章
- yii2.0自动登录功能的实现方法
参考地址:http://www.kuitao8.com/20150518/3747.shtml 自动登录的原理很简单.主要就是利用cookie来实现的在第一次登录的时候,如果登录成功并且选中了下次自动 ...
- Vue+Vuex 实现自动登录功能
刚刚实现了Vue+Vuex的自动登录功能,在实现的时候遇到了一些问题,这里记录一下: 因为这个还不够完善,在写完下列代码后,又进行了补充,可以从https://www.cnblogs.com/xiao ...
- spring security实现记住我下次自动登录功能
目录 spring security实现记住我下次自动登录功能 一.原理分析 二.实现方式 2.1 简单实现方式 2.2 数据库实现方式 三.区分是密码登录还是rememberme登录 spring ...
- 二十 Filter&自动登录功能
Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: ...
- 自己Cookie写的自动登录功能 包含BASE64 和MD5的使用
sql表 username password字段 User类 有 id username password等字段 Service有一函数 @Override public User findUser ...
- cookie理解与实践【实现简单登录以及自动登录功能】
cookie理解 Cookie是由W3C组织提出,最早由netscape社区发展的一种机制 http是无状态协议.当某次连接中数据提交完,连接会关闭,再次访问时,浏览器与服务器需要重新建立新的连接: ...
- HBuilder开发APP自动登录时跳过"登录页面"
刚接触开发公司APP项目,用HBuilder开发工具. manifest.json中的入口页面就是"登录页面",现在获取到自动登录状态是true,但是真机联调时"登录页面 ...
- JS-两周内自动登录功能
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器 /** * cookie对象; * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cooki ...
随机推荐
- Spark2 Dataset DataFrame空值null,NaN判断和处理
import org.apache.spark.sql.SparkSession import org.apache.spark.sql.Dataset import org.apache.spark ...
- vue之创建组建
vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来.组件的使用更使我们的项目解耦合.更加符合vue的设计思想MVVM. 那接下来就跟我看一下如何在一个Vue实例中使用组件吧! ...
- JavaEE Cookie HttpSession 学习笔记
1. 会话管理概述 1.1 什么是会话 好比一次通话.打开浏览器,点击多次链接(发出多次请求和收到多次的响应),关闭浏览器,这个过程就是一次会话. 有功能 可以 文件 新建会话 1.2 解决的问题是 ...
- 关于keyGenerator,KeyPairGenerator,SecretKeyFactory的解析
Java加密的常用的加密算法类型有三种 1单向加密:也就是不可逆的加密,例如MD5,SHA,HMAC 2对称加密:也就是加密方和解密方利用同一个秘钥对数据进行加密和解密,例如DES,PBE等等 3非对 ...
- ArcGIS API for javascript开发笔记(三)——解决打印输出的中文为乱码问题
感谢一路走来默默支持和陪伴的你~~~ ----------------------欢迎来访,拒绝转载---------------------- 1. 调用ArcGIS API的Print实 ...
- java数据库三大范式
引用知乎网友@ 王红波的回答 一范式就是属性不可分割.属性是什么?就是表中的字段.不可分割的意思就按字面理解就是最小单位,不能再分成更小单位了.这个字段只能是一个值,不能被拆分成多个字段,否则的话,它 ...
- 洛谷P2657 windy数 [SCOI2009] 数位dp
正解:数位dp 解题报告: 传送门! 这题一看就是个数位dp鸭,"不含前导零且相邻两个数字之差至少为2"这种的 然后就直接套板子鸭(板子戳总结,懒得放链接辣QAQ 然后就是套路 然 ...
- SVN版本控制系统搭建(结合http服务)
SVN版本控制服务器搭建 Svn(subversion)是一个开源代码管理的控制系统,用来管理和存储开发的源代码,基于C/S模式.可以单独提供服务,也可以结合http服务来实现. 运行方式 运行端口 ...
- 前端(以Vue为例)webpack打包后dist文件包如何部署到django后台中
由于现在前端使用的三大框架配合webpack可以实现快速打包,为部署到服务端提供了非常大的便利,那么在前端打包后,应该做些什么可以部署到django的后台中呢? 1.打包后文件包dist 进入到 di ...
- 易忘的mysql语句
1.修改主键 ALTER TABLE `resource` DROP PRIMARY KEY ,ADD PRIMARY KEY ( `rid` ) 2.加上auto_increment ) NOT N ...