该网站已经工信部认证联盟认证为可信网站,请放心访问
我们的口号:番禺网站建设用最便宜的钱,做最好的网站。
网站地图> 了解详情>
网站安全检测
身份证明信息
ICP备案审查
工商登记信息
业务资质许可
网站信用信息

新闻中心

专业专注专心,行业行情行规
分享交流,永无止境,我们愿与您共同进步

JWT token心得与使用实例

发布日期:[2018/11/24]    编辑:pancaofu

本文你能学到什么?


token的组成 

token串的生成流程。 

token在客户端与服务器端的交互流程 

Token的优点和思考 

参考代码:核心代码使用参考,不是全部代码


JWT token的组成


头部(Header),格式如下: 

“typ”: “JWT”, 

“alg”: “HS256” 

由上可知,该token使用HS256加密算法,将头部使用Base64编码可得到如下个格式的字符串:


eyJhbGciOiJIUzI1NiJ9

1

有效载荷(Playload): 

“iss”: “Online JWT Builder”, 

“iat”: 1416797419, 

“exp”: 1448333419, 

……. 

“userid”:10001 

有效载荷中存放了token的签发者(iss)、签发时间(iat)、过期时间(exp)等以及一些我们需要写进token中的信息。有效载荷也使用Base64编码得到如下格式的字符串:


eyJ1c2VyaWQiOjB9

1

签名(Signature): 

将Header和Playload拼接生成一个字符串str=“eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOjB9”,使用HS256算法和我们提供的密钥(secret,服务器自己提供的一个字符串)对str进行加密生成最终的JWT,即我们需要的令牌(token),形如:str.”签名字符串”。


token在服务与客户端的交互流程


1:客户端通过用户名和密码登录 

2:服务器验证用户名和密码,若通过,生成token返回给客户端。 

3:客户端收到token后以后每次请求的时候都带上这个token,相当于一个令牌,表示我有权限访问了 

4:服务器接收(通常在拦截器中实现)到该token,然后验证该token的合法性(为什么能验证下面说)。若该token合法,则通过请求,若token不合法或者过期,返回请求失败。


关于Token的思考


服务如何判断这个token是否合法? 

由上面token的生成可知,token中的签名是由Header和有效载荷通过Base64编码生成再通过加密算法HS256和密钥最终生成签名,这个签名位于JWT的尾部,在服务器端同样对返回过来的JWT的前部分再进行一次签名生成,然后比较这次生成的签名与请求的JWT中的签名是否一致,若一致说明token合法。由于生成签名的密钥是服务器才知道的,所以别人难以伪造。


token中能放敏感信息吗? 

不能,因为有效载荷是经过Base64编码生成的,并不是加密。所以不能存放敏感信息。


Token的优点


(1)相比于session,它无需保存在服务器,不占用服务器内存开销。 

(2)无状态、可拓展性强:比如有3台机器(A、B、C)组成服务器集群,若session存在机器A上,session只能保存在其中一台服务器,此时你便不能访问机器B、C,因为B、C上没有存放该Session,而使用token就能够验证用户请求合法性,并且我再加几台机器也没事,所以可拓展性好就是这个意思。 

(3)由(2)知,这样做可就支持了跨域访问。


Java实例:JWT token使用


部分代码来自互联网,找不到原作者了。。 

编写JWT(Java Web Token)操作类:JavaWebToken


public class JavaWebToken {


    private static Logger log = LoggerFactory.getLogger(JavaWebToken.class);


    //该方法使用HS256算法和Secret:bankgl生成signKey

    private static Key getKeyInstance() {

        //We will sign our JavaWebToken with our ApiKey secret

        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("bankgl");

        Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

        return signingKey;

    }


    //使用HS256签名算法和生成的signingKey最终的Token,claims中是有效载荷

    public static String createJavaWebToken(Map<String, Object> claims) {

        return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).compact();

    }


    //解析Token,同时也能验证Token,当验证失败返回null

    public static Map<String, Object> parserJavaWebToken(String jwt) {

        try {

            Map<String, Object> jwtClaims =

                    Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody();

            return jwtClaims;

        } catch (Exception e) {

            log.error("json web token verify failed");

            return null;

        }

    }

}


编写登录Conreoller,在服务器端给客户返回token.


public LoginStatusMessage checkUserAndPassword(

    @RequestParam(value="username",required=true) String username,

    @RequestParam(value="password",required=true) String password,User user,HttpServletRequest request) throws Exception{

        User u = new User();

        //登录成功

        if((u = userService.checkUsernameAndPassword(user)) != null){

            Map<String,Object> m = new HashMap<String,Object>();

            m.put("userid", user.getUserid());

            String token = JavaWebToken.createJavaWebToken(m);

            System.out.println(token);

            LoginStatusMessage lsm = new LoginStatusMessage();

            lsm.setUser(u);

            lsm.setToken(token);

            return lsm;

        };

        //登录失败,返回Null

        return null;

    }


在拦截器中对请求中的Token验证(部分代码,表示下意思):


String token = request.getParameter("token");

            if(JavaWebToken.parserJavaWebToken(token) != null){

                //表示token合法

                return true;

            }else{

                //token不合法或者过期

                return false;

            }



返回列表

下一篇:WEB前后端分离开发中的验证与安全问题

  • 2019-03-06 Node.js安装及环境配置之Windows篇...
  • 2018-11-22 网站建设后如何优化URL链接...
  • 2019-02-15 给大家介绍一个好用的前端框架,亲自体验过。...
  • 2019-01-30 域名可以登记经营场所,快看是怎么回事!...
  • 2018-11-22 新网站刚优化的时候进入沙盒期该怎么办...
  • 2018-11-22 什么样的网站建设内容适合现在的搜索引擎和用户...
  • 2018-11-22 还在用传统型网站?你的网站是时候转型了...
  • 2019-02-18 自定义微信小程序标题栏...
  • 2018-11-22 网站建设完成后为什么百度不收录网站...
  • 2019-03-06 Node.js安装及环境配置之Windows篇...
  • 2019-02-18 自定义微信小程序标题栏...
  • 2019-02-15 给大家介绍一个好用的前端框架,亲自体验过。...
  • 2019-01-30 域名可以登记经营场所,快看是怎么回事!...
  • 2018-12-19 【网站建设】公众号拉新的五种姿势...
  • 2018-12-19 【广州网站建设】建设网站用哪种语言比较好?...
  • 2018-11-27 php api接口安全设计 sign...
  • 2018-11-27 PHP做APP接口时,如何保证接口的安全性...
  • 2018-11-27 定制网站设计的流程是什么样的?...
  • 2018-11-27 会给我们提交多少方案供选择,如果方案不满意怎么办?...
  • 或者将本文《JWT token心得与使用实例》
    复制本文《JWT token心得与使用实例》地址给好友: