Skip to content

Commit a8818a6

Browse files
committed
tests two factor
1 parent b0b792e commit a8818a6

21 files changed

+475
-63
lines changed

docker/Dockerfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# set common builds arguments
33
##############################
44
# constants args
5-
ARG DEFAULT_IMAGE_NAME=fastapi-2fa
5+
ARG DEFAULT_IMAGE_NAME=fastapi_2fa
66
ARG DEFAULT_POETRY_VERSION=1.2.1
77

88
##############################
@@ -76,5 +76,7 @@ WORKDIR /${IMAGE_NAME}
7676
COPY . ./
7777

7878
RUN chmod +x /${IMAGE_NAME}/scripts/entrypoint.sh
79+
RUN chmod +x /${IMAGE_NAME}/scripts/start_celery_worker.sh
80+
RUN chmod +x /${IMAGE_NAME}/scripts/start_celery_flower.sh
7981

8082
ENTRYPOINT ["sh", "scripts/entrypoint.sh"]

docker/docker-compose.yaml

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,78 +2,94 @@ version: '3.7'
22

33
services:
44
## WEB APP
5-
5+
web:
6+
build:
7+
context: ..
8+
dockerfile: ./docker/Dockerfile
9+
image: fastapi_2fa
10+
container_name: fastapi_2fa
11+
entrypoint: ./scripts/entrypoint.sh
12+
# stdin_open: true
13+
# tty: true
14+
ports:
15+
- "5555:5555"
16+
env_file:
17+
- ../env/.env
18+
depends_on:
19+
- db
20+
- redis
21+
- rabbitmq
22+
- celery_worker
623

724
## POSTGRESQL
825
db:
926
image: postgres
10-
container_name: fastapi-2fa-db
27+
container_name: fastapi_2fa-db
1128
restart: always
12-
volumes:
13-
- ./data/pgdata:/var/lib/postgresql/my_data
29+
# volumes:
30+
# - ./data/pgdata:/var/lib/postgresql/my_data
1431
env_file:
1532
- ../env/.env
16-
environment:
17-
- SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@fastapi-2fa-db:5432/postgres
18-
- CELERY_BROKER_URL=amqp://admin:admin@fastapi-2fa-rabbitmq:5672/
19-
- result_backend=redis://fastapi-2fa-cache:6379/0
20-
33+
# environment:
34+
# - SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@fastapi_2fa-db:5432/postgres
35+
# - CELERY_BROKER_URL=amqp://admin:admin@fastapi_2fa-rabbitmq:5672/
36+
# - result_backend=redis://fastapi_2fa-cache:6379/0
2137
ports:
2238
- "5454:5432"
2339

2440
## REDIS
2541
redis:
2642
image: redis:alpine
27-
container_name: fastapi-2fa-cache
43+
container_name: fastapi_2fa-cache
2844
restart: always
2945
env_file:
3046
- ../env/.env
31-
environment:
32-
- SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@fastapi-2fa-db:5432/postgres
33-
- CELERY_BROKER_URL=amqp://admin:admin@fastapi-2fa-rabbitmq:5672/
34-
- result_backend=redis://fastapi-2fa-cache:6379/0
47+
# environment:
48+
# - SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@fastapi_2fa-db:5432/postgres
49+
# - CELERY_BROKER_URL=amqp://admin:admin@fastapi_2fa-rabbitmq:5672/
50+
# - result_backend=redis://fastapi_2fa-cache:6379/0
3551
ports:
3652
- "6389:6379"
3753

3854
rabbitmq:
39-
container_name: fastapi-2fa-rabbitmq
55+
container_name: fastapi_2fa-rabbitmq
4056
image: rabbitmq:3-management
4157
env_file:
4258
- ../env/.env
43-
environment:
44-
- SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@fastapi-2fa-db:5432/postgres
45-
- CELERY_BROKER_URL=amqp://admin:admin@fastapi-2fa-rabbitmq:5672/
46-
- result_backend=redis://fastapi-2fa-cache:6379/0
59+
# environment:
60+
# - SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@fastapi_2fa-db:5432/postgres
61+
# - CELERY_BROKER_URL=amqp://admin:admin@fastapi_2fa-rabbitmq:5672/
62+
# - result_backend=redis://fastapi_2fa-cache:6379/0
4763
ports:
4864
- "5672:5672"
4965

5066
celery_worker:
51-
container_name: fastapi-2fa-celery
67+
container_name: fastapi_2fa-celery
5268
build:
5369
context: ..
5470
dockerfile: ./docker/Dockerfile
5571
image: fastapi_2fa_celery_worker
56-
entrypoint: /scripts/start_celery_worker.sh
72+
entrypoint: ./scripts/start_celery_worker.sh
5773
env_file:
5874
- ../env/.env
59-
environment:
60-
- SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@fastapi-2fa-db:5432/postgres
61-
- CELERY_BROKER_URL=amqp://admin:admin@fastapi-2fa-rabbitmq:5672/
62-
- result_backend=redis://fastapi-2fa-cache:6379/0
75+
# environment:
76+
# - SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@fastapi_2fa-db:5432/postgres
77+
# - CELERY_BROKER_URL=amqp://admin:admin@fastapi_2fa-rabbitmq:5672/
78+
# - result_backend=redis://fastapi_2fa-cache:6379/0
6379
depends_on:
6480
- redis
6581
- db
6682
- rabbitmq
6783

6884
flower:
69-
container_name: fastapi-2fa-flower
85+
container_name: fastapi_2fa-flower
7086
build:
7187
context: ..
7288
dockerfile: ./docker/Dockerfile
7389
image: fastapi_2fa_celery_flower
74-
entrypoint: /scripts/start_celery_flower.sh
75-
volumes:
76-
- flower_db:/app/flower_db
90+
entrypoint: ./scripts/start_celery_flower.sh
91+
# volumes:
92+
# - flower_db:/app/flower_db
7793
env_file:
7894
- ../env/.env
7995
ports:
@@ -84,6 +100,6 @@ services:
84100
- rabbitmq
85101
- celery_worker
86102

87-
volumes:
88-
pgdata:
89-
flower_db:
103+
# volumes:
104+
# pgdata:
105+
# flower_db:
74 KB
Loading

env/.env

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
FASTAPI_CONFIG=development
22
FAKE_EMAIL_SENDER=[email protected]
33
API_V1_STR=/api/v1
4-
PROJECT_NAME=fastapi-2fa
4+
PROJECT_NAME=fastapi_2fa
55

66
# # JWT
77
JWT_SECRET_KEY=9d58ca3446806034a68b02cbcdf69d8f
88
JWT_SECRET_KEY_REFRESH=mXuqbFTs2kTmz+6rBpJh1B4T+zHQh8Nq1nc7BOrWTb4=
99
PRE_TFA_SECRET_KEY=11rWUgZLTckPHI7KO1SPbFgG1OILrDQjI7v9Q7KgYZw=
1010
ALGORITHM=HS256
1111
ACCESS_TOKEN_EXPIRE_MINUTES=30
12-
REFRESH_TOKEN_EXPIRE_MINUTES=1440 # 24 h
12+
# 24 h
13+
REFRESH_TOKEN_EXPIRE_MINUTES=1440
1314

1415
# # 2 FACTOR AUTHENTICATION
1516
FERNET_KEY_TFA_TOKEN=J_TYpprFmoLlVM0MNZElt8IwEkvEEhAwCmb8P_f7Fro=
@@ -28,18 +29,29 @@ BACKEND_CORS_ORIGINS=http://localhost:5555
2829
# # DB
2930
POSTGRES_USER=admin
3031
POSTGRES_PASSWORD=admin
31-
POSTGRES_HOST=localhost
32+
# local dev
33+
# POSTGRES_HOST=localhost
34+
# container
35+
POSTGRES_HOST=fastapi_2fa-db
3236
POSTGRES_PORT=5432
3337
POSTGRES_DB=postgres
34-
SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@localhost:5454/postgres
38+
# local dev
39+
# SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@localhost:5454/postgres
40+
# container
41+
SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://admin:admin@fastapi_2fa-db:5432/postgres
3542

3643
# # RABBIT MQ
3744
RABBITMQ_DEFAULT_USER=admin
3845
RABBITMQ_DEFAULT_PASS=admin
3946

4047
# # CELERY
41-
CELERY_BROKER_URL=amqp://admin:admin@localhost:5672/
42-
result_backend=redis://localhost:6389/0
48+
# local dev
49+
# CELERY_BROKER_URL=amqp://admin:admin@localhost:5672/ # local dev
50+
# container
51+
CELERY_BROKER_URL=amqp://admin:admin@fastapi_2fa-rabbitmq:5672/
52+
# result_backend=redis://localhost:6389/0 # local dev
53+
# container
54+
result_backend=redis://fastapi_2fa-cache:6379/0
4355

4456
# # FLOWER
4557
CELERY_FLOWER_USER=admin

fastapi_2fa/core/config.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ def assemble_db_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any
7171
# Celery ACK the queue only when task is completed
7272
CELERY_TASK_ACKS_LATE = True
7373
imports = ("fastapi_2fa.tasks.tasks",)
74-
task_serializer = "pickle"
75-
accept_content = ('pickle', 'json',)
74+
task_serializer = 'json'
75+
accept_content = ('json',)
7676

7777
class Config:
7878
case_sensitive = True
@@ -115,5 +115,7 @@ def get_settings():
115115
config_cls = config_cls_dict[config_name]
116116
return config_cls()
117117

118+
print(os.environ)
118119

119120
settings = get_settings()
121+

fastapi_2fa/core/security.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,27 @@
1010

1111

1212
def get_password_hash(password: str) -> str:
13+
"""Returns the hashed version of a string
14+
15+
Args:
16+
password (str)
17+
18+
Returns:
19+
str: hashed psw
20+
"""
1321
return pwd_context.hash(password)
1422

1523

1624
def verify_password(password: str, hashed_password: str) -> bool:
25+
"""Check password hash with given hashed value
26+
27+
Args:
28+
password (str): raw password
29+
hashed_password (str): hashed version of raw password
30+
31+
Returns:
32+
bool: True if passwords match hashed password
33+
"""
1734
return pwd_context.verify(password, hashed_password)
1835

1936

@@ -22,6 +39,16 @@ def _create_token(
2239
expire_minutes: int,
2340
key: str,
2441
) -> str:
42+
"""Create a JWT token
43+
44+
Args:
45+
subject (int | Any)
46+
expire_minutes (int)
47+
key (str): key to do the encoding/decoding
48+
49+
Returns:
50+
str: encoded jwt
51+
"""
2552
expires_delta = datetime.utcnow() + timedelta(minutes=expire_minutes)
2653
to_encode = {
2754
"sub": str(subject),

0 commit comments

Comments
 (0)