Skip to content

Commit 0a1f8af

Browse files
committed
Addded Authentication
1 parent c392877 commit 0a1f8af

File tree

6 files changed

+62
-6
lines changed

6 files changed

+62
-6
lines changed

config.py

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55

66
# DB_URL = postgresql://username:password@hostname:port/database
77
DB_URL = os.getenv("DB_URL")
8+
SECRET = os.getenv("SECRET").encode() # Required by Login Manager

main.py

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
app = FastAPI()
55

6+
67
@app.get("/")
78
async def root():
89
return {"message": "Hello World"}

models/database.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
from config import DB_URL
2+
13
from sqlalchemy.orm import declarative_base, Session
24
from sqlalchemy import create_engine
3-
from config import DB_URL
45

56
Base = declarative_base()
67
engine = create_engine(DB_URL)

models/users.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
from database import Base, database
1+
from config import DB_URL
22

3-
from sqlalchemy import Column, Integer, String
3+
from sqlalchemy.orm import declarative_base, Session
4+
from sqlalchemy import create_engine, Column, Integer, String
5+
6+
Base = declarative_base()
7+
engine = create_engine(DB_URL)
8+
database = Session(bind=engine)
49

510

611
class Users(Base):
@@ -11,3 +16,6 @@ class Users(Base):
1116
password = Column(String)
1217
phone = Column(String)
1318
storyline = Column(Integer)
19+
20+
21+
Base.metadata.create_all(engine, checkfirst=True)

routes/login.py

+38-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1-
from fastapi import APIRouter
1+
from models.users import Users, database
2+
from config import SECRET
3+
4+
from fastapi import APIRouter, Depends
5+
from fastapi.responses import JSONResponse
6+
from fastapi_login import LoginManager
7+
from fastapi.security import OAuth2PasswordRequestForm
8+
from fastapi_login.exceptions import InvalidCredentialsException
29
from pydantic import BaseModel
310

411
router = APIRouter(prefix="/user")
12+
manager = LoginManager(SECRET, "/user/login")
513

614

715
class UserLoginRequest(BaseModel):
@@ -10,6 +18,33 @@ class UserLoginRequest(BaseModel):
1018
password: str
1119

1220

21+
@manager.user_loader()
22+
def query_user(email_id):
23+
return database.query(Users).filter_by(email=email_id).one()
24+
25+
1326
@router.post("/login")
14-
async def login(login_data: UserLoginRequest):
15-
print(login_data.email, login_data.password)
27+
async def login(data: OAuth2PasswordRequestForm = Depends()):
28+
email = data.username
29+
password = data.password
30+
31+
user = query_user(email)
32+
if not user:
33+
print("User not found")
34+
raise InvalidCredentialsException
35+
elif password != user.password:
36+
print("Password does not match")
37+
raise InvalidCredentialsException
38+
else:
39+
access_token = manager.create_access_token(data={"sub": email})
40+
return JSONResponse(
41+
content={"access_token": access_token, "token_type": "bearer"}
42+
)
43+
44+
45+
@router.post("/data")
46+
async def data(user=Depends(manager)):
47+
return JSONResponse(
48+
status_code=200,
49+
content="You are logged in as " + user.email
50+
)

temp.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import requests
2+
3+
data = {
4+
"username": "Kevin Nadar",
5+
"password": "kevin"
6+
}
7+
8+
response = requests.post("http://127.0.0.1:8000/user/login", data=data)
9+
10+
print(response.json())

0 commit comments

Comments
 (0)