Autentikasi JWT di API Platform
JSON Web Token (JWT) adalah metode autentikasi berbasis token yang sangat cocok untuk API stateless seperti API Platform. Kita akan menggunakan LexikJWTAuthenticationBundle untuk mengimplementasikan sistem login berbasis token.
1. Instalasi JWT Bundle
composer require lexik/jwt-authentication-bundle
2. Generate SSL Key
JWT membutuhkan private-public key pair:
mkdir -p config/jwt
openssl genrsa -out config/jwt/private.pem 4096
openssl rsa -pubout -in config/jwt/private.pem -out config/jwt/public.pem
Kemudian atur permission-nya:
chmod 600 config/jwt/private.pem
chmod 644 config/jwt/public.pem
3. Konfigurasi .env
Tambahkan path private key ke file .env:
JWT_PASSPHRASE=your-passphrase-if-any
Atur juga di config/packages/lexik_jwt_authentication.yaml
:
lexik_jwt_authentication:
secret_key: '%kernel.project_dir%/config/jwt/private.pem'
public_key: '%kernel.project_dir%/config/jwt/public.pem'
pass_phrase: '%env(JWT_PASSPHRASE)%'
token_ttl: 3600
4. Konfigurasi Security
Edit config/packages/security.yaml
:
security:
password_hashers:
App\Entity\User: auto
providers:
app_user_provider:
entity:
class: App\Entity\User
property: email
firewalls:
login:
pattern: ^/login
stateless: true
json_login:
check_path: /login
username_path: email
password_path: password
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
api:
pattern: ^/api
stateless: true
jwt: ~
access_control:
- { path: ^/login, roles: PUBLIC_ACCESS }
- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
5. Endpoint Login
API untuk login JWT:
POST /login
Request:
{
"email": "user@example.com",
"password": "yourpassword"
}
Response:
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
6. Gunakan JWT untuk Request API
Tambahkan token JWT di setiap request API menggunakan header:
Authorization: Bearer <token>
Contoh menggunakan curl
:
curl -H "Authorization: Bearer ey..." http://localhost/api/users
7. Cek Token
Jika token valid, user dianggap autentikasi. Jika token invalid/expired, akan mendapat status 401 Unauthorized
.
8. Proteksi Resource API
Contoh membatasi akses ke entitas hanya untuk role tertentu:
#[ApiResource(
security: "is_granted('ROLE_USER')",
)]
9. Logout (Opsional)
Karena JWT bersifat stateless, tidak ada logout di server. Namun, frontend cukup menghapus token dari storage (misal: localStorage
atau cookie).
Kesimpulan
✅ JWT sangat cocok untuk autentikasi API berbasis SPA/Mobile
✅ Menggunakan LexikJWTAuthenticationBundle untuk login
✅ Token dikirim via Authorization: Bearer
✅ Role & security bisa dikontrol per entitas atau endpoint
🔐 Gunakan HTTPS di production agar token tidak mudah disadap!