资讯专栏INFORMATION COLUMN

token验证实现

fobnn / 1215人阅读

摘要:在实现过程中也找到了不少的好资料,这一篇中用户验证方案详细的介绍了用户验证的不同方案。另,的失效时间应该设置多长需要根据所在项目的实际情况确定。

移动开发中一定会涉及后台API如何访问,如何控制访问权限,保证系统安全等问题。
介绍一下我最近自己做的一个移动端访问后端API的例子,例子写的很粗糙,但是基本实现了以token auth 为核心的demo。

在实现demo过程中也找到了不少的好资料,这一篇《APP中用户验证方案》详细的介绍了APP用户验证的不同方案。

大体思路:

APP登录界面输入用户信息登录;服务端验证登录信息,验证成功,向APP端发送token,将token保存到数据库或者缓存服务器中;APP登录成功后,每次调用后端API时都需要带着token、时间戳、sign(token+时间戳的md5字符串,sign可以自己定义算法以防止被盗用)信息,以便后台验证访问API权限;后端在接收到APP访问请求时,比对APP发送来的token与缓存服务器中已经存在的token是否一致,并验证token时效性。

好了,废话少说,上代码:

前端代码(APP,最近写的APP基本都是H5方式实现):


        
        

这里的ostData使用的是封装好的Ajax函数,下面一并放出代码:

ajax.js:

/*对ajax进行简易封装,便于每次调用,省去参数设置*/
function postData(url, data, headData, callback, waitingDialog) {
    mui.ajax(url,{  
        data:data,  
        dataType:"json",  
        type:"post",
        headers: {
            "token" : headData[0],
            "timesamp" : headData[1],
            "sign" : headData[2]
        },
        contentType:"application/x-www-form-urlencoded; charset=utf-8",  
        timeout:20000,  
        success:callback,
        error:function(xhr,type,errorThrown){  
            //waitingDialog.close();
            alert("<网络连接失败,请重新尝试一下>", "错误", "OK", null);  
        }  
    });
}  
ajax中加上了headers参数,这里加headers参数的目的是,后台使用servlet+filter的方式控制访问,如果将token等其他参数直接和表单数据同时提交,filter在获取token信息后,servlet就不能获取到表单数据,这就比较尴尬了,或者后台使用AOP的方式控制访问权限 ,这个还没有来得及尝试。如果我能把token信息加到于表单数据不同的存储区域就好了,Google后找到了可以把数据加到请求的header中可以实现将token数据与表单数据分离的效果。

过滤器(Java实现 JDK1.8 Tomcat8.5.6):

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

import me.wlc.wx.web.tool.Md5;

/**
 * 使用注解标注过滤器
 * @WebFilter将一个实现了javax.servlet.Filte接口的类定义为过滤器
 * 属性filterName声明过滤器的名称,可选
 * 属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)
 * urlPatterns="/*" 表示过滤掉所有请求
 */
@WebFilter(filterName="AccessFilter",urlPatterns="/*")
public class AccessFilter implements Filter {

    @Override
    public void destroy() {
        
        System.out.println("过滤器销毁");

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("执行过滤操作");
        HttpServletRequest req = (HttpServletRequest) request;
        String uri = req.getRequestURI();
        System.out.println("uri is :  " + uri);
        
        //对请求的uri(即api)进行判断,如果是登录的uri则直接放行,如果是其他api则对sign进行验证操作
        if( !uri.endsWith("loginServlet") ){
            //从请求的url中取出token、时间戳、sign
            String token = req.getHeader("token");
            String timesamp = req.getHeader("timesamp");
            String sign = req.getHeader("sign");
            System.out.println("sign is :  " + sign);
            
            StringBuffer requestUrl = req.getRequestURL();
            System.out.println("请求的Url是:   " + requestUrl);
            
            //对token、timesamp 进行md5计算
            String signMd5 = Md5.getMD5(token + timesamp);
            if(sign.equals(signMd5)){
                //签名通过
                chain.doFilter(request, response);
            }else{
                //签名不通过,向app后端发送错误信息,提示重新登录
                
            }    
        }else{
            //登录操作
            chain.doFilter(request, response);
        }
        
        //请求通过
        //chain.doFilter(request, response);
        
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        
        System.out.println("过滤器初始化");
        
    }

}

后端还没有实现验证token时效性功能,也没有将token存储到缓存服务器中,这些需要具体方案定下来以后再加上了。再说一句,生成的token保证token值唯一即可,可以使用最方便的UUID(Java中)。

大体就是这样了,有问题随时提给我哦!

PS:2018年9月28日更新
一直没有登录查看留言,给留言板的各位兄弟道个歉,没有及时回复

token存储方案:

方案一:使用session的超时时间来控制token的失效时间
方案二:使用redis存储token的失效时间

方案一适用于单机环境,可以作为小型系统的token时效性验证方案,此方案若处于分布式环境会导致session在分布式机器间的时间不同步,但跟组里的其他工程师沟通,在分布式环境下是不是还可以同步session?

方案二适用于大型系统,还要使用redis服务,使用redis存储token可是实现快速读取token时效数据,若将toke失效时间存储到数据库中,频繁操作数据库,会影响数据库的响应时间,进而应用程序也会出现卡顿等情况。

另,token的失效时间应该设置多长需要根据所在项目的实际情况确定。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82563.html

相关文章

  • 使用JWT(Json Web Token)实现登录认证

    摘要:今天我们来结合实例给大家讲述的实战应用,就是如何使用前端与后端实现用户登录鉴权认证的过程。只用了一个串,建立前后端的验证的数据传递,实现了有效的登录鉴权过程。 今天我们来结合实例给大家讲述JWT(Json Web Token)的实战应用,就是如何使用前端Axios与后端PHP实现用户登录鉴权认证的过程。 文中涉及的重要知识点: axios异步请求:axios-基于Promise的HTT...

    Yu_Huang 评论0 收藏0
  • JavaMailSender实现邮箱注册验证

    摘要:前言使用邮箱注册验证,我们需要理清设计思路问题一注册信息提交后需要对填写的邮箱号发送邮件问题二邮件到达时用户如何进行激活,是通过请求还是获取验证码本篇使用接口激活问题三邮件激活如何设置有效时间通过以上三个问题,博主来帮助大家掌握邮箱验证问题 前言 使用邮箱注册验证,我们需要理清设计思路: 问题一:注册信息提交后需要对填写的邮箱号发送邮件 问题二:邮件到达时用户如何进行激活,是通过get...

    zeyu 评论0 收藏0
  • 前后端分离项目 — 基于SpringSecurity OAuth2.0用户认证

    摘要:前言现在的好多项目都是基于移动端以及前后端分离的项目,之前基于的前后端放到一起的项目已经慢慢失宠并淡出我们视线,尤其是当基于的微服务架构以及单页面应用流行起来后,情况更甚。使用生成是什么请自行百度。 1、前言 现在的好多项目都是基于APP移动端以及前后端分离的项目,之前基于Session的前后端放到一起的项目已经慢慢失宠并淡出我们视线,尤其是当基于SpringCloud的微服务架构以及...

    QLQ 评论0 收藏0
  • 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    摘要:在使用非对称加密算法进行签名的时候,还可以用于验证的发件人是否与中申明的发件人是同一个人。如果没有用非对称加密算法的话,把复制之后直接可以去官网在线解析。 这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token)。 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具,首先得知道以下几个问题。 这...

    yeyan1996 评论0 收藏0

发表评论

0条评论

fobnn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<