7.3 KiB
JWT API Authentication for Odoo 19
Modul grt_jwt_token menyediakan autentikasi JWT untuk aplikasi eksternal yang ingin mengakses endpoint API Odoo dengan pola:
- Aplikasi eksternal mengirim
client_iddanclient_secret. - Odoo memvalidasi API Client.
- Odoo mengembalikan JWT access token.
- Aplikasi eksternal memakai token tersebut sebagai
Authorization: Bearer <token>untuk mengakses endpoint API yang dilindungi.
Modul ini cocok untuk integrasi API dan SSO berbasis token antar aplikasi. Untuk login otomatis ke UI web Odoo, masih diperlukan flow tambahan yang membuat Odoo session secara eksplisit.
Fitur
- Menu aplikasi utama: JWT Auth.
- Model konfigurasi API Client.
- Generate
client_idotomatis. - Generate dan rotasi
client_secret. - Penyimpanan secret sebagai hash PBKDF2, bukan plaintext.
- Token JWT dengan claim
iss,aud,exp,iat,jti,sub, danclient_id. - Decorator
@check_jwt_authuntuk melindungi controller custom. - Contoh endpoint protected:
/api/ifc/projects.
Struktur Modul
grt_jwt_token/
+-- __manifest__.py
+-- __init__.py
+-- README.md
+-- controllers/
| +-- __init__.py
| +-- main.py
+-- models/
| +-- __init__.py
| +-- api_client.py
+-- security/
| +-- ir.model.access.csv
+-- static/
| +-- description/
| | +-- icon.png
| | +-- icon_128.png
| +-- src/img/
| +-- jwt_auth_icon.png
+-- views/
+-- api_client_views.xml
Konfigurasi Odoo
Tambahkan jwt_secret di file odoo.conf.
[options]
jwt_secret = ganti_dengan_secret_panjang_minimal_32_karakter
Ketentuan:
- Minimal 32 karakter.
- Jangan pakai secret contoh di production.
- Simpan secret hanya di server.
- Setelah mengubah
odoo.conf, restart Odoo.
Contoh konfigurasi lokal:
db_name = odoo19
http_port = 8071
jwt_secret = W2V8bVN38YJZJQhcew8Fcgw6vG5Ab79hbRzD3SpjJvGQxNPvKcNFQ8syb6h9PqRr
Instalasi
- Pastikan folder
grt_jwt_tokenberada diaddons_path. - Restart Odoo.
- Buka Apps.
- Update Apps List jika modul belum muncul.
- Install JWT API Authentication.
Atau lewat CLI:
$env:PYTHONPATH='C:\odoo19\server'
.\.venv\Scripts\python.exe C:\odoo19\server\odoo-bin -c .\odoo.conf -d odoo19 -i grt_jwt_token --stop-after-init
Untuk update modul:
$env:PYTHONPATH='C:\odoo19\server'
.\.venv\Scripts\python.exe C:\odoo19\server\odoo-bin -c .\odoo.conf -d odoo19 -u grt_jwt_token --stop-after-init
Membuat API Client
- Login sebagai Administrator.
- Buka app JWT Auth.
- Buat record baru.
- Isi:
- Application Name: nama aplikasi eksternal.
- Odoo User: user Odoo yang akan dipakai ketika token digunakan.
- Token Lifetime (seconds): masa berlaku token, default
7200.
- Simpan.
- Salin
Client IDdanNew Client Secret.
Penting: client_secret hanya ditampilkan saat dibuat atau setelah tombol Regenerate Secret ditekan. Setelah halaman ditutup, secret tidak bisa dilihat lagi karena database hanya menyimpan hash.
Endpoint Token
URL:
POST /api/auth/token
Content-Type:
application/json
Body:
{
"client_id": "CLIENT_ID_ANDA",
"client_secret": "CLIENT_SECRET_ANDA"
}
secret_key juga diterima sebagai alias dari client_secret untuk kompatibilitas integrasi.
Response sukses:
{
"access_token": "JWT_TOKEN",
"expires_in": 7200,
"token_type": "Bearer"
}
Response gagal:
{
"error": "Invalid credentials."
}
Contoh Request Token
PowerShell:
$body = @{
client_id = "CLIENT_ID_ANDA"
client_secret = "CLIENT_SECRET_ANDA"
} | ConvertTo-Json
Invoke-RestMethod `
-Uri "http://localhost:8071/api/auth/token" `
-Method Post `
-Body $body `
-ContentType "application/json"
cURL:
curl -X POST http://localhost:8071/api/auth/token \
-H "Content-Type: application/json" \
-d '{"client_id":"CLIENT_ID_ANDA","client_secret":"CLIENT_SECRET_ANDA"}'
Mengakses Endpoint Protected
Contoh endpoint:
GET /api/ifc/projects
Header:
Authorization: Bearer JWT_TOKEN
PowerShell:
$headers = @{
Authorization = "Bearer JWT_TOKEN"
}
Invoke-RestMethod `
-Uri "http://localhost:8071/api/ifc/projects" `
-Method Get `
-Headers $headers
cURL:
curl http://localhost:8071/api/ifc/projects \
-H "Authorization: Bearer JWT_TOKEN"
Response contoh:
{
"message": "JWT token is valid.",
"user_id": 2,
"user_name": "Administrator",
"client_id": "CLIENT_ID_ANDA",
"data": [
"Proyek_IFC_Gedung_A",
"Proyek_IFC_Infrastruktur_B"
]
}
Melindungi Controller Custom
Import decorator dari controller modul:
from odoo import http
from odoo.http import request
from odoo.addons.grt_jwt_token.controllers.main import check_jwt_auth, json_response
class MyApiController(http.Controller):
@http.route('/api/my/resource', type='http', auth='public', methods=['GET'], csrf=False)
@check_jwt_auth
def my_resource(self, **kwargs):
return json_response({
'user_id': request.env.user.id,
'user_name': request.env.user.name,
})
Saat token valid, decorator akan:
- Decode dan validasi JWT.
- Memastikan client masih aktif.
- Memastikan user Odoo masih aktif.
- Mengisi
request.jwt_payload. - Mengisi
request.jwt_client. - Mengisi
request.jwt_user_id. - Menjalankan
request.update_env(user=user_id).
Claim JWT
Token berisi claim berikut:
| Claim | Isi |
|---|---|
iss |
Issuer, default odoo |
aud |
Audience, default odoo-api |
exp |
Waktu kedaluwarsa token |
iat |
Waktu token diterbitkan |
jti |
ID unik token |
sub |
ID user Odoo dalam format string |
client_id |
Client ID API Client |
Keamanan
Rekomendasi production:
- Gunakan HTTPS.
- Gunakan
jwt_secretyang panjang dan random. - Jangan commit
jwt_secretproduction ke repository. - Buat satu API Client per aplikasi eksternal.
- Mapping API Client ke user Odoo dengan hak akses minimum.
- Rotasi secret secara berkala dengan tombol Regenerate Secret.
- Nonaktifkan API Client yang tidak digunakan.
- Batasi masa berlaku token sesuai kebutuhan.
- Tambahkan rate limiting di reverse proxy jika endpoint dibuka ke internet.
Troubleshooting
Error: JWT secret is not configured
Penyebab:
jwt_secretbelum ada diodoo.conf.- Panjang
jwt_secretkurang dari 32 karakter. - Odoo belum direstart setelah config diubah.
Solusi:
- Tambahkan
jwt_secretyang valid. - Restart Odoo.
Error: Invalid credentials
Penyebab:
client_idsalah.client_secretsalah.- API Client tidak aktif.
- User Odoo yang dipetakan tidak aktif.
Error: Token has expired
Token melewati Token Lifetime (seconds). Minta token baru melalui /api/auth/token.
Menu JWT Auth belum muncul
Jika modul sudah ter-install tapi menu belum terlihat:
- Logout.
- Hapus local storage browser untuk
webclient_menusdanwebclient_menus_version. - Login ulang atau pakai private/incognito window.
Catatan Batasan
Modul ini belum membuat session login web Odoo otomatis. Token JWT dipakai untuk akses endpoint API yang memakai @check_jwt_auth. Jika membutuhkan SSO penuh ke UI Odoo, perlu tambahan flow session seperti OAuth/OIDC callback atau endpoint login session yang divalidasi dengan signature.