Short-lived access tokens + refresh sessions
The access token stays short-lived while refresh-token handling is isolated behind the auth flow. This keeps normal API authorization simple without forcing long-lived access credentials into the browser.
Case study
Recruitment workflows without the usual friction
A full-stack recruitment platform for candidates and recruiters, with secure authentication, role-aware workflows, resume handling, and job applications.
01
Credify is a recruitment platform designed around two primary users: candidates looking for opportunities and recruiters managing hiring workflows. The project focuses on the practical engineering behind authentication, authorization, profile management, job publishing, applications, file uploads, email flows, and production deployment.
02
Hiring workflows are often fragmented across forms, email threads, files, and disconnected dashboards. Candidates need a clear way to manage their profile and applications, while recruiters need reliable controls for posting jobs and reviewing candidates.
03
Credify brings those workflows into one role-aware application. Candidates can manage their profile, resume, and applications while recruiters work with company and job data through protected APIs. The backend separates authentication, authorization, policy checks, storage, and domain logic so each part can evolve independently.
04
05
06
The access token stays short-lived while refresh-token handling is isolated behind the auth flow. This keeps normal API authorization simple without forcing long-lived access credentials into the browser.
Role checks protect broad capabilities, while policy-level checks handle resource-specific rules such as whether a recruiter can act on a particular company.
Resume upload behavior is kept behind a storage service so controllers do not need to know Cloudinary-specific details and old files can be cleaned up as part of replacement flows.
07
01
Problem
A page refresh clears in-memory access state, but storing a long-lived access token in localStorage would increase exposure to client-side script attacks.
Approach
The application restores the session through the refresh flow and keeps the active access token in memory, with loading states preventing protected UI from making assumptions before restoration completes.
02
Problem
As candidate, recruiter, company, job, and application rules grow, putting every rule directly inside controllers makes behavior difficult to reason about.
Approach
Authentication, broad role authorization, and resource-level policy checks are separated so each layer answers a narrower question.
03
Problem
The frontend and API are deployed separately, so API paths, cookies, origins, and production environment variables have to remain consistent between local and hosted environments.
Approach
Environment-driven proxy configuration and explicit production settings keep the client and API decoupled while preserving a stable application-facing API path.
08
09
I'm happy to walk through the architecture, trade-offs and implementation decisions in more depth.
Contact me