FastAPI中的token验证

今天我们来讲一下再fastapi中如何进行token的验证,在fastapi中,我们可以通过依赖注入的方式,来对一个接口进行token的验证,来判断在数据库中是否有这个用户,我们需要先申明一个函数用来做token的验证操作:

import jwt
import os
from fastapi import Header
from typing import Optional
from .APIResponse import APIResponse
from fastapi.responses import JSONResponse
from fastapi import status
from jwt.exceptions import InvalidSignatureError, ExpiredSignatureError, DecodeError
key = os.urandom(32)
async def verify_jwt(token: Optional[str] = Header(None)):
    if token is None:
        return JSONResponse(status_code=status.HTTP_405_METHOD_NOT_ALLOWED,
                            content=APIResponse(405, None, "用户未登录").set_api_dict())
    else:
        try:
            res = jwt.decode(token, key, "HS256")
            return res['userID']
        except InvalidSignatureError as e:
            # 无效签名验证
            return JSONResponse(status_code=status.HTTP_403_FORBIDDEN,
                                content=APIResponse(403, None, "无效的用户签名").set_api_dict())
        except ExpiredSignatureError as e:
            # 签名过期验证
            return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED,
                                content=APIResponse(401, None, "用户签名已过期").set_api_dict())
        except DecodeError as e:
            return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED,
                                content=APIResponse(401, None, "错误的签名").set_api_dict())

在这里我们将错误类型进行了导入,其实应该还有一部分其他类型的错误,我这里只是简单使用了一下,然后指定token类型为str,并且导入Header,将从这里获取我们的token,然后并对token解码进行验证,这样,就完成了我们的token验证函数

这里我也将我申明的APIResponse为返回给前端的数据:

import json


class APIResponse:
    def __init__(self, code, data=None, message=None):
        self.code = code
        self.data = data
        self.message = message

    def set_api_dict(self):
        api_dict = {
            "code": self.code,
            "data": self.data,
            "message": self.message
        }
        return api_dict

然后在接口中使用:

from fastapi import  status, Depends
from models.user import User
from fastapi.responses import JSONResponse
from utils.APIResponse import APIResponse
from utils.JWT import jwt_token, verify_jwt
@api.get("/logout", summary="用户注销")
async def user_logout(token: str = Depends(verify_jwt)):
    if type(token) is int:
        res = await User.get(id=token)
        await res.delete()
        return JSONResponse(status_code=status.HTTP_200_OK, content=APIResponse(200, None, "用户注销成功").set_api_dict())
    else:
        return token

在这里我们需要导入Depends,将我们的验证函数进行注入至接口,这样fastapi在前端进行请求的时候会自动运行这个函数verify_jwt,这样就是一个简单的token验证了。

### Spring Boot 中限流与熔断的实现 #### Hystrix 的引入和配置 为了在Spring Boot应用程序中启用Hystrix功能,需要先添加依赖项。对于基于Netflix技术栈的服务熔断,可以在`pom.xml`文件中加入如下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> ``` 之后,在启动类上加上`@EnableCircuitBreaker`或更通用的`@EnableHystrixCircuitBreaker`注解来激活Hystrix支持[^5]。 #### 使用 `@HystrixCommand` 注解定义降级逻辑 通过简单的注解方式即可轻松集成Hystrix命令模式到业务方法里去。下面是一个例子展示了如何利用`@HystrixCommand`来进行服务调用并指定当远程调用失败时执行的方法作为回退方案: ```java @RestController public class HelloController { @Autowired private RestTemplate restTemplate; @GetMapping("/hello") @HystrixCommand(fallbackMethod = "fallbackHello") public String hello() { return this.restTemplate.getForObject("http://SERVICE-B/hello", String.class); } public String fallbackHello(){ return "Fallback Hello"; } } ``` 这段代码片段说明了如果访问`/hello`接口而目标微服务不可达的情况下会返回默认的消息“Fallback Hello”。 #### Resilience4j 替代方案及其优势 除了传统的Hystrix之外,Resilience4j作为一个轻量级库也逐渐成为社区推荐的选择之一。相较于前者而言,后者具有更好的性能表现以及更加灵活易用的特点。要使用Resilience4j,则需调整POM文件中的依赖关系为: ```xml <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-boot2</artifactId> </dependency> <!-- 如果还需要其他模块 --> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-ratelimiter</artifactId> </dependency> ``` 接着可通过属性文件(`application.yml`)设置具体的策略参数,比如超时时间、重试次数等;而对于限流部分则可借助于`RateLimiterConfig`来自定义速率控制规则[^1]。 #### Sentinel 配置样例 针对国内开发者来说,阿里巴巴开源的Sentinel也是一个非常不错的选择。其主要特点是易于部署维护且具备强大的实时监控能力。以下是采用该框架进行简单配置的一个案例: ```yaml spring: cloud: sentinel: transport: dashboard: localhost:8080 # 设置sentinel 控制台地址 datasource: ds1: nacos: server-addr: ${NACOS_ADDR} data-id: ${project.name}-sentinel-rule group-id: DEFAULT_GROUP rule-type: flow ``` 上述YAML片断描述了一个典型的场景——即从Nacos服务器读取动态流量控制规则,并将其应用于当前运行的应用程序实例之中[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值