client-side login