2025년 April 14일
  1. 개발 히스토리
  2. [Frontend] 사용자apikey 목록 요청, 비밀번호 찾기 시스템 구현

[Frontend] 사용자apikey 목록 요청, 비밀번호 찾기 시스템 구현

home/user/page.js

API 키 목록 요청

const fetchAPIKey = async (email) => {
  const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/APIkeyList`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ email: email }),
  });
  const data = await response.json();
  if (response.ok) {
    setApiKeys(data.api_keys); // API 키 목록을 상태에 저장
  } else {
    console.log("APIkey 오류발생");
  }
};

요청 URL: ${process.env.NEXT_PUBLIC_API_URL}/APIkeyList

요청 메서드: POST

요청 바디: { email: string }

응답 형태:

{
  "api_keys": [
    {
      "id": 5,
      "provider_id": 4,
      "provider_name": "OpenAI",
      "user_id": 13,
      "api_key": "test",
      "status": "Active",
      "usage_count": 0,
      "usage_limit": 1000,
      "create_at": null
    },
    {
      "id": 6,
      "provider_id": 4,
      "provider_name": "OpenAI",
      "user_id": 13,
      "api_key": "테스트키",
      "status": "Active",
      "usage_count": 0,
      "usage_limit": 1000,
      "create_at": null
    },
    {
      "id": 8,
      "provider_id": 2,
      "provider_name": "Anthropic",
      "user_id": 13,
      "api_key": "sk-ant-***********",
      "status": "Active",
      "usage_count": 123,
      "usage_limit": 1000,
      "create_at": "2024-04-10T14:32:00Z"
    }
  ]
}

주요 필드 설명

필드명설명
idAPI 키 고유 ID
provider_name공급자 이름 (예: OpenAI)
api_key사용자의 API 키 값
status활성 상태 : Active or InActive
usage_count현재까지 사용된 요청 횟수
usage_limit설정된 사용 한도
create_at생성 일시 (nullable)

실행 시점

useEffect(() => {
  if (status !== "authenticated") return;
  if (session?.user?.email) {
    ...
    fetchAPIKey(session.user.email);
  }
}, [session, status]);

로그인 완료 후 자동으로 API 키 목록을 불러옵니다.

ApiKeys.jsx

select 박스의 옵션 처리

<select
  value={newKeyData.provider_name}
  onChange={(e) => {
    const selectedName = e.target.value;
    const selectedProvider = providers.find(p => p.name === selectedName);

    setNewKeyData({
      ...newKeyData,
      provider_name: selectedName,
      provider_id: selectedProvider ? selectedProvider.id : null
    });
  }}
  className="w-full px-4 py-2 border rounded-lg"
>
  {providers.map(provider => {
    const isAlreadyUsed = currentapiKeys.some(apiKey => apiKey.provider_name === provider.name);
    return (
      <option
        key={provider.name}
        value={provider.name}
        disabled={isAlreadyUsed} // ✅ 비활성화 조건
      >
        {provider.name} {isAlreadyUsed ? '(이미 등록됨)' : ''}
      </option>
    );
  })}
</select>
항목설명
providers모든 사용 가능한 프로바이더 목록 (예: OpenAI, Google, Anthropic 등)
currentapiKeys사용자가 현재 등록한 API 키 목록
isAlreadyUsed해당 프로바이더가 이미 등록되었는지 여부를 some() 메서드로 확인
disabled={isAlreadyUsed}이미 등록된 경우 <option> 항목을 비활성화 처리
{provider.name} (이미 등록됨)사용자에게 중복 여부를 명확히 표시

app/getpassword/page.js

목적

이 페이지는 사용자가 이메일을 통해 본인 인증을 한 후 비밀번호를 재설정할 수 있는 비밀번호 재설정 페이지입니다. 2단계 인증 절차를 통해 보안성을 높이며, 이메일을 통한 코드 확인 후 비밀번호 변경이 가능합니다.

주요 기능

이메일 입력 및 인증 코드 전송

이메일로 받은 인증 코드 검증

비밀번호 재설정 기능

주요 상태 변수 (useState)

변수명설명
formData사용자의 입력값을 저장하는 객체 (emailpasswordconfirmPasswordemailCodename)
emailVerified이메일이 인증되었는지 여부
secretCode서버에 전송할 인증 코드 (프론트에서 생성)
step현재 단계 (1단계: 이메일 인증 / 2단계: 비밀번호 변경)

API 통신

작업경로설명
이메일 인증 코드 전송POST /sendEmail이메일 주소와 함께 인증 코드 전송
비밀번호 변경POST /FindPassword이메일과 새로운 비밀번호를 서버에 전송

사용자 인터페이스

Step1 (이메일인증)

Setp2 (새로운 비밀번호 입력)

Leave a Reply

Your email address will not be published. Required fields are marked *

연관 글
BCT NEWS
인기 글
워드프레스 보안
워드프레스 모음
워드프레스 유지보수
워드프레스 제작 팁