계정 보안
이메일 인증, 비밀번호 재설정·변경, 로그인 기기 관리, 탈퇴를 다룹니다. 화면은 accounts.pickgola.com이 이미 갖추고 있으므로, 다른 서비스는 보통 그쪽으로 보내기만 하면 됩니다.
이메일 인증
가입하면 인증 메일이 자동으로 나갑니다. 링크는 https://accounts.pickgola.com/verify?token=… 형식이고 24시간 동안 한 번만 쓸 수 있습니다.
const me = await client.auth.me();
if (!me.emailVerified) {
await client.auth.requestEmailVerification(); // 새 메일을 보내면 이전 링크는 무효
}
// /verify 화면에서
const account = await client.auth.verifyEmail(token); // 로그인하지 않아도 됩니다비밀번호 재설정
await client.auth.forgotPassword(email); // 가입 여부와 관계없이 항상 성공(204)
await client.auth.resetPassword({ token, password }); // 링크는 1시간 유효재설정이 끝나면 모든 기기에서 로그아웃됩니다. 새 비밀번호로 다시 로그인하도록 안내하세요.
비밀번호 변경
await client.users.changePassword({ currentPassword, newPassword });지금 쓰는 기기는 로그인이 유지되고, 다른 기기는 모두 로그아웃됩니다.
로그인 기기
const { items } = await client.users.sessions();
// items[n] = { id, userAgent, ip, createdAt, lastUsedAt, current }
await client.users.revokeSession(items[1].id); // 한 기기만 로그아웃
await client.users.revokeOtherSessions(); // { revoked: 3 }ip는 끝자리를 가린 값입니다(203.0.113.***). current가 true인 항목을 로그아웃하면 지금 기기의 쿠키도 지워집니다.
탈퇴
진행 중인 일이 있으면 탈퇴할 수 없습니다. 먼저 확인하고, 막는 항목을 사용자에게 보여 주세요.
const { blockers } = await client.users.withdrawalCheck();
// [{ service: 'studio', reason: '아직 지급되지 않은 정산이 1건 있어요. 지급이 끝난 뒤 탈퇴할 수 있어요.' }]
if (blockers.length === 0) {
await client.users.withdraw({ password, reason: '서비스를 더 쓰지 않아요' });
}| 막는 항목 | 조건 |
|---|---|
| 스튜디오 크리에이터 | 수락 이후 게시까지 진행 중인 주문, 지급이 끝나지 않은 정산 |
| 스튜디오 광고주 | 진행 중인 캠페인이 있는 조직의 유일한 관리자 |
| 데이벤트 | 오늘 이후 일정의 모집 중·마감 이벤트, 진행 중인 캐스팅 |
withdrawalCheck 이후 상태가 바뀌었다면 withdraw가 409 WITHDRAW_BLOCKED를 던집니다. 이때 error.body.blockers에 같은 형식의 목록이 들어 있습니다.
탈퇴하면 이름·이메일·프로필·연결된 SNS·정산 계좌가 지워지고, 모든 기기에서 로그아웃됩니다. 거래 기록처럼 법으로 보관해야 하는 정보는 개인정보처리방침의 기간만큼 분리 보관됩니다.
요청 횟수 제한
같은 IP에서 짧은 시간에 너무 많이 요청하면 429가 돌아옵니다.
| API | 1분당 |
|---|---|
| 로그인, 가입 | 10회 |
| 비밀번호 찾기, 비밀번호 변경, 탈퇴 | 5회 |
| 인증 메일 다시 보내기 | 3회 |
로컬에서 메일 확인
로컬 API는 메일을 실제로 보내지 않고 메모리에 쌓습니다(MAIL_DRIVER=console).
curl "http://localhost:4000/v1/dev/mails?to=brand@demo.pickgola.com"운영 환경(APP_ENV=production)에서는 이 주소가 404입니다.