jwt实现token模拟登陆

Java实现JWT令牌生成与验证
package cn.e4j.core.interceptor;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class JwtTokenUtil {

    private static final String SECRET_KEY = "defaultSecret"; // 替换为你的密钥

    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }

    public static boolean isTokenExpired(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return false; // Token is valid and not expired
        } catch (Exception e) {
            return true; // Token is expired or invalid
        }
    }

    public static void main(String[] args) throws Exception {

        JwtTokenUtil.generateToken("admin");
        // 生成 JWT 令牌
       /* String token = JwtTokenUtil.generateToken("admin");

        // 模拟请求
        URL url = new URL("http://localhost:8080");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setRequestProperty("Authorization", "Bearer " + token);

        // 读取响应
        int responseCode = connection.getResponseCode();
        System.out.println("Response Code: " + responseCode);

        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuilder response = new StringBuilder();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        System.out.println("Response: " + response.toString());*/
    }
}
### JWT实现登录鉴权的原理 JWT(JSON Web Token)是一种基于JSON的开放标准(RFC 7519),用于在网络应用环境中传递声明(claims)。JWT的核心思想是通过数字签名确保数据的完整性和真实性,同时允许无状态的身份验证机制。在登录鉴权的场景中,JWT的工作流程如下: 1. **用户登录**:用户向服务器发送登录请求,包含用户名和密码。 2. **生成Token**:服务器验证用户凭证后,使用私钥生成一个JWT Token。该Token通常包含三部分:头信息(header)、消息体(payload)和签名(signature)[^4]。 3. **返回Token**:服务器将生成的JWT Token返回给客户端。 4. **携带Token**:客户端在后续请求中,将Token放在请求头中(通常是`Authorization`头),例如:`Bearer <token>`[^2]。 5. **验证Token**:服务器接收到请求后,验证Token的签名是否有效,并检查Token是否过期。如果验证通过,则允许访问受保护的资源;否则,拒绝请求[^1]。 ### JWT的结构 JWT由三部分组成,分别是: - **Header**:包含Token的类型(通常是JWT)和签名算法(如HMAC SHA256或RSA)。 - **Payload**:包含声明(claims),声明分为注册声明、公共声明和私有声明。常见的注册声明包括`iss`(签发者)、`exp`(过期时间)、`sub`(主题)等。 - **Signature**:对Header和Payload的签名,确保Token的完整性[^4]。 ### 代码示例 #### 后端生成JWT Token(Python Flask) 以下是一个使用Flask和`Flask-JWT-Extended`库生成JWT Token的示例: ```python from flask import Flask, jsonify, request from flask_jwt_extended import ( JWTManager, create_access_token, jwt_required, get_jwt_identity ) app = Flask(__name__) # 配置JWT的密钥 app.config['JWT_SECRET_KEY'] = 'super-secret-key' jwt = JWTManager(app) # 模拟用户数据库 users = { "admin": "password123" } @app.route('/login', methods=['POST']) def login(): username = request.json.get('username') password = request.json.get('password') if username in users and users[username] == password: access_token = create_access_token(identity=username) return jsonify(access_token=access_token), 200 else: return jsonify({"msg": "Bad username or password"}), 401 @app.route('/protected', methods=['GET']) @jwt_required() def protected(): current_user = get_jwt_identity() return jsonify(logged_in_as=current_user), 200 if __name__ == '__main__': app.run(debug=True) ``` #### 前端携带JWT TokenJavaScript Fetch API) 前端在获取到JWT Token后,可以在后续请求中通过`Authorization`头携带Token: ```javascript // 登录并获取Token fetch('http://localhost:5000/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: 'admin', password: 'password123' }) }) .then(response => response.json()) .then(data => { const token = data.access_token; // 使用Token访问受保护的接口 fetch('http://localhost:5000/protected', { method: 'GET', headers: { 'Authorization': `Bearer ${token}` } }) .then(response => response.json()) .then(protectedData => { console.log(protectedData); }); }); ``` #### Java解析JWT Token(使用`jjwt`库) 在Java中,可以使用`jjwt`库来解析和验证JWT Token: ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.Claims; public class JwtUtil { private static final String SECRET = "your-secret-key"; public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); } public static String parseToken(String token) { return Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(token) .getBody() .getSubject(); } public static void main(String[] args) { String token = generateToken("admin"); System.out.println("Generated Token: " + token); String username = parseToken(token); System.out.println("Parsed Username: " + username); } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值