mirror of
				https://github.com/fastapi-users/fastapi-users.git
				synced 2025-10-31 17:38:30 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from typing import Type
 | |
| 
 | |
| from fastapi import APIRouter, Body, Depends, HTTPException, Request, status
 | |
| from pydantic import EmailStr
 | |
| 
 | |
| from fastapi_users import exceptions, models, schemas
 | |
| from fastapi_users.manager import BaseUserManager, UserManagerDependency
 | |
| from fastapi_users.router.common import ErrorCode, ErrorModel
 | |
| 
 | |
| 
 | |
| def get_verify_router(
 | |
|     get_user_manager: UserManagerDependency[models.UP, models.ID],
 | |
|     user_schema: Type[schemas.U],
 | |
| ):
 | |
|     router = APIRouter()
 | |
| 
 | |
|     @router.post(
 | |
|         "/request-verify-token",
 | |
|         status_code=status.HTTP_202_ACCEPTED,
 | |
|         name="verify:request-token",
 | |
|     )
 | |
|     async def request_verify_token(
 | |
|         request: Request,
 | |
|         email: EmailStr = Body(..., embed=True),
 | |
|         user_manager: BaseUserManager[models.UP, models.ID] = Depends(get_user_manager),
 | |
|     ):
 | |
|         try:
 | |
|             user = await user_manager.get_by_email(email)
 | |
|             await user_manager.request_verify(user, request)
 | |
|         except (
 | |
|             exceptions.UserNotExists,
 | |
|             exceptions.UserInactive,
 | |
|             exceptions.UserAlreadyVerified,
 | |
|         ):
 | |
|             pass
 | |
| 
 | |
|         return None
 | |
| 
 | |
|     @router.post(
 | |
|         "/verify",
 | |
|         response_model=user_schema,
 | |
|         name="verify:verify",
 | |
|         responses={
 | |
|             status.HTTP_400_BAD_REQUEST: {
 | |
|                 "model": ErrorModel,
 | |
|                 "content": {
 | |
|                     "application/json": {
 | |
|                         "examples": {
 | |
|                             ErrorCode.VERIFY_USER_BAD_TOKEN: {
 | |
|                                 "summary": "Bad token, not existing user or"
 | |
|                                 "not the e-mail currently set for the user.",
 | |
|                                 "value": {"detail": ErrorCode.VERIFY_USER_BAD_TOKEN},
 | |
|                             },
 | |
|                             ErrorCode.VERIFY_USER_ALREADY_VERIFIED: {
 | |
|                                 "summary": "The user is already verified.",
 | |
|                                 "value": {
 | |
|                                     "detail": ErrorCode.VERIFY_USER_ALREADY_VERIFIED
 | |
|                                 },
 | |
|                             },
 | |
|                         }
 | |
|                     }
 | |
|                 },
 | |
|             }
 | |
|         },
 | |
|     )
 | |
|     async def verify(
 | |
|         request: Request,
 | |
|         token: str = Body(..., embed=True),
 | |
|         user_manager: BaseUserManager[models.UP, models.ID] = Depends(get_user_manager),
 | |
|     ):
 | |
|         try:
 | |
|             return await user_manager.verify(token, request)
 | |
|         except (exceptions.InvalidVerifyToken, exceptions.UserNotExists):
 | |
|             raise HTTPException(
 | |
|                 status_code=status.HTTP_400_BAD_REQUEST,
 | |
|                 detail=ErrorCode.VERIFY_USER_BAD_TOKEN,
 | |
|             )
 | |
|         except exceptions.UserAlreadyVerified:
 | |
|             raise HTTPException(
 | |
|                 status_code=status.HTTP_400_BAD_REQUEST,
 | |
|                 detail=ErrorCode.VERIFY_USER_ALREADY_VERIFIED,
 | |
|             )
 | |
| 
 | |
|     return router
 | 
