from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel
import jwt
from datetime import datetime, timedelta
from typing import Optional
import json
from fastapi import FastAPI, Depends, HTTPException
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# Secret key for JWT
SECRET_KEY = "ydjenjkxnmsdfkejnsc"
# Token expiration time (change as needed)
ACCESS_TOKEN_EXPIRE_MINUTES = 30
fake_users_db = {
"user": {
"username": "user",
"password": "password"
}
}
# User model
class User(BaseModel):
username: str
# Token model
class Token(BaseModel):
access_token: str
token_type: str
app = FastAPI()
# Configure CORS
origins = [
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"]
)
# Function to read JWK private key from file
def read_jwk_private_key():
with open("symmetric.json", "r") as key_file:
return json.load(key_file)["k"] # Get the 'k' field from the JWK
# JWT token generation function
def create_access_token(data: dict, expires_delta: timedelta = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
# Load the symmetric key from the JWK file
jwk_private_key = read_jwk_private_key()
# Sign the JWT using the symmetric key
encoded_jwt = jwt.encode(to_encode, jwk_private_key, algorithm="HS256")
return encoded_jwt
# Endpoint to generate a JWT token
@app.post("/token", response_model=Token)
async def generate_access_token(username: str, password: str):
user = fake_users_db.get(username)
if user is None or password != user["password"]:
raise HTTPException(status_code=401, detail="Incorrect username or password")
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(data={"sub": username}, expires_delta=access_token_expires)
# Generate a refresh token
refresh_token_expires = timedelta(days=7) # Change as needed
refresh_token = create_access_token(data={"sub": username}, expires_delta=refresh_token_expires)
return {"access_token": access_token, "token_type": "bearer", "refresh_token": refresh_token}
# ms2.py (Backend Service 2 on port 8001)
@app.get("/service2")
def index():
return {"message": "Hello from Backend Service 2!"}
@app.get("/")
def index():
return {"message": "Hello from Backend Service 2!"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)