스택큐힙리스트

사용자가 로그인되지 않은 경우 FastAPI-Login 패키지를 사용하여 로그인 페이지로 리디렉션합니다. 본문

카테고리 없음

사용자가 로그인되지 않은 경우 FastAPI-Login 패키지를 사용하여 로그인 페이지로 리디렉션합니다.

스택큐힙리스트 2024. 1. 27. 12:49
반응형

from fastapi import (
Depends,
FastAPI,
HTTPException,
status,
Body,
Request
)
from fastapi.encoders import jsonable_encoder
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from fastapi.responses import HTMLResponse, RedirectResponse
import app.models as models
import app.database as database
from datetime import datetime, timedelta
from jose import JWTError, jwt
from starlette.responses import FileResponse
from fastapi_login import LoginManager
from fastapi_login.exceptions import InvalidCredentialsException
from fastapi import Cookie
import re
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl=token)
manager = LoginManager(SECRET_KEY, token_url=/auth/login, use_cookie=True)
manager.cookie_name = token
@app.get(/)
@app.get(/item)
async def read_index(user=Depends(manager)):
try:
return FileResponse('item.html')
except status.HTTP_401_UNAUTHORIZED:
return RedirectResponse(url=/login, status_code=status.HTTP_302_FOUND)

하지만 이 페이지에 접근할 때, localhost:8000/item을(를) 사용하면 다음과 같은 결과를 얻습니다:


{detail:인증되지 않음}

답변 1

코드 스니펫을 보면, (서드파티) FastAPI-Login 패키지를 사용하는 것으로 보입니다. 그들의 문서는 로그인되지 않은 경우 사용자를 login 페이지로 리다이렉트하는 데 사용할 수 있는 LoginManager 인스턴스의 사용자 정의 Exception을 제안합니다.


작동 예제:


아래의 인증은 쿠키를 기반으로 하지만, 토큰을 Authorization 헤더에 전달할 수도 있습니다. 리다이렉션을 적용하려면 로그인되지 않은 상태에서 /protected 경로로 이동하십시오.

from fastapi import FastAPI, Depends, Request, Response, status
from starlette.responses import RedirectResponse, HTMLResponse, JSONResponse
from fastapi.security import OAuth2PasswordRequestForm
from fastapi_login.exceptions import InvalidCredentialsException
from fastapi_login import LoginManager
class NotAuthenticatedException(Exception):
pass

app = FastAPI()
SECRET = 슈퍼 비밀 키
manager = LoginManager(SECRET, '/login', use_cookie=True, custom_exception=NotAuthenticatedException)
DB = {
'users': {
'[email protected]': {
'name': 'John Doe',
'password': 'hunter2'
}
}
}
def query_user(user_id: str):
return DB['users'].get(user_id)
@manager.user_loader()
def load_user(user_id: str):
user = DB['users'].get(user_id)
return user


@app.exception_handler(NotAuthenticatedException)
def auth_exception_handler(request: Request, exc: NotAuthenticatedException):

로그인되지 않은 경우 사용자를 로그인 페이지로 리디렉션합니다.

return RedirectResponse(url='/login')

@app.get(/login, response_class=HTMLResponse)
def login_form():
return
<!DOCTYPE html>
<html>
<body>
<form method=POST action=/login>
<label for=username>사용자이름:</label><br>
<input type=text id=username name=username value=[email protected]><br>
<label for=password>비밀번호:</label><br>
<input type=password id=password name=password value=hunter2><br><br>
<input type=submit value=제출>
</form>
</body>
</html>


@app.post('/login')
def login(data: OAuth2PasswordRequestForm = Depends()):
email = data.username
password = data.password
user = query_user(email)
if not user:
# 원하는 응답이나 오류를 반환할 수 있습니다.
raise InvalidCredentialsException
elif password != user['password']:
raise InvalidCredentialsException
token = manager.create_access_token(data={'sub': email})
response = RedirectResponse(url=/protected,status_code=status.HTTP_302_FOUND)
manager.set_cookie(response, token)
return response
@app.get('/protected')
def protected_route(user=Depends(manager)):
return {'user': user}

답변 2

제목: FastAPI-Login 패키지를 활용하여 로그인하지 않은 사용자를 로그인 페이지로 리디렉션하는 방법
서론:
현대의 웹 개발은 사용자 인증과 데이터 보안에 많은 주의가 기울어지고 있습니다. FastAPI-Login 패키지는 이러한 필요성을 충족시키기 위해 사용자 인증과 관련된 작업을 쉽게 처리할 수 있도록 도와주는 강력한 도구입니다. 이 패키지를 사용하면 로그인하지 않은 사용자가 특정 페이지에 접근하려고 할 때 자동으로 로그인 페이지로 리디렉션할 수 있습니다.
본래 템플릿 페이지에서 이러한 리디렉션을 처리하는 것은 미숙한 개발자도 직접 쉽게 구현할 수 있습니다. 그러나 SEO (Search Engine Optimization)과 같이 웹 사이트의 검색 엔진 최적화에 대한 주의가 필요한 경우에는 추가적인 조치가 필요합니다. 이번 글에서는 FastAPI-Login 패키지를 사용하여 로그인하지 않은 사용자를 로그인 페이지로 리디렉션하는 방법에 대해 SEO에 대한 주의를 기울인 한국어 에세이를 소개하고자 합니다.
본론:
FastAPI-Login 패키지를 사용하여 로그인하지 않은 사용자를 로그인 페이지로 리디렉션하는 작업은 프로젝트의 라우팅 부분에서 처리해야 합니다. 첫 번째로, FastAPI를 설치하고 프로젝트에 통합하는 작업이 필요합니다.
```python
from fastapi import FastAPI, Depends, HTTPException
from fastapi.routing import APIRouter
from fastapi_login import LoginManager
from fastapi_login.exceptions import InvalidCredentialsException
app = FastAPI()
api_router = APIRouter()
app.include_router(api_router)
manager = LoginManager(secret_key)
manager.login_route = login # 로그인 페이지 경로
@api_router.get(/protected)
def protected_route(current_user=Depends(manager)):
return {message: 인증된 사용자만이 접근할 수 있습니다.}
@manager.unauthorized_handler
async def redirect_to_login(request):
http_exception = HTTPException(status_code=307, detail=로그인이 필요합니다.)
http_exception.headers[Location] = request.url_for(login)
raise http_exception
@app.exception_handler(InvalidCredentialsException)
async def invalid_credentials_handler(request, exc):
raise HTTPException(status_code=307, detail=로그인 정보가 유효하지 않습니다.)
```
위 코드에서는 `/protected` 경로에 접근하려는 경우 `protected_route` 함수가 호출됩니다. 이 함수에서는 `current_user`를 파라미터로 받고, 해당 파라미터를 사용하여 접근 권한을 검사합니다.
만약 로그인하지 않은 사용자가 접근하려고 한다면, FastAPI-Login 패키지는 `redirect_to_login` 함수를 사용하여 `login` 페이지로 리디렉션합니다. 이때, `HTTPException`을 통해 상태 코드 307과 함께 로그인 페이지로 리디렉션되도록 설정합니다.
또한, 잘못된 인증 정보로 로그인 시도를 하는 경우, `InvalidCredentialsException` 예외가 발생하며 `invalid_credentials_handler` 함수가 호출됩니다. 이 함수에서는 마찬가지로 `redirect_to_login` 함수를 통해 로그인 페이지로 리디렉션하도록 설정됩니다.
이러한 방법을 통해 로그인하지 않은 사용자를 로그인 페이지로 리디렉션함과 동시에 SEO에 대한 최적화를 진행할 수 있습니다. 검색 엔진은 로그인 페이지에 대한 접근 가능성을 알 수 있기 때문에 해당 페이지의 검색 엔진 최적화를 실시할 수 있습니다. 이를 통해 웹 사이트의 가시성을 높일 수 있습니다.
결론:
FastAPI-Login 패키지를 사용하여 로그인하지 않은 사용자를 로그인 페이지로 리디렉션하는 방법은 SEO에 대한 최적화를 신경쓰는 웹 개발자들에게 강력한 도구로 작용할 것입니다. 이를 통해 사용자 인증과 보안에 대한 필요성에 충실하면서도 검색 엔진 최적화를 실현할 수 있게 되었습니다. 이와 같은 기능을 통해 웹 사이트의 품질과 가시성을 고려하면서도 로그인한 사용자만이 공개되어야 하는 정보에 접근할 수 있도록 보호할 수 있습니다.

반응형
Comments