实现此功能的场景是在当下用户对手机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自动登录功能的更多相关文章

  1. yii2.0自动登录功能的实现方法

    参考地址:http://www.kuitao8.com/20150518/3747.shtml 自动登录的原理很简单.主要就是利用cookie来实现的在第一次登录的时候,如果登录成功并且选中了下次自动 ...

  2. Vue+Vuex 实现自动登录功能

    刚刚实现了Vue+Vuex的自动登录功能,在实现的时候遇到了一些问题,这里记录一下: 因为这个还不够完善,在写完下列代码后,又进行了补充,可以从https://www.cnblogs.com/xiao ...

  3. spring security实现记住我下次自动登录功能

    目录 spring security实现记住我下次自动登录功能 一.原理分析 二.实现方式 2.1 简单实现方式 2.2 数据库实现方式 三.区分是密码登录还是rememberme登录 spring ...

  4. 二十 Filter&自动登录功能

    Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: ...

  5. 自己Cookie写的自动登录功能 包含BASE64 和MD5的使用

    sql表 username  password字段 User类 有 id username password等字段 Service有一函数 @Override public User findUser ...

  6. cookie理解与实践【实现简单登录以及自动登录功能】

    cookie理解 Cookie是由W3C组织提出,最早由netscape社区发展的一种机制 http是无状态协议.当某次连接中数据提交完,连接会关闭,再次访问时,浏览器与服务器需要重新建立新的连接: ...

  7. HBuilder开发APP自动登录时跳过"登录页面"

    刚接触开发公司APP项目,用HBuilder开发工具. manifest.json中的入口页面就是"登录页面",现在获取到自动登录状态是true,但是真机联调时"登录页面 ...

  8. JS-两周内自动登录功能

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)

    首先在shiro配置类中注入rememberMe管理器 /** * cookie对象; * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cooki ...

随机推荐

  1. 前端基础进阶之Promise

    前言 Promise的重要性我认为我没有必要多讲,概括起来说就是必须得掌握,而且还要掌握透彻.这篇文章的开头,主要跟大家分析一下,为什么会有Promise出现. 在实际的使用当中,有非常多的应用场景我 ...

  2. 托管调试助手 "DisconnectedContext":“上下文 0xf20540 已断开连接... 请确保在应用程序全部完成 RuntimeCallableWrapper (表示其内部的 COM 组件)之前,所有 COM 上下文/单元/线程都保持活动状态并可用于上下文转换

    最近做一个winForm的小工具,用到了 ManagementObjectSearcher/ManagementClass 和 WndProc ,涉及到对 移动设备的检测. 窗体加载时会执行一个 Re ...

  3. Context对象还提供了相应的属性来调整线条及填充风格

    创建一个Canvas画布的方法如下: 复制代码 代码如下: <canvas id=”canvas” width=”600” height=”400”></canvas> 可以在 ...

  4. c++从文件中读取一行数据并保存在数组中

    从txt文本中读取数据存入数组中 #include <iostream> #include <fstream> #include <string> #include ...

  5. POJ 1269 - Intersecting Lines - [平面几何模板题]

    题目链接:http://poj.org/problem?id=1269 Time Limit: 1000MS Memory Limit: 10000K Description We all know ...

  6. python面向对象高级:__slots__

    __slots__ 一个在有着数以千计的对象的类的时候节省内存的方法. 在Python中,每个类都有实例属性.默认情况下Python用一个字典来保存一个对象的实例属性.这非常有用,因为它允许我们在运行 ...

  7. web前端开发笔记(1)

     一.HTML标签书写有哪些规范? 页面编码. 文档声明. 关键字与描述. 行内元素不能包含块级元素. a标签不能嵌套a标签. 标签名和属性必须用小写字母书写,属性必须加引号,标签必须闭合,单标签页必 ...

  8. SQL中的四种语言DDL,DML,DCL,TCL

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...

  9. 44(function pointer 2)

    #include<iostream> using namespace std; class A { public: int x; int sayhello() { cout<< ...

  10. 【PyQt5-Qt Designer】读取txt文件在打印

    from PyQt5.QtGui import QFont,QTextDocument,QTextCursor from PyQt5.QtWidgets import QApplication, QM ...