最近在网上和朋友聊天,发现他在数据接口中校验登录状态用的还是session,在我及时劝说和科普之后,他最终决定改用JWT,那么接下来我们就聊一聊数据接口应该怎么管理登录状态以及什么是JWT

JWT官网访问地址https://jwt.io/introduction/

前后端混合开发的场景

前后端混合开发的时候,用户登录状态的是通过session来实现的,原理很简单:用户登录后,服务端将登录用户信息存储到服务器上的指定位置,并生成对应的session id存储到浏览器的cookie中。需要校验的时候先读取cookie中的session id,找到服务器中对应的存储内容,完成校验。
大家可以明显的感知到,这个机制是建立在cookie基础上的,cookie又依赖于浏览器,而且有域名限制。是不适合app、小程序、以及前后端时数据接口采用其他域名等情况的,那么app、小程序要怎么做呢,接下来我会为大家讲解

App与小程序前后端分离的场景

app、小程序、前后端分离时的数据接口一般采用token来做登录信息校验。原理是用户登录后,服务端生成对应用户的一个token(一般都是唯一的指定位数的字符串)后返回,前端拿到token后保存,在需要校验用户登录的接口请求中加入token(可以是get、post参数的形式),服务端拿到token校验真实性、有效性等信息后完成登录校验。一般为了防止盗用,还会设置一套签名校验的过程。

其实token和session的原理是差不多的,都是服务端将对应用户的一个key【sessionId,token】交给前端,前端通过token请求服务端,服务端拿到token再去验证合法有效性,之后反查用户,获取用户登录信息。

那么针对上述2中验证机制,一般我们的app前后端分离,或者接入第三方系统的时候往往会使用到,例如微信,微博,保利威视等接口都是通过这张方式去验证登录状态的。当然这种方式也是有缺点的,下面我们来聊一聊上述方式的不足之处:

1、服务端必须保存token,以及有效期,校验的时候必须要有数据读取的过程;
2、校验签名的时候一般需要一个secret做为加签字段,前端必须也要同时保存这个secret,这样显然不适合代码会暴露的网页前端。

下面我们来聊一聊JWT

什么是JWT

JWT是JSON Web Token的简称,有官网详细介绍,大家可以看一看,这里只是简单描述一下。
JWT其实就是一种特殊的token,原理和使用方法自然和token一样。
JWT是由三部分组成的字符串,结构是:头部+主体内容(官方称之为Payload【载荷】)+签名,三部分用“.”连接。头部和主体内容都是json格式的字符串再经过base64编码,为了方便放在get请求中,还需要把类似“=”、“/”等特殊字符替换掉。

头部内容是固定的,原始json就是下面这样{"alg": "HS256","typ": "JWT"}
中间的主体内容Payload,原始json一般是类似下面这样的{"userName": "alipeng","expTime": "2020-01-06 05:00:18"}

主体内容一个是当前登录的用户,可以是用户名称,用户的唯一id;还有一个就是过期时间expTime。当然还可以加入一些其他不私密的和系统相关的初始化信息,注意,不要在JWT的payload或header中放置敏感信息,除非它们是加密的;

下面我来聊聊签名与认证流程

,那么为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。

例如:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

签名的主要作用是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方,看下面官网给出的一张图你就明白了:

签名解析

下面是一张官网的认证图:

JWT认证流程

服务端拿到JWT之后可以在不读取数据的情况下,仅通过解码这部分信息就可以完成获取登录用户以及判断是否过期等工作,这一点就优于我们上述讲解的session的方式;

最后的签名一般是把头部、主体内容再加上secret拼接成字符串再加密,这一步在用户登录生成JWT的时候就完成了。服务端拿到JWT之后只需要把前两部分加上secret再计算一次签名加以比对就可以完成校验签名,前端不需要同时保存secret,这样也提高了安全性!

@Test   public void gen1() throws IOException {        String token ="";        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        //日期转字符串            Calendar calendar = Calendar.getInstance();            calendar.add(Calendar.SECOND,30 ); //特定时间的年后            Date date = calendar.getTime();        try {           Algorithm algorithm = Algorithm.HMAC256("mysecrite");            token = JWT.create()                   .withIssuer("alipeng")                    .withSubject("xiaoming")                    .withClaim("name", 123)                    .withArrayClaim("array", new Integer[]{1, 2, 3})                    .withExpiresAt(date)                   .sign(algorithm);           System.out.println("loglogagel:"+token);       } catch (UnsupportedEncodingException exception){           //UTF-8 encoding not supported       } catch (JWTCreationException exception){           //Invalid Signing configuration / Couldn't convert Claims.       }    }

最后再聊聊JWT的一些缺点

目前想到以下几点:
1、安全性:签名包含在token中,一旦token整体被盗用,将没有办法区分;

2、过期时间放在token中而不是服务端保存处理,一旦token生成并签发出去,将无法灵活的控制有效期;

当然如果您有好的意见也可以在评论区讨论,我们一起共同学习,互相成长!

校验json格式_接口的登录状态校验以及JWT相关推荐

  1. 校验json格式_不来学一下SpringBoot统一参数校验?

    微服务架构之春招总结:SpringCloud.Docker.Dubbo与SpringBoot 一个SpringBoot问题就干趴下了?我却凭着这份PDF文档吊打面试官. 金三银四第一天,啃透这些Spr ...

  2. 校验json格式_格式化展示,校验错误,编辑JSON,这几个JSON工具一定不能错过

    今天给大家介绍几个常用JSON的工具,基本上能满足你工作中对JSON的所有需求 google插件 JSONView 安装好插件后,格式化接口返回的JSON,还能展开节点和关闭节点,超级方便 格式化本地 ...

  3. Python 使用Schema 实现接口或方法的JSON格式参数的高效、优雅校验

    我们在实际开发过程中,在开发对外开放接口或者公共模块方法,通常会对入参进行校验,当入参为JSON (Dict)类型数据时,可能需要写几十行代码来校验其数据格式是否符合正确,使得代码冗余度高,可读性差. ...

  4. Springboot自定义注解实现用户登录状态校验(一)

    Springboot自定义注解实现用户登录状态校验(一) 拦截器方式 定义注解类 import java.lang.annotation.*;/*** @author:小飞猪* @date:2020/ ...

  5. 数据接口的登录态校验以及JWT

    混合开发的时候是怎么做的 前后端混合开发的时候,用户登录状态的管理一般都是通过session来实现的,原理很简单:用户登录后,服务端将登录用户信息存储到服务器上的特定位置,并生成对应的session ...

  6. java 校验json格式

    /**  * 用于校验一个字符串是否是合法的JSON格式  *   */ import java.text.CharacterIterator; import java.text.StringChar ...

  7. java怎么验证格式_java如何校验json格式?

    package com.pbsage.ems.util; /** * 用于校验一个字符串是否是合法的JSON格式 * */ import java.text.CharacterIterator; im ...

  8. 包含对象的json格式_如何把JSON数据格式转换为Python的类对象?

    JOSN字符串转换为自定义类实例对象 有时候我们有这种需求就是把一个JSON字符串转换为一个具体的Python类的实例,比如你接收到这样一个JSON字符串如下: {"Name": ...

  9. [转载] 包含对象的json格式_如何把JSON数据格式转换为Python的类对象?

    参考链接: python json 12: numpy转换为json数据 JOSN字符串转换为自定义类实例对象 有时候我们有这种需求就是把一个JSON字符串转换为一个具体的Python类的实例,比如你 ...

  10. 调用python脚本并传递参数json格式_使用 Python 处理 JSON 格式的数据

    如果你不希望从头开始创造一种数据格式来存放数据,JSON 是一个很好的选择.如果你对 Python 有所了解,就更加事半功倍了.下面就来介绍一下如何使用 Python 处理 JSON 数据. JSON ...

最新文章

  1. 教表弟用Python写了个“飞机大战”游戏!表弟:可以拜你为师吗?
  2. Session在类库中的使用
  3. 充电提示音_iPhone如何自定义充电提示音,图文教程
  4. 程序员和女教师相亲,晒出每月教师公积金,大家惊呼: 比我工资都高
  5. 软件设计师21-计算机体系结构
  6. windows phone越狱、安装xap相关问题
  7. F2FS文件系统论文解读
  8. C++实现【启发式搜索】算法
  9. react 报错Assign arrow function to a variable before exporting as module default
  10. 如何打开管理员命令提示符窗口?
  11. 最新最全论文合集——纵向联邦学习
  12. 微信打不开文件怎么办
  13. 为什么在CAD图纸中插入外部参照后会出现多余图形?
  14. word里双横线怎么打_如何在word中画线 怎么在word中输入横线[图文]
  15. 记一次hadoop namenode 启动失败问题及解决过程(启动几秒钟后又挂了)
  16. exp与expdp区别
  17. MyBatis从入门到精通(十):使用association标签实现嵌套查询
  18. 2.4亿单身人口新浪潮,小红书品牌3步抓住流量风口
  19. 虚拟时钟(Virtual clock)
  20. OSChina 周五乱弹 ——程序员的友谊小船是如何说翻就翻的

热门文章

  1. RHCE 第三讲 文件系统
  2. Revit二次开发之ISelectionFilter 接口的用法
  3. 实现MySQL允许远程连接
  4. 21.卷1(套接字联网API)---多播
  5. 22.实例 --- nginx 虚拟主机
  6. 134. PHP 工具
  7. 19. Window focus() 方法
  8. 文本不换行省略—input属性
  9. js引用类型和基本类型、隐式类型转换以及强制类型转换面试题
  10. 使用角色管理工具 安装或配置microsoft.net framework 3.5 sp1