def create_code( cls, *, data: dict[str, typing.Union[str, int, float, dict, list, bool]] = None, aud: CodeAudiences = CodeAudiences.ACCESS_TOKEN, # Audience iat: datetime.datetime = None, # Issued at datetime exp: datetime.datetime = None, # Expired at datetime nbf: datetime.datetime = None, # Not before datetime iss: str = "", # Issuer ) -> str: if data is None: data = {} now = utc_now() if iat is None: iat = now if exp is None: exp = now + datetime.timedelta(minutes=30) if nbf is None: nbf = now payload = data.copy() payload |= {"iat": iat, "aud": aud, "exp": exp, "nbf": nbf, "iss": iss} return jwt.encode(payload=payload, key=settings.Settings.SECRET_KEY, algorithm="HS512")
def test_utc_now(self): expected_result = datetime.datetime.now(tz=zoneinfo.ZoneInfo("UTC")) datetime_mock = self.create_patch(target="fastapi_mongodb.helpers.datetime.datetime") datetime_mock.now.return_value = expected_result result = utc_now() datetime_mock.now.assert_called_once_with(tz=get_utc_timezone()) self.assertEqual(expected_result, result)
def test_read_code_exception_nbf(self): now = utc_now() code = self.tokens_handler.create_code(nbf=now + datetime.timedelta(seconds=1)) with self.assertRaises( expected_exception=HandlerException) as exception_context: self.tokens_handler.read_code(code=code) self.assertEqual("The token is not valid yet.", str(exception_context.exception))
def test_read_code_exception_exp(self): now = utc_now() code = self.tokens_handler.create_code(exp=now - datetime.timedelta(seconds=1)) with self.assertRaises( expected_exception=HandlerException) as exception_context: self.tokens_handler.read_code(code=code) self.assertEqual("Expired JWT token.", str(exception_context.exception))
def test_create_read_code_custom(self): test_data = self.get_test_data() now = utc_now() custom_claims = self.get_custom_claims() test_data |= custom_claims code = self.tokens_handler.create_code(data=test_data, iat=now, exp=now, nbf=now, aud=CodeAudiences.EMAIL_RESET, **custom_claims) parsed = self.tokens_handler.read_code(code=code, aud=CodeAudiences.EMAIL_RESET, leeway=self.faker.pyint(), convert_to=self.TestModel, **custom_claims) self.assertIsInstance(code, str) self.assertIsInstance(parsed, self.TestModel) # convert_to kwarg self.assertDictEqual( test_data, parsed.dict(include={key for key in test_data.keys()}))