JWT案例

为什么要使用JWT?

先来看看-传统的Session认证
在这里插入图片描述

基于JWT认证

在这里插入图片描述
在这里插入图片描述

简单案例

/**
 * @program: JWT
 * @author: Mr-Jies
 * @create: 2020-08-10 12:28
 **/

public class JwtUtils {

    private static String  sign = "$#g^SK0)(-#%";

    /**
     * 获取token
     * @param map
     * @return
     */
    public static String getToken(Map<String,String> map){
        //时间
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.HOUR_OF_DAY,5);

        JWTCreator.Builder builder = JWT.create();

        //payload
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });

        String token = builder.withExpiresAt(instance.getTime())
                .sign(Algorithm.HMAC256(JwtUtils.sign));

        return token;
    }

    /**
     * 验证token
     * @param token
     * @return
     */
    public static DecodedJWT verify(String token){
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(sign)).build().verify(token);
        return verify;
    }
}

生成token 注意要有3个部分

     String token = JWT.create()
             .withHeader(new HashMap<String, Object>())//heard
             .withClaim("userName", "jies")//payload
             .withClaim("age", 20)
             .withExpiresAt(instance.getTime())//设置过期时间
             .sign(Algorithm.HMAC256("*&@#$k$k"));//sign

整合SpringBoot

用到了过滤器

  • 导包
<dependency>
	<groupId>com.auth0</groupId>
	<artifactId>java-jwt</artifactId>
	<version>3.10.3</version>
</dependency>
  • 写配置文件

在这里插入图片描述

  • 拦截器
/**
 * @program: JWT
 * @author: Mr-Jies
 * @create: 2020-08-10 13:40
 **/

public class JwtInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HashMap<String, Object> map = new HashMap<>();
        //获取请求头
        String token = request.getHeader("token");
        try {
            JwtUtils.verify(token);
            map.put("state",true);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msg",e.getMessage());
        }
        map.put("state",false);
        //转化为json输出
        String s = new ObjectMapper().writeValueAsString(map);
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().println(s);
        return false;
    }
}
  • configration中引入拦截器
/**
 * @program: JWT
 * @author: Mr-Jies
 * @create: 2020-08-10 13:48
 **/

@Configuration
public class JwtInterceptorConfig  implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new JwtInterceptor())
                .addPathPatterns("/**")//拦截
                .excludePathPatterns("/user/login");//放行
    }
}

  • 测试
    在这里插入图片描述
    在这里插入图片描述

源码地址

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个基于 Django 和 Django REST framework 的 JWT 认证的示例。首先需要安装 `djangorestframework-simplejwt` 包。 安装命令: ``` pip install djangorestframework-simplejwt ``` 安装完成后,在 `settings.py` 中添加以下配置: ```python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], } ``` 接下来,创建一个获取 JWT Token 的视图: ```python from rest_framework_simplejwt.views import TokenObtainPairView class ObtainTokenPairView(TokenObtainPairView): serializer_class = MyTokenObtainPairSerializer ``` 这里我们自定义了一个 `MyTokenObtainPairSerializer`,用于在 JWT Token 中添加一些自定义的信息。该类继承自 `TokenObtainPairSerializer`。 ```python from rest_framework_simplejwt.serializers import TokenObtainPairSerializer class MyTokenObtainPairSerializer(TokenObtainPairSerializer): @classmethod def get_token(cls, user): token = super().get_token(user) # Add custom claims token['username'] = user.username token['email'] = user.email return token ``` 在 `urls.py` 中添加路由: ```python from django.urls import path from .views import ObtainTokenPairView urlpatterns = [ path('api/token/', ObtainTokenPairView.as_view(), name='token_obtain_pair'), ] ``` 现在,我们就可以通过访问 `/api/token/` 接口来获取 JWT Token 了。该接口接收 `username` 和 `password` 两个参数。 接收到 Token 后,我们可以在请求头中添加 `Authorization` 字段,将 Token 作为值传递给服务端。服务端会通过 JWT 认证,根据 Token 中的信息来识别用户身份。例如: ``` Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSIsImV4cCI6MTYzNzQ1MDE0OCwianRpIjoiNzRkNGI5MDItMzYzZS00MGYzLWJjMDQtMjQxZTJlNTFkZDZiIn0.64cJZuVzRq_V3f3cddtb3K4JjjxZ1a3sPvzv8R0fP8g ``` 服务端可以通过如下代码读取 Token 中的信息: ```python from rest_framework_simplejwt.authentication import JWTAuthentication class MyView(APIView): authentication_classes = [JWTAuthentication] def get(self, request): user = request.user # access user info from user variable ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值