《App接口之Token令牌实现》
转载请注明来自 傻小孩b_移动开发(http://www.jianshu.com/users/d388bcf9c4d3)喜欢的可以关注我,不定期总结文章!您的支持是我的动力哈!

1、目的

众所周知,在web端中,Token(令牌)只是作为防止用户重复提交表单的作用而存在。但是对于App客户端而言,Token却充当着另一种角色,类似现实生活中代表每个人的角色认证、或者类似浏览器cookie代表你访问网站的角色认证。前提,在有用户系统的应用中,在每次访问接口的时候,为了避免接口裸露被被无止境的请求攻击,往往我们会利用一种机制,过滤一切非应用用户端的非合法请求。首先我们不可能每次利用账号密码作为我们的过滤标准(会存在被抓包密码泄露风险),因此便有
Token(令牌)的存在。即在存在这里的Token是指在指定有效时间内可以代表用户角色,具有请求接口的权限。

当然,这里有开发者会提问,为什么不适用session。理论上是可以的,只是如果是有接触过这部分的移动开发者,session本地是不好处理的,并且完全依赖
session,会被黑客截取后模拟请求,依然会存在被攻击的风险。

2、实现思路

这里我不做加密方式选择的举例,这里只是做了简单的做了不可逆的MD5加密方式(账号+时间戳)。首先web框架是利用(spring + struct2 + mybatis),简单说明下实现思路:

1、用户登录。请求登录接口,如果账号密码核对正确,会根据账号和时间戳进行Md5加密生成Token

2、服务端双向保存token。服务端根据有效时间内生成对应的token之后,服务端双向保存了Memcache中(
Memcache 是一种分布式缓存存储机制,这里我就不详细说明了),最后通过登录接口返回Token信息至客户端中
3、客户端保存返回Token。
客户端通过登录接口成功返回的token,保存的内存中,在每次请求接口都要携带这个token,进行接口请求。

具体思路图如下所示:

token_1.png

token_2.png

3、案例

(1)登录接口实现

    /*** 用户登录* @throws IOException */public void login() throws IOException{System.out.println("- AppUserManagerAction -" + "login");String token = TokenUtils.setToken(testAccount);System.out.println("账号 " + testAccount + "生成的token:"+token);JSONObject json = new JSONObject();json.put("result", "0");json.put("reason", "用户");json.put("token", token);this.getResponse().setContentType("text/plain");this.getResponse().setCharacterEncoding("UTF-8");this.getResponse().getWriter().write(json.toString());this.getResponse().getWriter().flush();}

(2)token生成

    /*** 为了登陆 或 刷新 Token 生成对应token*/public static String setToken(String account){String token = generateToken(account);// 存储正反向MemcacheManager.set(account + TOKEN_MARKER, token,TOKEN_VAILD_TIME);MemcacheManager.set(token,account + TOKEN_MARKER,TOKEN_VAILD_TIME);return token;}

(3)struct2 请求拦截

首先在接口请求中,为了对token进行验证,这里是直接在
struct2中写了一个拦截器对请求接口用户Token的验证,有疑问的可以自己谷歌搜索下struct2自定义拦截器


/*** Token 拦截器 用于检测Token是否过去,过期直接不执行Action* @author wsy**/
public class TokenInterceptor extends AbstractInterceptor {@Overridepublic String intercept(ActionInvocation invocation) throws Exception {System.out.println("-- TokenInterceptor --");Object action = invocation.getAction();if (action instanceof MngUserAction || action instanceof AppUserManagerAction) {if (invocation.getProxy().getActionName().equals("login")) {System.out.println("-- TokenInterceptor -- " + "login 不需要拦截");return invocation.invoke();}}// 取得请求相关的ActionContext实例  ActionContext actionContext = invocation.getInvocationContext();  HttpServletRequest request = (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);HttpServletResponse response = (HttpServletResponse)actionContext.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);  if (TokenUtils.isVaild(request)) {System.out.println("token 有效");invocation.invoke();}else{System.out.println("token 过期");JSONObject json = new JSONObject();json.put("result", "002");json.put("reason", "Token 过期");response.setContentType("text/plain");response.setCharacterEncoding("UTF-8");response.getWriter().write(json.toString());response.getWriter().flush();}return null;}}

(4)struct2 配置

    <!-- struts 设置默认配置 --><package name="struts-shop" extends="struts-default"><interceptors><!-- 默认拦截器 --><interceptor name="authority" class="employee.utils.TokenInterceptor" /><!-- 拦截器栈 --><interceptor-stack name="myStack"><interceptor-ref name="defaultStack" /><interceptor-ref name="authority" /></interceptor-stack></interceptors><default-interceptor-ref name="myStack" /></package><package name="/employee/application/action" namespace="/employee/application/action"extends="struts-shop"><action name="login" class="employee.application.action.AppUserManagerAction"method="login" /><action name="getPersonInfo" class="employee.application.action.AppUserManagerAction"method="getPersonInfo"/></package>

4、总结

当然在正式平台,加密方式不会这么简单,具体可以看下
http://blog.csdn.net/jack85986370/article/details/51362278 这篇文章,非对称加密就有很强的加密方式,通过公钥与私钥进行信息加密。有什么问题可以联系笔者,欢迎技术交流哈~

作者:DevSiven
链接:https://www.jianshu.com/p/36e95d8dcabe
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

App接口之Token令牌实现相关推荐

  1. .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制

    项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩过webAPI,但是领导要求必须用这个(具体原因鬼知道),只好硬着头皮上了. 最近刚做完权限这一块,分享出来给大家.欢 ...

  2. Spring3.1.1+Jersey2.2+ehcache实现WebApp与服务器接口交互获取令牌及校验过程

    实现思路: 1. 用户登录成功后,服务器端按照一定规则生成一个Token令牌,Token是可变的 2. 将Token作为key,用户信息作为value放到缓存中,设置有效时长(比如30分钟内没有访问就 ...

  3. node连接数据库;webpack;token令牌的实现;CommonJs规范;websocket

    node连接数据库 安装mysql 插件:npm i mysql //1.引入 const mysql =require("mysql"); //2.创建连接对象 //使用crea ...

  4. vue+node.js前后端交互中的token令牌验证

    这篇文章分享一下本人学习vue+node.js前后端交互中的登录token令牌的心得 最近准备写一个个人博客网站,前端采用的是vue+element,后端用node.js 在做用户登录的时候就想到 如 ...

  5. webapi鉴权使用token令牌

    一为什么使用Token验证: 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认 证,那么这就需要用户提供一 ...

  6. appcontroller.php,php用什么开发app接口

    可以使用 REST模式 来开发 App 接口,首先建立一个公共控制器,再建其他控制器继承它即可. 确定好返回的数据内容格式及信息码: (推荐学习:PHP视频教程)<?php // App接口公共 ...

  7. 微信小程序+TP5——token令牌生成

    token令牌的作用:客户端每次登录服务器端都会生成一个唯一的token令牌值,并返回到客户端,而服务器端会默认将token令牌值作为key, 用户信息作为value,一一对应存入缓存中,当用户每一次 ...

  8. 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已 ...

  9. API的 Signature(签名)Token(令牌) 认证

    2019独角兽企业重金招聘Python工程师标准>>> Signature认证 一次性的身份校验方式,常见于不同项目间的api通信 一般形式是通过 AppID/AppSecret 及 ...

最新文章

  1. iOS进阶之架构设计MVVM的实现示例(4)
  2. 记一次lwip中 遇到 pcb == pcb-next 的pcb死循环debug过程
  3. NIFI工作流备份和恢复
  4. C#下的两种加密方式MD5和DEC
  5. Android中传递对象的三种方法
  6. 最大限度地降低多线程 C# 代码的复杂性
  7. 【AI视野·今日NLP 自然语言处理论文速览 第十六期】Tue, 29 Jun 2021
  8. FCKeditor集锦
  9. Unity3d中的属性(Attributes)整理【转载】
  10. Go本地浏览Web服务器
  11. 播放量子计算机的声音,首次实现:用声音纠缠了两个量子比特!
  12. CTF中遇到不知道文件类型_道家文化中你不知道的尖端科学
  13. 随机信号分析与处理 相关
  14. Linux cp命令的内涵
  15. 网页中单个页面如何做好SEO优化
  16. 2019杭电多校 Snowy Smile hdu6638 (线段树最大子段和)
  17. OSChina 周四乱弹 ——潘金莲告西门庆
  18. 什么是IP65?仅仅是防水等级吗?看完本文直呼666!
  19. 2021年,从事数据分析行业前景如何?还能转行数据分析师吗?(下)
  20. 老男孩python培训课件

热门文章

  1. Java并发编程之LinkedTransferQueue阻塞队列详解
  2. unity支持的模型数据格式_Unity3D开发:向Unity3D中导入外部模型
  3. jsp药品信息管理系统 myeclipse开发mysql数据库
  4. 解说论坛要用什么“花招”来留住用户
  5. c++string 加引号_一文带你了解Java字符串处理(String,StringBuffer,StringBuild)
  6. python3爬取微博评论并存为xlsx
  7. 任务管理器中的PID找不到
  8. JZOJ6828. 【2020.10.25提高组模拟】幂
  9. Pygame小游戏:“长沙版”大富翁开局了,敢不敢约?(附多份游戏源码)
  10. USB人体学输入设备黄色感叹号