4.7 KiB
Demo OAuth2 MCP
Pendahuluan
OAuth2 adalah protokol standar industri untuk otorisasi, memungkinkan akses aman ke sumber daya tanpa berbagi kredensial. Dalam implementasi MCP (Model Context Protocol), OAuth2 menyediakan cara yang kuat untuk mengotentikasi dan mengotorisasi klien (seperti agen AI) untuk mengakses server MCP dan alatnya.
Pelajaran ini menunjukkan cara mengimplementasikan otentikasi OAuth2 untuk server MCP menggunakan Spring Boot, pola umum untuk penyebaran perusahaan dan produksi.
Tujuan Pembelajaran
Di akhir pelajaran ini, Anda akan:
- Memahami bagaimana OAuth2 terintegrasi dengan server MCP
- Mengimplementasikan Spring Authorization Server untuk penerbitan token
- Melindungi endpoint MCP dengan otentikasi berbasis JWT
- Mengonfigurasi alur kredensial klien untuk komunikasi mesin-ke-mesin
Prasyarat
- Pemahaman dasar tentang Java dan Spring Boot
- Familiar dengan konsep MCP dari modul sebelumnya
- Maven atau Gradle terpasang
Gambaran Proyek
Proyek ini adalah aplikasi Spring Boot minimal yang bertindak sebagai:
- Spring Authorization Server (mengeluarkan token akses JWT melalui alur
client_credentials), dan - Resource Server (melindungi endpoint
/hellosendiri).
Ini meniru pengaturan yang ditampilkan dalam posting blog Spring (2 Apr 2025).
Mulai cepat (lokal)
# bangun & jalankan
./mvnw spring-boot:run
# dapatkan token
curl -u mcp-client:secret -d grant_type=client_credentials \
http://localhost:8081/oauth2/token | jq -r .access_token > token.txt
# panggil endpoint yang dilindungi
curl -H "Authorization: Bearer $(cat token.txt)" http://localhost:8081/hello
Menguji Konfigurasi OAuth2
Anda dapat menguji konfigurasi keamanan OAuth2 dengan langkah-langkah berikut:
1. Verifikasi server berjalan dan aman
# Ini harus mengembalikan 401 Unauthorized, mengonfirmasi bahwa keamanan OAuth2 aktif
curl -v http://localhost:8081/
2. Dapatkan token akses menggunakan kredensial klien
# Dapatkan dan ekstrak respons token lengkap
curl -v -X POST http://localhost:8081/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: Basic bWNwLWNsaWVudDpzZWNyZXQ=" \
-d "grant_type=client_credentials&scope=mcp.access"
# Atau untuk mengekstrak hanya token (memerlukan jq)
curl -s -X POST http://localhost:8081/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: Basic bWNwLWNsaWVudDpzZWNyZXQ=" \
-d "grant_type=client_credentials&scope=mcp.access" | jq -r .access_token > token.txt
Catatan: Header Basic Authentication (bWNwLWNsaWVudDpzZWNyZXQ=) adalah encoding Base64 dari mcp-client:secret.
3. Akses endpoint yang dilindungi menggunakan token
# Menggunakan token yang disimpan
curl -H "Authorization: Bearer $(cat token.txt)" http://localhost:8081/hello
# Atau langsung dengan nilai token
curl -H "Authorization: Bearer eyJra...token_value...xyz" http://localhost:8081/hello
Respons berhasil dengan "Hello from MCP OAuth2 Demo!" mengonfirmasi bahwa konfigurasi OAuth2 berfungsi dengan benar.
Membangun Container
docker build -t mcp-oauth2-demo .
docker run -p 8081:8081 mcp-oauth2-demo
Deploy ke Azure Container Apps
az containerapp up -n mcp-oauth2 \
-g demo-rg -l westeurope \
--image <your-registry>/mcp-oauth2-demo:latest \
--ingress external --target-port 8081
FQDN ingress menjadi issuer Anda (https://<fqdn>).
Azure menyediakan sertifikat TLS terpercaya secara otomatis untuk *.azurecontainerapps.io.
Integrasi dengan Azure API Management
Tambahkan kebijakan inbound ini ke API Anda:
<inbound>
<validate-jwt header-name="Authorization">
<openid-config url="https://<fqdn>/.well-known/openid-configuration"/>
<audiences>
<audience>mcp-client</audience>
</audiences>
</validate-jwt>
<base/>
</inbound>
APIM akan mengambil JWKS dan memvalidasi setiap permintaan.
Apa selanjutnya
Penafian:
Dokumen ini telah diterjemahkan menggunakan layanan terjemahan AI Co-op Translator. Meskipun kami berusaha untuk memberikan terjemahan yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau kekurangan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang sahih. Untuk informasi penting, disarankan menggunakan jasa terjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang salah yang timbul dari penggunaan terjemahan ini.