Example #1
0
    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)