千家信息网

怎么基于JWT实现接口的授权访问

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"怎么基于JWT实现接口的授权访问",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么基于JWT实现接口的授权访问"吧!什么是JWTJWT(
千家信息网最后更新 2026年11月02日怎么基于JWT实现接口的授权访问

本篇内容主要讲解"怎么基于JWT实现接口的授权访问",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么基于JWT实现接口的授权访问"吧!

    什么是JWT

    JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各个系统之间用JSON作为对象安全地传输信息,并且可以保证所传输的信息不会被篡改。

    JWT通常有两种应用场景:

    • 授权。这是最常见的JWT使用场景。一旦用户登录,每个后续请求将包含一个JWT,作为该用户访问资源的令牌。

    • 信息交换。可以利用JWT在各个系统之间安全地传输信息,JWT的特性使得接收方可以验证收到的内容是否被篡改。

    本文讨论第一点,如何利用JWT来实现对API的授权访问。这样就只有经过授权的用户才可以调用API。

    JWT的结构

    JWT由三部分组成,用.分割开。

    Header

    第一部分为Header,通常由两部分组成:令牌的类型,即JWT,以及所使用的加密算法。

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

    Base64加密后,就变成了:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

    Payload

    第二部分为Payload,里面可以放置自定义的信息,以及过期时间、发行人等。

    {  "sub": "1234567890",  "name": "John Doe",  "iat": 1516239022}

    Base64加密后,就变成了:

    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

    Signature

    第三部分为Signature,计算此签名需要四部分信息:

    • Header里的算法信息

    • Header

    • Payload

    • 一个自定义的秘钥

    接受到JWT后,利用相同的信息再计算一次签名,然年与JWT中的签名对比,如果不相同则说明JWT中的内容被篡改。

    解码后的JWT

    将上面三部分都编码后再合在一起就得到了JWT。

    需要注意的是,JWT的内容并不是加密的,只是简单的Base64编码。 也就是说,JWT一旦泄露,里面的信息可以被轻松获取,因此不应该用JWT保存任何敏感信息。

    JWT是怎样工作的

    • 应用程序或客户端向授权服务器请求授权。这里的授权服务器可以是单独的一个应用,也可以和API集成在同一个应用里。

    • 授权服务器向应用程序返回一个JWT。

    • 应用程序将JWT放入到请求里(通常放在HTTP的Authorization头里)

    • 服务端接收到请求后,验证JWT并执行对应逻辑。

    在JAVA里使用JWT

    引入依赖

        io.jsonwebtoken    jjwt

    这里使用了一个叫JJWT(Java JWT)的库。

    JWT Service

    生成JWT
    public String generateToken(String payload) {        return Jwts.builder()                .setSubject(payload)                .setExpiration(new Date(System.currentTimeMillis() + 10000))                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)                .compact();    }
    • 这里设置过期时间为10秒,因此生成的JWT只在10秒内能通过验证。

    • 需要提供一个自定义的秘钥。

    解码JWT
    public String parseToken(String jwt) {        return Jwts.parser()                .setSigningKey(SECRET_KEY)                .parseClaimsJws(jwt)                .getBody()                .getSubject();    }

    解码时会检查JWT的签名,因此需要提供秘钥。

    验证JWT
    public boolean isTokenValid(String jwt) {        try {            parseToken(jwt);        } catch (Throwable e) {            return false;        }        return true;    }

    JWT并没有提供判断JWT是否合法的方法,但是在解码非法JWT时会抛出异常,因此可以通过捕获异常的方式来判断是否合法。

    注册/登录

    @GetMapping("/registration")    public String register(@RequestParam String username, HttpServletResponse response) {        String jwt = jwtService.generateToken(username);        response.setHeader(JWT_HEADER_NAME, jwt);        return String.format("JWT for %s :\n%s", username, jwt);    }
    • 需要为还没有获取到JWT的用户提供一个这样的注册或者登录入口,来获取JWT。

    • 获取到响应里的JWT后,要在后续的请求里包含JWT,这里放在请求的Authorization头里。

    验证JWT

    @Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        HttpServletRequest httpServletRequest = (HttpServletRequest) request;        HttpServletResponse httpServletResponse = (HttpServletResponse) response;        String jwt = httpServletRequest.getHeader(JWT_HEADER_NAME);        if (WHITE_LIST.contains(httpServletRequest.getRequestURI())) {            chain.doFilter(request, response);        } else if (isTokenValid(jwt)) {            updateToken(httpServletResponse, jwt);            chain.doFilter(request, response);        } else {            httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);        }    }private void updateToken(HttpServletResponse httpServletResponse, String jwt) {        String payload = jwtService.parseToken(jwt);        String newToken = jwtService.generateToken(payload);        httpServletResponse.setHeader(JWT_HEADER_NAME, newToken);    }
    • 将验证操作放在Filter里,这样除了登录入口,其它的业务代码将感觉不到JWT的存在。

    • 将登录入口放在WHITE_LIST里,跳过对这些入口的验证。

    • 需要刷新JWT。如果JWT是合法的,那么应该用同样的Payload来生成一个新的JWT,这样新的JWT就会有新的过期时间,用此操作来刷新JWT,以防过期。

    • 如果使用Filter,那么刷新的操作要在调用doFilter()之前,因为调用之后就无法再修改response了。

    API

    private final static String JWT_HEADER_NAME = "Authorization";    @GetMapping("/api")    public String testApi(HttpServletRequest request, HttpServletResponse response) {        String oldJwt = request.getHeader(JWT_HEADER_NAME);        String newJwt = response.getHeader(JWT_HEADER_NAME);        return String.format("Your old JWT is:\n%s \nYour new JWT is:\n%s\n", oldJwt, newJwt);    }

    这时候API就处于JWT的保护下了。API可以完全不用感知到JWT的存在,同时也可以主动获取JWT并解码,以得到JWT里的信息。如上所示。


    到此,相信大家对"怎么基于JWT实现接口的授权访问"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    信息 验证 应用 内容 登录 入口 用户 部分 加密 服务 接口 合法 应用程序 时间 服务器 程序 传输 生成 相同 安全 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技企业 互联网黑科技 深圳市人人互联网科技有限公司 新华互联网科技 广东猪兼强互联网科技有限公司 重生之互联网科技帝国 科技互联网龙头 互联网核心科技是什么 九亚互联网科技 广州凡科互联网科技 互联网 视角下的科技创新 互联网科技大会 互联网科技英文翻译 互联网科技咨询 北京大学互联网科技怎么样 成都互联网科技公司100强 杭州壁岐互联网科技有限公司 哈尔滨屹滨互联网科技有限公司 互联网科技快讯热点 中国科技和美国互联网 广州万易互联网科技有限公司 新华互联网科技校企合作 海南科技产业互联网平台 中国的互联网科技企业的崛起 崇明区互联网教育科技售后服务 玉溪新华互联网科技好不好 为客找房互联网科技公司怎么样 元气玛特互联网科技公司是外包吗 中天科技中国工业互联网 工业互联网科技成果转化
    0