67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
from fastapi import APIRouter, Depends, HTTPException
|
|
from pydantic import BaseModel
|
|
from datetime import datetime, timedelta
|
|
from app.api.auth import get_current_user
|
|
from app.schemas.auth import CurrentUser
|
|
from app.services.temp_ssh_password_service import temp_ssh_password_manager
|
|
import os
|
|
|
|
router = APIRouter()
|
|
|
|
class SshVerifyRequest(BaseModel):
|
|
"""SSH 비밀번호 검증 요청"""
|
|
username: str
|
|
password: str
|
|
|
|
@router.post("/credentials")
|
|
async def get_ssh_credentials(current_user: CurrentUser = Depends(get_current_user)):
|
|
"""
|
|
JWT 토큰으로 임시 SSH 자격증명 발급
|
|
|
|
Returns:
|
|
SSH 연결 정보 및 임시 비밀번호
|
|
"""
|
|
# 임시 비밀번호 생성 (1시간 유효)
|
|
temp_password = temp_ssh_password_manager.generate_password(
|
|
username=current_user.username,
|
|
validity_hours=1
|
|
)
|
|
|
|
# SSH 서버 정보 (외부 접속용)
|
|
ssh_host = os.getenv("SSH_HOST", "api.mouse84.com") # 외부 DDNS
|
|
ssh_port = int(os.getenv("SSH_PORT", "54054")) # 외부 포트 (내부 22로 포워딩)
|
|
|
|
# 만료 시간 계산
|
|
expires_at = datetime.utcnow() + timedelta(hours=1)
|
|
|
|
return {
|
|
"ssh_host": ssh_host,
|
|
"ssh_port": ssh_port,
|
|
"ssh_username": current_user.username,
|
|
"ssh_password": temp_password,
|
|
"expires_at": expires_at.isoformat(),
|
|
"expires_in_seconds": 3600
|
|
}
|
|
|
|
@router.post("/verify")
|
|
async def verify_ssh_password(request: SshVerifyRequest):
|
|
"""
|
|
임시 SSH 비밀번호 검증 (PAM 인증용)
|
|
|
|
Args:
|
|
request: 사용자명과 비밀번호
|
|
|
|
Returns:
|
|
200: 비밀번호 유효
|
|
401: 비밀번호 무효
|
|
"""
|
|
is_valid = temp_ssh_password_manager.verify_password(
|
|
username=request.username,
|
|
password=request.password
|
|
)
|
|
|
|
if is_valid:
|
|
return {"valid": True, "message": "Password verified"}
|
|
else:
|
|
raise HTTPException(status_code=401, detail="Invalid password")
|