Я пишу простое веб-приложение, использующее Fast API в качестве серверной части, и хочу, чтобы аутентификация осуществлялась через Azure B2C. Логика всего этого сейчас не очень важна, я просто хочу иметь возможность проверить, что я могу успешно войти в систему, используя разные методы.
Но, после довольно долгих попыток, Не могу понять, почему не могу получить данные пользователей из сессий после перенаправления.
import logging
import secrets
from fastapi import FastAPI, Request, HTTPException, status
from fastapi.responses import RedirectResponse, JSONResponse
from starlette.middleware.sessions import SessionMiddleware
from datetime import datetime
import jwt
import time
import json
from logger import logger
from env import *
from db_helpers import *
from mailer import *
from ad_helpers import *
from models import CreateUserRequest, InviteUserRequest, AcceptInvitationRequest, ProcessGoogleTokenRequest, ResendInvitationRequest, UserResponse, CreateUserResponse, InviteUserResponse
# Logging
app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key="your-very-secret-key", max_age=None)
logger.setLevel(logging.DEBUG)
logger.debug(f"B2C Authority: {B2C_AUTHORITY}")
# Middleware to handle session cookies
@app.middleware("http")
async def session_middleware(request: Request, call_next):
response = await call_next(request)
session = request.cookies.get('session')
if session:
response.set_cookie(key='session', value=session, httponly=True)
return response
# FRONT ROUTES
@app.get('/login')
async def login(request: Request):
"""
Get the authorization URL for login.
"""
logger.debug("Executing login function")
auth_url = build_auth_url()
logger.debug(f"Authorization URL: {auth_url}")
return JSONResponse(content={"auth_url": auth_url})
@app.get('/oauth_callback')
async def oauth_callback(request: Request):
"""
Handle the OAuth2 authorization code and store user information in the session.
"""
if 'code' in request.query_params:
logger.debug("Authorization code received: %s", request.query_params['code'])
cache = load_cache(request)
try:
result = build_msal_app(cache=cache).acquire_token_by_authorization_code(
request.query_params['code'],
scopes=[],
redirect_uri=f"{BASE_URL}/oauth_callback") # Ensure proper URL
logger.debug(f"Token acquisition result: {result}")
if 'error' in result:
logger.error("Error in token acquisition: %s", result['error_description'])
raise HTTPException(status_code=400, detail=f"Error: {result['error_description']}")
user_info = result.get('id_token_claims')
request.session['user'] = user_info
save_cache(request, cache)
logger.debug("Session data saved: %s", request.session['user'])
except Exception as e:
logger.error("Exception during token acquisition: %s", str(e))
raise HTTPException(status_code=500, detail=str(e))
return RedirectResponse("/user-profile")
if not request.session.get('user'):
logger.debug("No user session found, redirecting to login")
return RedirectResponse("/login/")
logger.debug("User session found, redirecting to profile")
return RedirectResponse("/user-profile")
@app.get('/user-profile', response_model=UserResponse)
async def user_profile(request: Request):
"""
Get the user's profile information from the session.
"""
user = request.session.get('user')
logger.debug("user data from session: %s", user)
if not user:
raise HTTPException(status_code=401, detail="User not logged in")
return UserResponse(message="User profile retrieved successfully", email=user['emails'][0], id=user['oid'])
Я буду очень рад вашей помощи или любым подсказкам НА ЧТО мне вообще стоит посмотреть.
Я пытался установить и получить данные пользователя из THEsession, но он все время показывает None.
Я пишу простое веб-приложение, использующее Fast API в качестве серверной части, и хочу, чтобы аутентификация осуществлялась через Azure B2C. Логика всего этого сейчас не очень важна, я просто хочу иметь возможность проверить, что я могу успешно войти в систему, используя разные методы. Но, после довольно долгих попыток, Не могу понять, почему не могу получить данные пользователей из сессий после перенаправления. [code]import logging import secrets
from fastapi import FastAPI, Request, HTTPException, status from fastapi.responses import RedirectResponse, JSONResponse from starlette.middleware.sessions import SessionMiddleware
from datetime import datetime import jwt import time import json
from logger import logger from env import * from db_helpers import * from mailer import * from ad_helpers import * from models import CreateUserRequest, InviteUserRequest, AcceptInvitationRequest, ProcessGoogleTokenRequest, ResendInvitationRequest, UserResponse, CreateUserResponse, InviteUserResponse
# Middleware to handle session cookies @app.middleware("http") async def session_middleware(request: Request, call_next): response = await call_next(request) session = request.cookies.get('session') if session: response.set_cookie(key='session', value=session, httponly=True) return response
# FRONT ROUTES
@app.get('/login') async def login(request: Request): """ Get the authorization URL for login. """ logger.debug("Executing login function") auth_url = build_auth_url() logger.debug(f"Authorization URL: {auth_url}") return JSONResponse(content={"auth_url": auth_url})
@app.get('/oauth_callback') async def oauth_callback(request: Request): """ Handle the OAuth2 authorization code and store user information in the session. """ if 'code' in request.query_params: logger.debug("Authorization code received: %s", request.query_params['code']) cache = load_cache(request) try: result = build_msal_app(cache=cache).acquire_token_by_authorization_code( request.query_params['code'], scopes=[], redirect_uri=f"{BASE_URL}/oauth_callback") # Ensure proper URL logger.debug(f"Token acquisition result: {result}") if 'error' in result: logger.error("Error in token acquisition: %s", result['error_description']) raise HTTPException(status_code=400, detail=f"Error: {result['error_description']}") user_info = result.get('id_token_claims') request.session['user'] = user_info save_cache(request, cache) logger.debug("Session data saved: %s", request.session['user']) except Exception as e: logger.error("Exception during token acquisition: %s", str(e)) raise HTTPException(status_code=500, detail=str(e)) return RedirectResponse("/user-profile")
if not request.session.get('user'): logger.debug("No user session found, redirecting to login") return RedirectResponse("/login/") logger.debug("User session found, redirecting to profile") return RedirectResponse("/user-profile")
@app.get('/user-profile', response_model=UserResponse) async def user_profile(request: Request): """ Get the user's profile information from the session. """ user = request.session.get('user') logger.debug("user data from session: %s", user) if not user: raise HTTPException(status_code=401, detail="User not logged in")
return UserResponse(message="User profile retrieved successfully", email=user['emails'][0], id=user['oid']) [/code] Я буду очень рад вашей помощи или любым подсказкам НА ЧТО мне вообще стоит посмотреть. Я пытался установить и получить данные пользователя из THEsession, но он все время показывает None.
Я строю приложение Fastapi, обслуживающее шаблоны Jinja2, и немного не уверен, как обрабатывать токены CSRF. Я добавил SessionMiddleware Starlette:
app.add_middleware(SessionMiddleware, secret_key= some-random-string )
Я строю приложение Fastapi, обслуживающее шаблоны Jinja2, и немного не уверен, как обрабатывать токены CSRF. Я добавил SessionMiddleware Starlette:
app.add_middleware(SessionMiddleware, secret_key= some-random-string )
Мне нужно создать сеанс для аутентификации в конечной точке session_set. Однако по какой-то причине сеанс все еще создается в конечной точке session_info. Как сделать, чтобы сессия создавалась только в session_set? В противном случае у меня в ответе...
Я разрабатываю приложение FastAPI без сохранения состояния. Аутентификация осуществляется через Google OAuth (область профиля электронной почты openid). Я использую Authlib, а он использует SessionMiddleware (request.session) для хранения временных...
Я пытаюсь добавить правило в брандмауэр Windows в промежуточном программном обеспечении .Net Core (httpHandler), написанном на C#. Код выглядит следующим образом: