def post(self, request): form = AccessTokenForm.create_from_request(request) if not form.is_valid(): raise ValidationException(request, form) backend = ModelBackend() user = backend.authenticate(request, username=form.cleaned_data['username'], password=form.cleaned_data['password']) if not user: raise UnauthorizedException(request) access_token = JWTFactory(user.pk).access() jti, refresh_token = JWTFactory(user.pk).refresh() redis = Redis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DATABASE) redis.set(f"refresh_token:{jti}", jti) redis.expire(f"refresh_token:{jti}", settings.SECURED_VIEW_JWT_REFRESH_TOKEN_EXPIRATION) return SingleResponse(request, { 'access_token': access_token, 'refresh_token': refresh_token }, status=HTTPStatus.OK)
class SlidingWindowCounter(): def __init__(self, host, port, db, windowInSecond): self.windowInSecond = windowInSecond self.host = host self.port = port self.db = db self.r = Redis(host=self.host, port=self.port, db=self.db) def increment(self, key): currentMs = int(round(time.time() * 1000)) maxScoreMs = currentMs - self.windowInSecond * 1000 self.r.zremrangebyscore(key, 0, maxScoreMs) self.r.zadd(key, {currentMs: currentMs + random.random()}) self.r.expire(key, self.windowInSecond) def getCount(self, key): return self.r.zcard(key)