使用token实现在有效期内APP自动登录功能 - sevennight

标签: | 发表时间:2018-05-23 18:46 | 作者:
出处:http://sevennight.cc

实现此功能的场景是在当下用户对手机APP体验要求高,并且相对安全前提的推动下诞生;当你下载了一个QQ,微信第一次进行了账号和密码的登录,你从此以后打开应用免去了你每日打开应用都要输入账号跟密码的痛苦过程,在产品体验方面来讲,这种体验更为让用户容易接受。那么,这种自动登录如何实现;

之前在APP里面接入达达配送的时候,看到他们提供的API接口里面大致有了这个一个认证的过程,自己琢磨了一下,依稀的弄出了一个类似这样的自动登录的流程;

一、获取token登录令牌接口(可以理解为登录接口)

这一步是需要用户使用账号和密码进行登录去获取,用户如果登录成功,那么后台返回一个token及token的失效时间,及未来如果token失效之后刷新token的令牌!

返回参数示例及说明:

            
1
2
3
4
5
6
7
8
9
10
            
{
//状态位,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,重新获取一组令牌信息,覆盖掉以前保存在手机上的令牌信息,这也算是提升了一点安全性,为避免以前的令牌信息如果真落入别人之手;

此接口的请求参数可以参考以下参数:

            
1
2
3
4
5
6
7
8
            
{
//用户账号,大多数APP用的是手机号登录,这里也可以是其他值,能表名是将要自动登录的用户即可
"username":"13000000007",
//手机设备的唯一值
"imei":"928347024892343",
//刷新token的令牌
"refresh_token":"8ab486662d50e6d51a5a5dd6a25c9a4b"
}

返回参数示例及说明:

            
1
2
3
4
5
6
7
8
9
10
            
{
//状态位,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进行认证成功和失败有不同的处理方式;

此接口的请求参数可以参考以下参数:

            
1
2
3
4
5
6
7
8
            
{
//用户账号,大多数APP用的是手机号登录,这里也可以是其他值,能表名是将要自动登录的用户即可
"username":"13000000007",
//手机设备的唯一值
"imei":"928347024892343",
//token认证令牌
"token":"4a28d8516d42f4821e6d5782d1a79a7a"
}

返回参数示例及说明:

            
1
2
3
4
5
6
7
            
{
"status":"0"//响应结果,成功
}
or
{
"status":"1"//响应结果,token过期
}

说明:

  • 这里如果返回成功,可以让用户跳转到首页使用APP
  • 如果返回token过期,调用第二步的刷新token令牌的接口去重新获取令牌

相关 [token 有效 app] 推荐:

使用token实现在有效期内APP自动登录功能 - sevennight

- -
实现此功能的场景是在当下用户对手机APP体验要求高,并且相对安全前提的推动下诞生;当你下载了一个QQ,微信第一次进行了账号和密码的登录,你从此以后打开应用免去了你每日打开应用都要输入账号跟密码的痛苦过程,在产品体验方面来讲,这种体验更为让用户容易接受. 之前在APP里面接入达达配送的时候,看到他们提供的API接口里面大致有了这个一个认证的过程,自己琢磨了一下,依稀的弄出了一个类似这样的自动登录的流程;.

RSA的SecureID token数据被偷了?

- ripwu - 张志强的网络日志
博客 » 记事本 » 密码学 ». WSJ报道:RSA承认其数据被偷,4000万SecureID token需要被更新. 中国银行银行密钥用的就是RSA生产,就是下图这玩意儿,手里有这玩意儿的同学们要小心了(当然,如果你的账户里的钱没有6位数以上,也不用太担心,毕竟网银的安全性不全依赖于这个设备):.

什么是 JWT -- JSON WEB TOKEN - 简书

- -
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(. (RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景. JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密.

App时代,如何发现有效的营销曝光渠道

- 彭全兵 - 互联网的那点事...
对于手机应用商店来讲,(以苹果为例)对外宣布商店的应用总数超过40万,总下载次数超过100亿次无疑是激动人心的消息. 但是对于开发者而言,超过2亿的itunes专属账户(绑定信用卡),超过1亿的iPhone用户和超过1500万的iPad用户除了超级诱惑之外,不得不考虑的问题是如何开拓出有效的营销渠道和潜在的用户做无缝的对接.

微信平台的token安全验证(转)

- - 行业应用 - ITeye博客
本文目标:学习一种比较安全的服务器间互相验证身份的方式. 问题:开发微信公众平台接口,开发者的服务器为了确保请求是否来自微信服务器,应该如何去做. 1)  在微信管理页面上填写URL和TOKEN,开发者服务器上也记录同样的TOKEN. 2)  微信服务器发送HTTP请求,附带上参数(注意TOKEN是不会被传输的).

springmvc下的基于token的防重复提交

- - zzm
现在的网站在注册步骤中,由于后台要处理大量信息,造成响应变慢(测试机器性能差也是造成变慢的一个因素),在前端页面提交信息之前,等待后端响应,此时如果用户. 再点一次提交按钮,后台会保存多份用户信息. 为解决此问题,借鉴了struts2的token思路,在springmvc下实现token. 在springmvc配置文件中加入拦截器的配置,拦截两类请求,一类是到页面的,一类是提交表单的.

深入了解Json Web Token之概念篇

- - FreeBuf互联网安全新媒体平台 | 关注黑客与极客
以下,可能你能够在各大网站上搜到,但是对于JWE 的内容,却鲜有见闻. 下文是我读了json web token handle book后,用自己的理解写下的,如有疑问,欢迎评论. 主要参考文本 JWT Hand Book,部分文字翻译自该手册. 一个JWT,应该是如下形式的:. 这些东西看上很凌乱,但是非常 紧凑,并且是 可打印的主要用于 验证签名的真实性.

SpringBoot 整合 oauth2(三)实现 token 认证 - 简书

- -
关于session和token的使用,网上争议一直很大. session是空间换时间,而token是时间换空间. session占用空间,但是可以管理过期时间,token管理部了过期时间,但是不占用空间.. sessionId失效问题和token内包含. session基于cookie,app请求并没有cookie.

JWT认证,取得过期token的用户名

- - 掘金后端
项目前后端分离,请求认证使用的是JWT无状态认证. 最近遇到一个问题,认证token需要从token中获取用户名,但是这个token有可能是过期的. 一般取得用户名用的是下面的代码. .getBody(); } 复制代码. 如果token没有过期,则可以通过Claims.getSubject()获得用户名.

API接口设计之token、timestamp、sign具体实现

- - 企业架构 - ITeye博客
Token:访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证,减少用户名和密码的传输次数. 一般情况下客户端(接口调用方)需要先向服务器端申请一个接口调用的账号,服务器会给出一个appId和一个key, key用于参数签名使用,注意key保存到客户端,需要做一些安全处理,防止泄露.