精华内容
参与话题
问答
  • 用户登录之token验证

    万次阅读 多人点赞 2017-06-13 22:10:01
    可能还有很多小伙伴对token概念朦朦胧胧,今天笔者以项目中的用户登录的token验证需求跟大家讲讲其中的来龙去脉,希望能够理清大伙的思路。 2.需求分析 这个需求可能早已是老生常谈,但我觉得它永远也不会过时 ①...

    1.场景还原

         可能还有很多小伙伴对token概念朦朦胧胧,今天笔者以项目中的用户登录的token验证需求跟大家讲讲其中的来龙去脉,希望能够理清大伙的思路。

    2.需求分析

    这个需求可能早已是老生常谈,但我觉得它永远也不会过时

    ①谷歌浏览器:login.html---->index.html;

    ②然后复制index.html的地址在IE浏览器地址栏上,这时普遍网站都会使访问界面直接返回到login.html

    只有登录了才可以继续浏览,保证了用户的信息安全性,这个需求就得用到token验证。

    3.实现方案

    ①token生成方法

     

    /**
     * Created by zhangxing on 2017/6/12.
     */
    public class Token {
    
        //随机数发生器
        public static String genetateToken(){
            String token = System.currentTimeMillis()+"";//获得毫秒数加随机数
            String tokenMd5="";
            try {
                MessageDigest md = MessageDigest.getInstance("md5");
                byte[] md5 = md.digest(token.getBytes());
                BASE64Encoder base = new BASE64Encoder();
                tokenMd5 = base.encode(md5);
    
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
    
            return tokenMd5;
        }
    
        public static  void main(String args[]){
            System.out.println(genetateToken());
        }
    }
    

     

    ②实现后台登录接口

     

    @GetMapping(value = "/login")
    public Map<String,Object> getLogin(String loginName,String password){
        String zhangxing = Token.genetateToken();
        session.setAttribute(SESSION_TOKEN,zhangxing);
    
        boolean login = false;
        //储存token
        String pwd = loginService.getPassword(loginName);
        Map<String,Object> map = new HashMap<String, Object>();
        if(pwd.equals(password)){
            login = true;
        }
        map.put("login",login);
        map.put("token",zhangxing);
        return map;
    }

    其中,在实现登录的同时生成token,并将其缓存到session中

     

    ③实现对所有controller拦截

    1>拦截类

     

    public class LoginInterceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String userToken = (String) request.getSession().getAttribute(SESSION_TOKEN);
    
            // 初始化拦截器,设置不拦截路径
            String noMatchPath= Constants.NO_MATCH_PATH;
            String path=request.getServletPath();
    
            System.out.println("资源请求路径:"+path);
            if(path.matches(noMatchPath)){
                // 授权路径,不拦截
                return  true;
            } else if(null == userToken || "".equals(userToken)) {
                // 找不到用户Token,重定位到登录
                response.sendRedirect(request.getContextPath() + "/login");
                return  false;
            } else {
                // 设置扩展
                return  true;
            }
        }
    
    } 

     

    继承HandlerInterceptorAdapter,重载preHandler()方法,其中的match()方法是对不进行拦截匹配的资源进行正则匹配,其资源样式为

     

    public static final String  NO_MATCH_PATH=".*/(login).*";

     

    逻辑为:

    取出session中的用户token,如果token为空就进行拦截;反之放行

    2>配置并注册工程的拦截类

     

    @Configuration
    public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //拦截所有的controller
            registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
        }
    }

     

    一个注解就能够通知springboot工程,只要符合要求就可以进行拦截匹配

     

    @Configuration

     

    ④编写实现前端跳转的controller

     

    @Controller
    @CrossOrigin
    public class PageController {
    
        @RequestMapping("/login")
        public String login(){
            return "hello";
        }
    
        @RequestMapping("/success")
        public String success(){
            return "factManage";
        }
    
    }

     

    return 出来的路径定位到templates中相应的html资源,注意,PageController的上面不要再带上@RequestMapping

    ⑤看看hello.html的前端代码

     

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>token</title>
        <!-- 引入 echarts.js -->
        <script type="text/javascript" src="js/jQuery.js"></script>
    </head>
    <body> 
    用户名:<input type="text" id="username"><br><br>
    密  码:<input type="text" id="pwd"><br>
    <button onclick="getlogin()">登录</button>
    
    <script type="text/javascript">
    
    function getlogin(){
    
       alert($("#username").val());
       alert($("#pwd").val());
    
            $.ajax({
            type: "get",
            url: "http://localhost:8089/user/login",
            data:{
            "loginName":$("#username").val(),
            "password":$("#pwd").val()
            },
            xhrFields:{withCredentials:true},
            beforeSend: function(XMLHttpRequest){
            },
            //请求成功回调
            success: function(data, textStatus){
                  alert("进来了");
                  alert(data.login);
                  alert(data.token);
                  if(data.login){
                  
                      localStorage.setItem("token",data.token);
    
                      window.location.href ="success";
    
                  }
               
            },
            complete: function(XMLHttpRequest, textStatus){
                
            },
            error: function(){
                alert("请求网络失败!。。。。。。");
            }
        });
    }
    
    </script>
    </body>
    </html>

     

    只要登录成功了便请求sucess的controller接口

     

     window.location.href ="success";

    对应的success接口实现

     

     

    @RequestMapping("/success")
    public String success(){
        return "factManage";
    }

     

    效果图:

    1>登录

    2>成功跳转

    3.换IE请求首页http://localhost:8089/success

    token显然为空,直接跳到登录界面,这样需求也就实现呢

    创作不易,莫要白嫖,您的关注及点赞是对于我创作的最大动力与源泉。

     

    展开全文
  • token验证流程

    千次阅读 2018-05-29 13:28:59
    今天给大家分享一下,修真院官网java任务四中可能会使用到的知识点:Token验证流程:1.背景介绍传统身份验证的方法HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端...
    大家好,我是IT修真院西安分院第2期学员,一枚正直善良的java程序员。
    今天给大家分享一下,修真院官网java任务四中可能会使用到的知识点:
    Token验证流程:

    1.背景介绍


    传统身份验证的方法


    HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。


    解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。


    上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。


    基于 Token 的身份验证方法


    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:


    客户端使用用户名跟密码请求登录
    服务端收到请求,去验证用户名与密码
    验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
    传统身份验证的方法


    HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。


    解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。


    上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。


    基于 Token 的身份验证方法


    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:


    客户端使用用户名跟密码请求登录
    服务端收到请求,去验证用户名与密码
    验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据Tiles起源
    最早的Tiles是组装在Struts1.1里面的,主要目的是为了将复数的jsp页面作为一个的页面的部分机能,然后用来组合成一个最终表示用页面用的,这样的话,便于对页面的各个机能的变更及维护。
    现在Tiles已经作为一个Apache独立的开源项目维护着。

    如果您发现自己在每个页面上都要编写三行相同的 JSP 代码,或者你想容易地定义复杂的模版布局,那么相信学习Tiles框架会对你有帮助

    2.知识剖析

    传统身份验证的方法


    HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。


    解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。


    上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。


    基于 Token 的身份验证方法


    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:


    客户端使用用户名跟密码请求登录
    服务端收到请求,去验证用户名与密码
    验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
    传统身份验证的方法


    HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。


    解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。


    上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。


    基于 Token 的身份验证方法


    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:


    客户端使用用户名跟密码请求登录
    服务端收到请求,去验证用户名与密码
    验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

    3.常见问题

    基于服务器验证方式暴露的一些问题
    1.Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。

    2.可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。

    3.CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。

    4.CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。 在这些问题中,可扩展行是最突出的。因此我们有必要去寻求一种更有行之有效的方法。

    4.解决方案

    基于Token的身份验证的过程如下:


    1.用户通过用户名和密码发送请求。


    2.程序验证。


    3.程序返回一个签名的token 给客户端。


    4.客户端储存token,并且每次用于每次发送请求。


    5.服务端验证token并返回数据。


    展开全文
  • Token验证详解

    万次阅读 2018-06-21 14:13:10
    注:解释的也是非常清晰,很受用一篇文章。...为什么使用Token验证: &nbsp; 在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。 &nbsp; 以...
    注:解释的也是非常清晰,很受用一篇文章。原文出处:https://blog.csdn.net/woshihaiyong168/article/details/52857479
    为什么使用Token验证:

      在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。

      以下几点特性会让你在程序中使用基于Token的身份验证

      1.无状态、可扩展

      2.支持移动设备

      3.跨程序调用

      4.安全

     

    那些使用基于Token的身份验证的大佬们

    大部分你见到过的API和Web应用都使用tokens。例如Facebook, Twitter, Google+, GitHub等。

     

    Token的起源

    在介绍基于Token的身份验证的原理与优势之前,不妨先看看之前的认证都是怎么做的。

      基于服务器的验证

       我们都是知道HTTP协议是无状态的,这种无状态意味着程序需要验证每一次请求,从而辨别客户端的身份。

    在这之前,程序都是通过在服务端存储的登录信息来辨别请求的。这种方式一般都是通过存储Session来完成。

    随着Web,应用程序,已经移动端的兴起,这种验证的方式逐渐暴露出了问题。尤其是在可扩展性方面。

     

    基于服务器验证方式暴露的一些问题

    1.Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。

    2.可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。

    3.CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。

    4.CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。

    在这些问题中,可扩展行是最突出的。因此我们有必要去寻求一种更有行之有效的方法。

     

    基于Token的验证原理

    基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中。

    这种概念解决了在服务端存储信息时的许多问题

      NoSession意味着你的程序可以根据需要去增减机器,而不用去担心用户是否登录。

    基于Token的身份验证的过程如下:

    1.用户通过用户名和密码发送请求。

    2.程序验证。

    3.程序返回一个签名的token 给客户端。

    4.客户端储存token,并且每次用于每次发送请求。

    5.服务端验证token并返回数据。

     每一次请求都需要token。token应该在HTTP的头部发送从而保证了Http请求无状态。我们同样通过设置服务器属性Access-Control-Allow-Origin:* ,让服务器能接受到来自所有域的请求。需要主要的是,在ACAO头部标明(designating)*时,不得带有像HTTP认证,客户端SSL证书和cookies的证书。


    代码实例流程:

    //用户第一次登录
    username pwd client_type
    //接口判断
    if(token&uid){
       查询token表
        token=whereuid=uidif(token==token){
          登录成功!!
              返回token 和 uid
        }else{
          登录失败!!
        }
    }

    if(usename powd client_type){
         检验用户名和密码
        if(正确){
           得到uid 并 生成token(md5( uid.pwd.time() 自己定义规则 ))
            if(uid不存在){
                into token 表   id uid token
            }else{
                where uid=$uid 修改token
            }
            返回token 和 uid
        }else{
            返回错误信息;    
            }
    }

    客户端c进行文件存储uid 和token

    下次再次登录时使用uid和token


    实现了用户登录的互踢


    当我们在程序中认证了信息并取得token之后,我们便能通过这个Token做许多的事情。

    我们甚至能基于创建一个基于权限的token传给第三方应用程序,这些第三方程序能够获取到我们的数据(当然只有在我们允许的特定的token)

     

    Tokens的优势

    无状态、可扩展

    在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。

    如果我们将已验证的用户的信息保存在Session中,则每次请求都需要用户向已验证的服务器发送验证信息(称为Session亲和性)。用户量大时,可能会造成

     一些拥堵。

    但是不要着急。使用tokens之后这些问题都迎刃而解,因为tokens自己hold住了用户的验证信息。

    安全性

    请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。 

    token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。

    可扩展性()

    Tokens能够创建与其它程序共享权限的程序。例如,能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。

    使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。

    多平台跨域

    我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。

    Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates the issues that CORS brings up after we set a quick header configuration for our application.

    只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。

    <span style="margin:0px; padding:0px; color:rgb(255,255,255); background-color:rgb(0,0,0)"><code class=" language-javascript" style="margin:0px; padding:0px">          Access<span class="token operator" style="margin:0px; padding:0px">-Control<span class="token operator" style="margin:0px; padding:0px">-Allow<span class="token operator" style="margin:0px; padding:0px">-Origin<span class="token punctuation" style="margin:0px; padding:0px">: <span class="token operator" style="margin:0px; padding:0px">*       <br style="margin:0px; padding:0px" /></span></span></span></span></span></code></span>

    基于标准

    创建token的时候,你可以设定一些选项。我们在后续的文章中会进行更加详尽的描述,但是标准的用法会在JSON Web Tokens体现。

    最近的程序和文档是供给JSON Web Tokens的。它支持众多的语言。这意味在未来的使用中你可以真正的转换你的认证机制。

    总结

    这篇文章仅仅是介绍了为什么选择基于Token的身份验证,并且怎样使用它。


    展开全文
  • JWT产生和验证Token

    万次阅读 多人点赞 2019-07-31 19:15:33
    Token验证  最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web...

    #Token验证
      最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。
    ##传统的Token验证
      HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。
      解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
      上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。
      ##基于 Token 的身份验证方法
      使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
    客户端使用用户名跟密码请求登录
    服务端收到请求,去验证用户名与密码
    验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
    ##JWT+HA256验证
    实施 Token 验证的方法挺多的,还有一些标准方法,比如 JWT,读作:jot ,表示:JSON Web Tokens 。JWT 标准的 Token 有三个部分:
    header
    payload
    signature
    中间用点分隔开,并且都会使用 Base64 编码,所以真正的 Token 看起来像这样:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
    

    ###Header
    header 部分主要是两部分内容,一个是 Token 的类型,另一个是使用的算法,比如下面类型就是 JWT,使用的算法是 HS256,就是SHA-256,和md5一样是不可逆的散列算法。

    {
      "typ": "JWT",
      "alg": "HS256"
    }
    

    上面的内容要用 Base64 的形式编码一下,所以就变成这样:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    

    ###Payload
    Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:
    iss:Issuer,发行者
    sub:Subject,主题
    aud:Audience,观众
    exp:Expiration time,过期时间
    nbf:Not before
    iat:Issued at,发行时间
    jti:JWT ID
    比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。

    { 
     "iss": "ninghao.net",
     "exp": "1438955445",
     "name": "wanghao",
     "admin": true
    }
    

    使用 Base64 编码以后就变成了这个样子:

    eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
    

    ###Signature
    JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。

    var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload); 
    HMACSHA256(encodedString, 'secret');
    

    处理完成以后看起来像这样:

    SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
    

    最后这个在服务端生成并且要发送给客户端的 Token 看起来像这样:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
    

    客户端收到这个 Token 以后把它存储下来,下会向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。验证的过程就是
    根据传过来的token再生成一下第三部分Signature,然后两个比对一下,一致就验证通过。

    展开全文
  • 基于Token的身份验证的原理

    万次阅读 多人点赞 2019-05-06 13:41:32
    目录 1 发展史 2 Cookie ...4.3 基于Token验证原理 4.5 Tokens的优势 参考文献 1 发展史 1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某...
  • 什么是token验证

    2019-12-20 12:07:30
    Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。...
  • 在中心服务器模式下的客户端认证 又发现了一项之前在工行工作期间缺失的技术,到了互联网企业工作后,技术栈大大不同。...互联网企业是在客户端自行管理,体现了一定的p2p思想 认证类型 ... 优点:实现简单 ...
  • Token方式 验证登录

    2020-06-22 16:11:16
    Token 验证 在这之前先简单讲下登陆中验证码认证过程,先是拦截器里面配置下生成验证码的路径,使用谷歌的com.google.code.kaptcha API中的Producer对象生成验证码,后台生成Cookie 对象,key可以自定义,值用uuid...
  • Token及Token验证流程

    千次阅读 2019-03-05 22:01:55
    Token实际就是在计算机身份验证中的令牌(临时)的意思。 当前端向后端发起数据请求的时候,后端需要对前端进行身份验证,但是我们又不想每次都输入用户名和密码,这是就需要一个标识来证明自己的身份,这个标识就是...
  • 1:首先,先了解一下request和session的区别request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中。在这个过程中可以使用forward方式跳转多个...
  • 微信公众平台开发问题——token验证失败

    万次阅读 热门讨论 2015-04-08 11:58:13
    之前学了PHP后做的平台的开发,token验证是成功的,昨晚手贱改了一下聊天机器人的url和token之后,感觉没小黄鸡好玩,就改了回来,一改就是一晚上。而且昨晚微信开发者的那个后台基本登不上去,一直的token错误。 ...
  • Token验证失败的解决方法

    万次阅读 2019-04-10 10:37:21
    Token验证失败的解决方法 一、问题由来 在使用URL和Token启用微信公众平台开发模式消息接口的时候,我们会碰到下面三种情况 token校验失败 这样回头检查一下各项配置是否正确。如果确定配置没有问题,请按下面的...
  • Token验证失败

    千次阅读 2014-10-25 19:44:17
    Token验证失败的解决方法   一、问题由来  在使用URL和Token启用微信公众平台开发模式消息接口的时候,我们会碰到下面三种情况  1. token校验失败 这样回头检查一下各项配置是否正确。如果确定...
  • 1.1 没有严格按照微信官方的要求进行token验证。 解决方案建议:详细多阅读几次官方文档,并达到理解的程度。这里我将文档中的重点位置摘录,以提醒注意: 验证消息的确来自微信服务器 开发者提交信息(如何配置不再...
  • 微信token验证失败Java解决办法

    万次阅读 多人点赞 2017-07-20 17:55:59
    说我 token验证失败, 是不是因为我的token填写了jinsanpang(金三胖)了 ? 貌似这个token没有说明填写神马,看说明必须为英文或数字,长度为3-32字符。也就是说token是自定义的,也就是瞎鸡巴写都没事。 我们看下...
  • 有时候我们发现所有的配置都设置好了,网上也查了不少的资料,还是不行 请您检查这几项: 1. 在您的URL(服务器地址)页面里,直接Get获取echostr参数打印到页面上。 在火狐浏览器里Firebug里面看到echostr前面多...
  • 网上解决的问题这里就不再赘述,下面说的是我碰到的问题,同时也叙述了“TOKEN验证失败”的根源问题。背景 之前,我的公众号一直正常工作,但由于需要更换服务器,就把网站做了迁移,数据也迁移的,但是在修改服务器...
  • token验证失败

    2016-07-20 15:52:00
    token验证失败 公司申请的公众号,刚开始用微信提供的demo配置成功了后来要部署到框架里面,可进行配置的时候提示token验证失败。于是我觉得问题还是出在我们代码这边但调试的时候发现代码已经可以...
  • jsp里的源码: String token = Weixin.TOKEN;...系统算出的签名和微信返回的签名是一致的,然后就一直token验证失败。求各位大神们看看哪里出了问题。 是不是我echstr原样返回的不对。该怎么返回才正确。
  • 这里附上配置表单,我傻逼一开始不知道什么意思,以为填写了url 和令牌 就可以成功 谁知道一直出现 ,token验证失败的信息。后来看了下文档,如下要返回参数给微信,返回成功则成为开发者;所以我准备的一下代码...

空空如也

1 2 3 4 5 ... 20
收藏数 138,922
精华内容 55,568
关键字:

token验证