perling/docs/authentication.md

223 lines
4.5 KiB
Markdown

# Authentication System Documentation
## Overview
The application uses a dual authentication system:
- **Web Authentication**: Session-based with cookies for browser access
- **API Authentication**: Token-based using Laravel Sanctum for API access
## Web Authentication (Session + Cookies)
### Login
**Endpoint**: `POST /auth/session-login`
**Controller**: `WebAuthController@sessionLogin`
```bash
curl -X POST http://localhost:8000/auth/session-login \
-H "Content-Type: application/json" \
-H "X-CSRF-TOKEN: your-csrf-token" \
-d '{
"identifier": "user@example.com",
"password": "password123"
}'
```
**Response**:
```json
{
"success": true,
"message": "Login berhasil",
"user": {
"id": 1,
"name": "John Doe",
"email": "user@example.com",
"username": "johndoe"
}
}
```
### Logout
**Endpoint**: `POST /auth/logout`
**Controller**: `WebAuthController@sessionLogout`
```bash
curl -X POST http://localhost:8000/auth/logout \
-H "Content-Type: application/json" \
-H "X-CSRF-TOKEN: your-csrf-token"
```
### Protected Routes
All admin routes are protected with `web.auth` middleware:
- `/dashboard/*`
- `/admin/*`
## API Authentication (Token-based)
### Login
**Endpoint**: `POST /api/auth/login`
**Controller**: `AuthController@login`
```bash
curl -X POST http://localhost:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"identifier": "user@example.com",
"password": "password123",
"device_name": "mobile-app"
}'
```
**Response**:
```json
{
"success": true,
"message": "Login berhasil",
"token": "1|abc123def456...",
"token_type": "Bearer",
"user": {
"id": 1,
"name": "John Doe",
"email": "user@example.com",
"username": "johndoe",
"roles": ["admin"],
"permissions": ["dashboard.view", "settings.manage"]
}
}
```
### Using API Token
Include the token in the Authorization header:
```bash
curl -X GET http://localhost:8000/api/auth/me \
-H "Authorization: Bearer 1|abc123def456..."
```
### Get User Info
**Endpoint**: `GET /api/auth/me`
```bash
curl -X GET http://localhost:8000/api/auth/me \
-H "Authorization: Bearer your-token"
```
### Logout (Current Device)
**Endpoint**: `POST /api/auth/logout`
```bash
curl -X POST http://localhost:8000/api/auth/logout \
-H "Authorization: Bearer your-token"
```
### Logout All Devices
**Endpoint**: `POST /api/auth/logout-all`
```bash
curl -X POST http://localhost:8000/api/auth/logout-all \
-H "Authorization: Bearer your-token"
```
## Configuration
### Guards
- `web`: Session-based authentication for web interface
- `sanctum`: Token-based authentication for API
### Middleware
- `web.auth`: Custom middleware for web session authentication
- `auth:sanctum`: Laravel Sanctum middleware for API authentication
### Token Management
- Tokens are device-specific (one token per device)
- Old tokens for the same device are automatically revoked on new login
- Tokens don't expire by default (configurable in sanctum config)
## Security Features
### Web Authentication
- CSRF protection enabled
- Session regeneration on login
- Remember token invalidation on logout
- Cookie cleanup on logout
### API Authentication
- Device-specific tokens
- Token revocation on logout
- Automatic cleanup of old tokens
- Rate limiting (configurable)
## Error Handling
### Common Error Responses
**Invalid Credentials**:
```json
{
"message": "The given data was invalid.",
"errors": {
"identifier": ["Email/username atau password yang diberikan salah."]
}
}
```
**Unauthenticated**:
```json
{
"success": false,
"message": "Unauthenticated"
}
```
## Testing
### Web Authentication Test
```bash
# Login
curl -c cookies.txt -X POST http://localhost:8000/auth/session-login \
-H "Content-Type: application/json" \
-d '{"identifier": "admin@example.com", "password": "password"}'
# Access protected route
curl -b cookies.txt http://localhost:8000/dashboard
# Logout
curl -b cookies.txt -X POST http://localhost:8000/auth/logout
```
### API Authentication Test
```bash
# Login and save token
TOKEN=$(curl -X POST http://localhost:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"identifier": "admin@example.com", "password": "password"}' \
| jq -r '.token')
# Use token
curl -H "Authorization: Bearer $TOKEN" http://localhost:8000/api/auth/me
# Logout
curl -X POST http://localhost:8000/api/auth/logout \
-H "Authorization: Bearer $TOKEN"
```