jwt的基本使用

2023-11-01

介绍

JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
优点是在分布式系统中,很好地解决了单点登录问题,很容易解决了session共享的问题。
缺点是无法作废已颁布的令牌/不易应对数据过期。

用途

解决跨域访问的问题

互联网服务离不开用户认证。一般流程是下面这样。

1、用户向服务器发送用户名和密码。

2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

3、服务器向用户返回一个 session_id,写入用户的 Cookie。

4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

这种模式的问题在于,扩展性(SCALING)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 SESSION 数据共享,每台服务器都能够读取 SESSION。

举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?

一种解决方案是 SESSION 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。

另一种方案是服务器索性不保存 SESSION 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。

原理

**JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,用户与服务端通信的时候,都要发回这个 JSON **
对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。
服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

JWT 的数据结构

###jwt数据示例

eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.
eyJyZkV4cCI6IjE1NDU3MDAzMjQyNjAiLCJleHBpcmUiOjE1NDY4OTU1MjQyNjAsImlhdCI6MTU0NTA5NTUyNCwic3ViIjoiYWFhYWJiYmIiLCJpc3MiOiJ6bXF5IiwianRpIjoiMjE2MzkwNWMtNGI3Yi00OWRiLWFiZWMtZDNiNDAzMWMxY2Q2In0.
L0oISUj058InnzbuuN_T-nXt3XouRtu9_CF_i4z-SFw

它是一个很长的字符串,中间用点(.)分隔成三个部分。

JWT 的三个部分依次如下。

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

###header
Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。

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

上面代码中,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。

最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串。

###Payload
Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号

除了官方字段,你还可以在这个部分定义私有字段

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。

这个 JSON 对象也要使用 Base64URL 算法转成字符串。

###Signature
Signature 部分是对前两部分的签名,防止数据篡改。

首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

JWT基本使用

  • 在pom.xml引入java-jwt
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.0</version>
</dependency>
  • 示例
    /** token秘钥*/
    public static final String SECRET = "JKKLJOoasdlfj";
    /** token 过期时间: 10天 */
    public static final int calendarField = Calendar.DATE;
    public static final int calendarInterval = 10;

    /**
     * JWT生成Token
     * JWT构成: header, payload, signature
     * @param user_id
     * 登录成功后用户user_id, 参数user_id不可传空
     */
    public static String createToken(Long user_id) throws Exception {
        Date iatDate = new Date();
        // expire time
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(calendarField, calendarInterval);
        Date expiresDate = nowTime.getTime();

        // header Map
        Map<String, Object> map = new HashMap<>();
        map.put("alg", "HS256");
        map.put("typ", "JWT");

        // build token
        // param backups {iss:Service, aud:APP}
        String token = JWT.create().withHeader(map) // header
                .withClaim("iss", "Service") // payload
                .withClaim("aud", "APP").withClaim("user_id", null == user_id ? null : user_id.toString())
                .withIssuedAt(iatDate) // sign time
                .withExpiresAt(expiresDate) // expire time
                .sign(Algorithm.HMAC256(SECRET)); // signature

        return token;
    }

    /**
     * 解密Token
     * 
     * @param token
     * @return
     * @throws Exception
     */
    public static Map<String, Claim> verifyToken(String token) {
        DecodedJWT jwt = null;
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
            jwt = verifier.verify(token);
        } catch (Exception e) {
            // e.printStackTrace();
            // token 校验失败, 抛出Token验证非法异常
        }
        return jwt.getClaims();
    }

    /**
     * 根据Token获取user_id
     * @param token
     * @return user_id
     */
    public static Long getAppUID(String token) {
        Map<String, Claim> claims = verifyToken(token);
        Claim user_id_claim = claims.get("user_id");
        if (null == user_id_claim || StringUtils.isEmpty(user_id_claim.asString())) {
            // token 校验失败, 抛出Token验证非法异常
        }
        return Long.valueOf(user_id_claim.asString());
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jwt的基本使用 的相关文章

  • 使用 JWT 刷新令牌如何安全?

    据我了解 您可以缩短 JWT 访问令牌的生命周期 这样如果有人可以访问它 它就不会长期工作 但是 我们不会对 JWT 刷新令牌执行相同的操作来增强用户体验 但现在 如果有人可以访问我的 JWT 刷新令牌 这将授予他们访问受保护资源的权限 那
  • 获取用于 Azure Web PubSub Rest API 的 JWT 承载令牌进行身份验证

    我正在开发一个项目 其中我通过 Azure Web PubSub 服务构建一个发布 订阅系统 JavaScript 客户端 订阅者 通过套接字连接 能够接收 Hub 上和 Group 中发布的消息 为此 我遵循了本教程 https lear
  • 如何验证来自不同发行者的 jwt 令牌

    我正在使用可操作的消息 通过 Outlook Web 应用程序 来调用逻辑应用程序 因此我在请求中得到了一个不记名令牌 操作 授权 承载者eyJ0eXAi 调用堆栈 Outlook web app gt Logic App gt my en
  • 我如何在asp.net core 2.2中实现Cookie基础身份验证和jwt?

    我想同时使用基于 cookie 的身份验证和jwt在我的程序中 使用身份验证用户来访问mvc具有登录名和 JWT 的控制器来访问 WebApi 资源 我尝试使用其中两个首先 我的客户端可以使用用户名和密码登录并通过 cookie 进行身份验
  • 获取 rfc7517 格式的 JWKS for Firebase

    我正在使用 Firebase 对我的应用程序中的用户进行身份验证 Firebase 生成一个 JWT 令牌 我需要在我的服务器上对其进行身份验证 我使用 tyk io 来做到这一点 Tyk 支持这些令牌 但要求公钥的数据源位于https w
  • 如何使用 NodeJS 客户端库使用 JWT 访问 Google Directory (Admin SDK)?

    我正在尝试创建一个服务器应用程序 将用户添加 删除到我的域的组中 请注意 它不会与用户进行任何交互 它是服务器到服务器的应用程序 我在 Google API 控制台中注册了我的应用程序 下载了密钥并通过发出将其转换为 pem openssl
  • 混合命名和未命名函数参数

    我有这个功能来验证 JWT 令牌 不是中间件 它说 package main import net http log fmt github com dgrijalva jwt go func ValidateToken w http Res
  • 我们如何在 google puppeteer 的无头 Chrome 中传递身份验证令牌?

    我想在 puppeteer 标头中传递身份验证令牌 JWT 以用于我的应用程序中使用无头 Chrome 的 pdf 视图 我们使用 React 作为我们的前端 UI 使用 puppeteer 我们可以生成 pdf 但是 pdf 的链接我们需
  • 用于 Java 的 JWT(JSON Web Token)库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个使用 Java 和 AngularJS 开发的 Web 应用程序 并选择实现令牌身份验证
  • 收到“错误”:“未知的身份验证策略\“jwt \””

    我正在使用 Express Mongoose Passport 和 JWT 实现授权功能 我可以正常注册用户 我能够验证并生成 JWT 我可以在 JWT 站点上解析它 但由于某种原因 我收到未知的身份验证策略错误消息 我将所有代码块放在 P
  • 如何在Python中使用JWK解码JWT令牌

    我正在开发一个应用程序 其中所有 API 都受 OAuth 保护 我已从客户端收到访问令牌 但无法解码和验证令牌 我有以下格式的 JWK keys kty RSA x5t S256 Some value e Some Value x5t S
  • 从 Google Chat POST 请求验证 JWT

    我有一个 NodeJS 机器人使用 HTTPs 端点连接到 Google Chat 我正在使用快递来接收请求 我需要验证所有请求是否都来自 Google 并且希望使用 Google 随请求发送的不记名令牌来执行此操作 我的问题是我正在努力寻
  • JJWT依赖混乱

    我继承了一个java项目 在POM xml中有这个
  • IssuerSigningKeyResolver 调用异步方法

    我们使用 IssuerSigningKeyResolver 它是 Microsoft IdentityModel Tokens 的一部分 用于令牌验证并接受非异步委托 我们调用一个异步方法 这将导致阻塞调用 因此想知道使用它的正确方法是什么
  • 令牌签名无效错误

    我抛出了这个错误 com auth0 jwt exceptions SignatureVerificationException 使用算法验证时令牌的签名无效 HmacSHA256 private static String SECRET
  • 如何在 PHP 中使用 RS256 签署 X.509 证书?无法获取有效指纹...x5t

    我已经实现了 JWT 令牌生成器库Here https github com F21 jwt blob master JWT JWT php 并且我能够获得 RS256 令牌 有效负载 但我对标题数据有疑问 我需要一个标头值 x5t 该标头
  • 如何计算 OpenID Connect 服务器的指纹?

    创建 OpenID Connect 提供商 例如 AWS 时 我需要指定一个指纹对于连接器 它是什么 我如何获得它 例如 从如何在不使用密钥的情况下将 GitHub 操作与 AWS 部署连接起来 https stackoverflow co
  • 使用 JWT 的 Istio Origin 身份验证不起作用

    我一直在使用 JWT 将身份验证策略应用于我的测试服务 我已关注本指南 https istio io docs tasks security authn policy end user authentication它确实按预期工作了 但是
  • 每个其他请求 JWT 验证都会失败,并显示“idx10503 签名验证失败”。令牌没有孩子'

    所以整个 JWT 签名和验证对我来说还是很新鲜的 我现在有一个 C 应用程序 它通过使用 JWT 保护的 API 请求一些信息 奇怪的是 所有其他请求都失败了 所以第一个请求就像一个魅力 我收到了我期望的信息和回复 JWT 验证成功 我在它
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo

随机推荐

  • 三相同步电机怎么接线图_三相异步电机的正反转原理图解

    来源 网络 异步电动机又称感应电动机 是由气隙旋转磁场与转子绕组感应电流相互作用产生电磁转矩 从而实现机电能量转换为机械能量的一种交流电机 三相异步电机主要用作电动机 拖动各种生产机械 例如 风机 泵 压缩机 机床 轻工及矿山机械 农业生产
  • Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by ser

    导语 Error ER NOT SUPPORTED AUTH MODE Client does not support authentication protocol requested by ser 作者 变优秀的小白 Github 关注
  • C++之纯虚函数与抽象类

    C 之纯虚函数与抽象类 什么是纯虚函数 什么是抽象类 什么是纯虚函数 纯虚函数是将基类中的函数声明为虚函数 0的函数 纯虚函数只能声明 不能定义 因为纯虚函数没有函数体 纯虚函数的写法为 virtual 函数返回类型 函数名 参数列表 0
  • 2020-10-08

    项目场景 最近在学习Spring Cloud Stream 组件 记录一下学习中踩到的坑 问题描述 网上很多资料或者视频是使用的依赖是
  • C++:替换string中的字符

    1 按照位置进行替换 string的成员函数replace可以满足这种需求 其变体有很多种 请参考官方文档 以下列举常用的两种 include
  • Jmeter性能测试——1.设置代理

    Jmeter设置代理 1 添加http代理服务器 2 添加线程组 3 设置要录制的服务器IP地址或者域名 4 在线程组中添加 录制控制器 5 设置代理服务器 HTTP Proxy Server 1 gt 配置端口号 默认为8080 2 gt
  • 《The Tao Of Programming》——编程之道

    这本书居然可以结合老子的 南华经 庄子的 庄子 以及 论文 来谈论编程 编程似乎成为了如此文艺的东西 深不可测 后来作者还写了 编程之禅 计算机寓言 信息时代的启示 如此有逼格的东西 下面摘录几句 有点儿意思 The Silent Void
  • 【Games101 作业6 + 附加题】渲染兔子 BVH SAH 代码

    基础题部分 根据教程PDF 首先需要引用如下函数 在作业5的基础上稍作修改 renderer in Renderer cpp 解说见注释 The main render function This where we iterate over
  • python学习之星号三角形

    描述 读入一个整数N N是奇数 输出由星号字符组成的等边三角形 要求 第1行1个星号 第2行3个星号 第3行5个星号 依次类推 最后一行共N的星号
  • 【送书活动】畅销书《Kali Linux高级渗透测试》更新版速速查收~

    文章目录 每日一句正能量 前言 本书概况 读者对象 赠书活动 目录 每日一句正能量 其实 人生很多东西无所谓最好的 只要你认为值得就是最好 前言 对于企业网络安全建设工作的质量保障 业界普遍遵循PDCA 计划 Plan 实施 Do 检查 C
  • CM金丝雀Canary报错

    CM金丝雀Canary报错 1 HDFS 金丝雀 Canary 测试无法为 tmp cloudera health monitoring canary files 创建父目录 2 Hive Metastore Canary Hive Met
  • python利用pyhive 连接hive

    1 下载需求包 pip install sasl pip install thrift pip install thrift sasl pip install PyHive 2 连接hive 注意端口默认为10000 from pyhive
  • Python 单分配泛函数

    单分配泛函数 通俗一点的说法就是 根据函数传入的第一个参数的数据类型的不同 而执行不同的方法 单分派 根据一个参数的类型 以不同方式执行相同的操作的行为 多分派 可根据多个参数的类型选择专门的函数的行为 泛函数 多个函数绑在一起组合成一个泛
  • 融合注意力机制和Bi-LSTM的旅游评价情感分析模型

    摘要 旅游评价情感分析对了解游客偏好具有重要意义 然而现有的旅游评价情感分析模型较少突出游客情感描述的核心内容 为了更加精确地分析游客评价的情感倾向 提出一种结合词性注意力机制和双向长短期记忆神经网络 Bi directional Long
  • pd.MultiIndex() 报错 TypeError: __new__() got an unexpected keyword argument ‘labels‘

    pd MultiIndex 报错 TypeError new got an unexpected keyword argument labels coefficients list coeff labels lr l1 l2 coeff m
  • angularJS+requireJS实现controller及directive的按需加载

    最近因为项目的比较大 需要加载的js文件较多 为了提高首屏页面的加载速度 需要对js文件进行按需加载 然后网上参考了一些资料 自己也深入研究一番之后 实现了按需加载控制器js文件及指令js文件的效果 思路如下 1 借助ui router里面
  • 删除服务器上的日志文件,服务器删除文件日志

    服务器删除文件日志 内容精选 换一换 Manager的审计日志默认保存在数据库中 如果长期保留可能引起数据目录的磁盘空间不足问题 管理员如果需要将审计日志保存到其他归档服务器 可以在FusionInsight Manager设置转储参数及时
  • 脑电EEG的几种蒙太奇

    EEG设备电极使用的几种蒙太奇 顺序蒙太奇 Sequential Montage 每个通道测量的是两个电极之间的差分电压 即差分输入 参考蒙太奇 Referential Montage 每个通道测量的是一个电极与一个指定参考电极之间的电压差
  • JSP out.write()方法具有什么功能呢?

    转自 JSP out write 方法具有什么功能呢 下文讲述out对象中write 方法的功能简介说明 如下所示 out write 方法的功能 用于输出字符串 注意事项 out write 方法只能输出字符 当放入的信息是数字时 会转换
  • jwt的基本使用

    文章目录 介绍 用途 解决跨域访问的问题 原理 JWT 的数据结构 JWT基本使用 介绍 JWT是json web token缩写 它将用户信息加密到token里 服务器不保存任何用户信息 服务器通过使用保存的密钥验证token的正确性 只