docs
This commit is contained in:
93
README.md
93
README.md
@@ -1,89 +1,32 @@
|
||||
# Dashback API
|
||||
# dashback
|
||||
|
||||
Backend API for the Dashback frontend. Default base URL:
|
||||
Backend API for Dash — Google SSO auth, SQLite allowlist, and session cookies.
|
||||
|
||||
```
|
||||
http://localhost:4208/api
|
||||
## Setup
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
npm install
|
||||
```
|
||||
|
||||
## CORS & cookies
|
||||
Configure `.env` (see `.env.example`). Required for auth: `GOOGLE_CLIENT_ID`, `JWT_SECRET`, and `CORS_ORIGINS`.
|
||||
|
||||
All browser requests that need auth must send cookies:
|
||||
## Run
|
||||
|
||||
```js
|
||||
fetch('http://localhost:4208/api/auth/me', {
|
||||
credentials: 'include',
|
||||
});
|
||||
```bash
|
||||
npm start
|
||||
```
|
||||
|
||||
Sessions use an HTTP-only `token` cookie (`Secure`, `SameSite=Strict`, 24h). The browser must talk to the API over **HTTPS** for login to work — `Secure` cookies are not sent on plain HTTP.
|
||||
Default port: `4208`.
|
||||
|
||||
## Auth flow
|
||||
## API
|
||||
|
||||
1. Call `GET /auth/me` to get `googleClientId` (included in 200 and 401 responses).
|
||||
2. Sign in with Google on the frontend (Google Identity Services / One Tap).
|
||||
3. POST the Google ID token to the API.
|
||||
4. The API sets the session cookie.
|
||||
5. Call protected routes with `credentials: 'include'`. The cookie is refreshed automatically when it has less than 2 hours left.
|
||||
See [docs/api](docs/api/README.md) for endpoints, auth flow, and frontend integration.
|
||||
|
||||
### `POST /auth/login`
|
||||
## Users
|
||||
|
||||
Public. No cookie required.
|
||||
Manage the email allowlist:
|
||||
|
||||
**Body (JSON)**
|
||||
|
||||
```json
|
||||
{ "idToken": "<google-id-token>" }
|
||||
```bash
|
||||
npm run manage-users
|
||||
```
|
||||
|
||||
**200**
|
||||
|
||||
```json
|
||||
{
|
||||
"message": "Login successful",
|
||||
"user": { "id": 1, "email": "you@example.com", "picture": "https://lh3.googleusercontent.com/..." }
|
||||
}
|
||||
```
|
||||
|
||||
**Errors**
|
||||
|
||||
| Status | Body |
|
||||
|--------|------|
|
||||
| 400 | `{ "error": "idToken is required" }` |
|
||||
| 401 | `{ "error": "Invalid Google token" }` or `{ "error": "Invalid Google account" }` |
|
||||
| 403 | `{ "error": "Email is not authorized" }` |
|
||||
|
||||
### `POST /auth/logout`
|
||||
|
||||
Public. Clears the session cookie.
|
||||
|
||||
**200**
|
||||
|
||||
```json
|
||||
{ "message": "Logged out successfully" }
|
||||
```
|
||||
|
||||
### `GET /auth/me`
|
||||
|
||||
Protected. Requires a valid session cookie. Every response includes `googleClientId`.
|
||||
|
||||
**200**
|
||||
|
||||
```json
|
||||
{
|
||||
"user": { "id": 1, "email": "you@example.com", "picture": "https://lh3.googleusercontent.com/..." },
|
||||
"googleClientId": "your-client-id.apps.googleusercontent.com"
|
||||
}
|
||||
```
|
||||
|
||||
**Errors**
|
||||
|
||||
| Status | Body |
|
||||
|--------|------|
|
||||
| 401 | `{ "error": "Unauthorized", "googleClientId": "..." }` or `{ "error": "Invalid token", "googleClientId": "..." }` |
|
||||
| 403 | `{ "error": "User is no longer authorized", "googleClientId": "..." }` |
|
||||
|
||||
## Frontend checklist
|
||||
|
||||
- [ ] `credentials: 'include'` on every API call
|
||||
- [ ] HTTPS in dev (or proxy) so `Secure` cookies work
|
||||
|
||||
Reference in New Issue
Block a user