Lewati ke konten utama

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!