湛江网站建设方案推广,奇葩网站100个,利用博客做网站排名,网站seo关键词排名推广一步步教你实现JWT认证和授权 前言一、引入二、Token认证与JWT认证的关系三、什么是JWT认证#xff1f;四、JWT的组成1、头部#xff08;Header#xff09;2、载荷#xff08;Payload#xff09;3、签名#xff08;Signature#xff09; 五、JWT认证的工作流程六、代码举… 一步步教你实现JWT认证和授权 前言一、引入二、Token认证与JWT认证的关系三、什么是JWT认证四、JWT的组成1、头部Header2、载荷Payload3、签名Signature 五、JWT认证的工作流程六、代码举例七、总结 前言
本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识有兴趣的小伙伴可以关注博主 也许一个人独行可以走的很快但是一群人结伴而行才能走的更远 一、引入 我们上篇文章中为大家介绍了token令牌认证的认证机制而在本文我们要为大家介绍JWT认证JSON Web Token authentication。 二、Token认证与JWT认证的关系 大家现在是否感觉压力山大不仅学习了Cookie认证Session认证还学习了一个Token认证现在又冒出来了个JWT认证别担心这个JWT认证并不是什么新颖的认证方式本质上它就是一种基于Token的身份验证机制Token认证是一种通用的身份验证方法我们可以使用不同类型的Token去进行身份验证而JWT就是其中的一种Token类型。 在这里我们要区分好上篇文章为大家介绍的Token认证机制是一个广泛的概念是一种概称它涵盖了使用不同类型的Token进行身份验证的方法。除了JWT之外还有其他类型的Token例如基于时间的令牌Time-based Tokens和访问令牌Access Tokens。这些Token可以使用不同的格式和验证机制但它们都是用于验证用户身份并授权访问受保护资源的凭据。 所以搞清了关系之后接下来进入正文 三、什么是JWT认证 JWT认证JSON Web Token authentication是一种基于Token的身份验证机制。它使用JSON Web TokenJWT作为身份验证的凭据并通过对JWT进行验证来确认用户的身份和授权用户访问受保护的资源。 四、JWT的组成 上文已经提及JWT只是众多token类型里的其中一种类型所以关于它的组成就是我们要学习的重点。 JWT是一种开放标准RFC 7519定义了一种紧凑且自包含的方式来表示和传输信息。它由三个部分组成 头部Header包含描述JWT的元数据和算法信息例如使用的签名算法。载荷Payload包含JWT所声明的数据可以包含用户身份信息、授权信息和其他自定义数据。签名Signature使用密钥和指定的签名算法对头部和载荷进行签名以实现数据完整性和验证。 1、头部Header 头部通常包含两个部分令牌类型typ和签名算法alg。这些信息用于描述JWT的类型和使用的加密算法。例如一个典型的头部可以是以下JSON格式 {alg: HS256,typ: JWT
}在上面的例子中alg表示签名算法为HMAC SHA-256HS256typ表示令牌类型为JWT。 2、载荷Payload 载荷是JWT的主体部分包含要传输的数据。载荷可以包含一些预定义的声明Claims也可以包含自定义的声明。预定义的声明分为三类 注册声明Registered Claims这些声明是一组预定义的标准声明包括iss签发者、sub主题、aud受众、exp过期时间、nbf生效时间和iat发布时间等。公共声明Public Claims这些声明是自定义的声明供使用者自由定义但建议遵循一定的命名规范避免冲突。 私有声明Private Claims这些声明也是自定义的声明但为了避免冲突建议将其命名为命名空间形式例如company_name。 以下是一个示例载荷的JSON格式 {sub: user123,name: John Doe,iat: 1629012345
}在上面的例子中sub表示主题为user123的用户“name表示用户姓名为John Doe”iat表示JWT的发布时间为1629012345UNIX时间戳。 3、签名Signature 签名是JWT的第三部分用于验证JWT的完整性和真实性。签名通常使用头部和载荷中的数据以及一个密钥来生成。生成签名的过程是对头部和载荷进行编码然后使用指定的签名算法如HMAC、RSA等进行加密。最终生成的签名字符串将附加在JWT的末尾。 签名的示例 HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload),secretKey
)在上面的例子中header表示头部的Base64编码字符串payload表示载荷的Base64编码字符串secretKey表示用于生成签名的密钥。 通过将这三个部分使用句点.连接起来即可形成一个完整的JWT base64UrlEncode(header) .
base64UrlEncode(payload) .
signature最终的JWT可以作为身份验证凭据在客户端和服务器之间进行传输并通过验证签名来验证JWT的真实性和完整性。 当然很多人会疑惑这个token的安全性,JWT是由三部分组成的以点分开header、payload和signature header部分声明需要用什么算法来生成签名 payload部分是一些特定的数据比如有效期之类 接着header和payload两部分的内容会经由BASE64编码注意是编码不是加密也就是很容易可以解码虽然JWT不保存在服务器这里但是服务器需要保存一段密码这段密码要结合两段编码进行算法运算最终得到签名信息。这里使用的算法就是刚刚header声明的算法。签名的信息也就是signature部分了这样一个完整的最大的JWT就可以发送给客户端了。如果我们修改三个部分其中一个字符整个最大JWT都会出错三个部分是相关联的因此JWT有一定的安全性。 token是服务器加密的用户信息服务器将token发给浏览器浏览器用cookie或storage保存cookie。然后浏览器每次发送请求就带上token服务器将其解密并确认用户登录。 五、JWT认证的工作流程 JWT认证的工作流程一般涉及以下步骤 用户身份验证 用户在进行身份验证时通常会提供标识自己身份的凭据例如用户名和密码。服务器需要验证这些凭据的有效性通常是通过与存储在数据库中的用户凭据进行比对。 JWT的生成 如果用户通过身份验证服务器将生成一个JWT作为身份验证的凭据。生成JWT的过程包括以下步骤 创建一个包含头部和载荷的JSON对象。对头部和载荷进行Base64编码生成JWT的第一部分。使用服务器上的密钥和指定的签名算法对编码后的头部和载荷进行签名生成签名。将签名与编码后的头部和载荷连接起来生成完整的JWT。 JWT的发送和存储 服务器将生成的JWT发送给客户端通常是通过将JWT作为响应的一部分例如在HTTP响应的头部或作为响应的一部分返回给客户端。客户端通常会将JWT存储在本地例如在浏览器的本地存储或内存中。 后续请求的身份验证 在后续的请求中客户端将JWT作为身份验证凭据发送给服务器。通常是通过将JWT放置在请求的头部例如Authorization头部中或作为请求参数的一部分例如查询字符串或表单数据发送给服务器。 JWT的验证和解析 服务器在接收到请求后需要验证JWT的有效性和完整性以及解析其中的信息。验证和解析的过程包括以下步骤 从请求中获取JWT。检查JWT的签名是否有效以确保JWT未被篡改。解码JWT的头部和载荷获取其中的信息。 用户授权和访问受保护资源 服务器通过验证JWT的有效性并获取到其中的用户身份信息确认用户的身份。基于用户的身份信息服务器可以进行授权判断决定用户是否有权访问请求的资源。如果用户被授权访问资源服务器将返回相应的数据或执行相应的操作。 整个JWT认证的工作流程是基于无状态的服务器无需在后端存储会话状态每个请求都是独立的。JWT作为身份验证凭据提供了一种简单、安全和可扩展的方式来验证用户身份并授权用户访问受保护的资源。 六、代码举例 以下是一个使用Java JWT库jjwt的示例代码 import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import java.util.Date;public class JWTExample {private static final String SECRET_KEY yourSecretKey;private static final long EXPIRATION_TIME 86400000; // 24小时public static void main(String[] args) {// 创建JWTString token createJWT(user123);// 验证和解析JWTif (validateJWT(token)) {String username parseJWT(token);System.out.println(解析到的用户名 username);} else {System.out.println(JWT验证失败);}}public static String createJWT(String username) {Date now new Date();Date expiration new Date(now.getTime() EXPIRATION_TIME);String token Jwts.builder().setSubject(username).setIssuedAt(now).setExpiration(expiration).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();return token;}public static boolean validateJWT(String token) {try {Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);return true;} catch (Exception e) {return false;}}public static String parseJWT(String token) {JwsClaims claims Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);return claims.getBody().getSubject();}
}在上述示例中createJWT方法用于创建JWT其中设置了用户名、签发时间、过期时间并使用HS256算法进行签名。validateJWT方法用于验证JWT的合法性通过解析和校验JWT的签名来进行判断。parseJWT方法用于解析JWT并提取其中的用户名信息。 请注意上述代码中的SECRET_KEY是用于签名和验证JWT的密钥请确保将其替换为实际的密钥并妥善保管。另外示例中设置的过期时间为24小时86400000毫秒我们可以根据自己的需求进行调整。 使用这个示例代码可以创建一个包含用户名信息的JWT并验证和解析JWT以获取其中的用户名。 七、总结 大家不要把三者想的太复杂 session是诞生并保存在服务器那边的由服务器主导一切。cookie这是一种数据载体把session放在cookie中送到客户端那边cookie跟随HTTP的每个请求发送出去。token是诞生在服务器但保存在浏览器这边的由客户端主导一切可以放在cookie或者storage里面持有token就像持有令牌一样可以允许访问服务器。服务器验证是前提。cookie保存在客户端服务器不加密不保存session保存在客户端服务器要加密并保存token保存在客户端服务器要加密不保存。Session是一种服务器端的机制用于存储和管理用户的身份和状态信息而Cookie是用于在客户端存储Session ID等数据的机制。Token是一种轻量级的身份验证和授权机制可以作为无状态的凭据进行传输。Cookie和Token都可以用于在客户端和服务器之间传递身份信息和状态信息实现身份验证和状态管理的功能。