Новая система авторизации для Max
All checks were successful
Build And Push / publish (push) Successful in 2m42s
All checks were successful
Build And Push / publish (push) Successful in 2m42s
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "HospitalAssistantBackend"
|
||||
version = "1.1.0"
|
||||
version = "1.2.0"
|
||||
description = "Backend for Hospital Assistant"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.13,<3.14"
|
||||
|
||||
@ -74,3 +74,63 @@ async def callback(session: AsyncSessionDep, code: str):
|
||||
await cache.set(access_token, f'user:{user.id}')
|
||||
|
||||
return s.Token(access_token=access_token)
|
||||
|
||||
|
||||
@router.post('/max/callback')
|
||||
async def max_callback(session: AsyncSessionDep, code: str):
|
||||
token = None
|
||||
for i in range(3):
|
||||
try:
|
||||
token = await c.esia_api.access_token(code)
|
||||
break
|
||||
except Exception:
|
||||
logger.warning(
|
||||
'Error occurred while accessing ESI API. Retrying...'
|
||||
)
|
||||
if i == 2:
|
||||
raise
|
||||
|
||||
if token is None:
|
||||
raise e.BadRequestException
|
||||
|
||||
esia_user = await c.esia_api.get_user_info(
|
||||
token.access_token, token.id_token
|
||||
)
|
||||
|
||||
try:
|
||||
vita_user = await c.vitacore_api.findBySnils(esia_user.snils)
|
||||
patId = vita_user.patId
|
||||
except e.UnknownException:
|
||||
raise e.BadRequestException(detail='Patient not found') from None
|
||||
|
||||
existing_user_stmt = select(User).where(User.vita_id == patId).limit(1)
|
||||
existing_user = (
|
||||
await session.execute(existing_user_stmt)
|
||||
).scalar_one_or_none()
|
||||
|
||||
if existing_user is None:
|
||||
user = User(vita_id=patId)
|
||||
session.add(user)
|
||||
await session.commit()
|
||||
await session.refresh(user)
|
||||
|
||||
else:
|
||||
user = existing_user
|
||||
|
||||
verify_token = secrets.token_urlsafe(32)
|
||||
await cache.set(f'verify:{verify_token}', f'user:{user.id}')
|
||||
|
||||
return s.Token(access_token=verify_token)
|
||||
|
||||
|
||||
@router.post('/max/verify')
|
||||
async def max_verify(token: str):
|
||||
user = await cache.get(f'verify:{token}')
|
||||
|
||||
if user is None:
|
||||
raise e.BadRequestException(detail='Invalid token')
|
||||
|
||||
access_token = secrets.token_urlsafe(32)
|
||||
await cache.set(access_token, user.decode())
|
||||
|
||||
return s.Token(access_token=access_token)
|
||||
|
||||
Reference in New Issue
Block a user