MCP OAuth 2.1 dengan PKCE: amankan server agen Anda dalam 7 langkah
Spesifikasi MCP 2026-03-15 menjadikan OAuth 2.1 + PKCE sebagai standar otorisasi untuk server agen. Tujuh langkah untuk mengirimkan: metadata PRM, pendaftaran klien dinamis, desain cakupan, dan validasi token dengan kode.
Spesifikasi MCP 2026-03-15 mengunci OAuth 2.1 dengan PKCE sebagai standar otorisasi untuk server MCP jarak jauh. Kunci API dalam variabel lingkungan masih berfungsi pada hari pertama, namun registri, Claude Desktop, Cursor, VS Code Copilot, dan Windsurf semuanya lebih memilih server yang didukung OAuth saat digunakan telusuri integrasi. Jika server Anda masih meminta pembawa berumur panjang di file konfigurasi, Anda meninggalkan sebagian distribusi di atas meja.
Bagian tersulitnya bukanlah OAuth itu sendiri; ini adalah lima spesifikasi kecil yang dibuat oleh aliran autentikasi MCP bersama-sama: OAuth 2.1 (RFC 9700), PKCE (RFC 7636), Pendaftaran Klien Dinamis (RFC 7591), Indikator Sumber Daya (RFC 8707), dan Metadata Sumber Daya yang Dilindungi. Masing-masing berukuran kecil; kabel di situlah tim terjebak. Inilah jalannya, secara berurutan.
Langkah 1: Sajikan dokumen Metadata Sumber Daya yang Dilindungi
File PRM memberi tahu klien di mana server otorisasi Anda berada, cakupan apa yang Anda terima, dan apa saja
pengidentifikasi sumber daya untuk dimasukkan ke dalam aud mengeklaim. Selenggarakan di
/.well-known/oauth-protected-resource pada asal yang sama dengan titik akhir MCP Anda:
Itu authorization_servers list adalah lompatan penemuan. Klien mengambil PRM Anda,
ikuti entri pertama ke dokumen metadata AS, dan buat URL otorisasi dari sana.
Pertahankan daftarnya pada satu entri kecuali Anda menjalankan federasi; banyak penerbit membingungkan klien dan
tidak ada dalam spesifikasi yang memerlukannya.
Langkah 2: Publikasikan metadata server otorisasi
Penyedia identitas Anda (Auth0, Okta, Clerk, Cloudflare Access, atau Hydra yang dihosting sendiri) melayani
metadata AS di /.well-known/oauth-authorization-server. Klien MCP mengkonsumsinya
untuk mempelajari titik akhir otorisasi dan token, jenis hibah yang didukung, dan lokasi JWKS
untuk verifikasi token:
Tiga bidang yang diminta spesifikasi: code_challenge_methods_supported harus menyertakan
S256; grant_types_supported harus menyertakan
authorization_code Dan refresh_token;
registration_endpoint harus ada jika Anda mendukung klien dinamis. Merindukan siapa pun
dan Claude Desktop akan menandai server sebagai tidak patuh selama pengaturan.
Langkah 3: Hasilkan pasangan PKCE pada klien
PKCE terdiri dari 20 baris kode klien dan mematikan kelas intersepsi kode otorisasi menyerang. Hasilkan 32 byte acak, enkode base64url menjadi verifikator, SHA-256 verifikator menjadi tantangan, dan mengirimkan tantangan dengan permintaan otorisasi:
Itu resource parameter (RFC 8707) adalah salah satu implementasi yang paling banyak dilewatkan. Tanpa
itu, token yang dibuat untuk server MCP Anda dapat diputar ulang terhadap API lain yang mempercayainya
penerbit yang sama; dengan itu, itu aud klaim menyematkan token ke pengidentifikasi sumber daya Anda
dan tidak ada orang lain yang menerimanya.
Langkah 4: Tukarkan kode dengan token
Setelah pengalihan kembali, klien POST kode ditambah pemverifikasi asli ke token titik akhir. Server otorisasi menghitung ulang SHA-256 dari pemverifikasi dan membandingkannya dengan tantangan yang tersimpan; jika cocok, Anda mendapatkan token akses:
Simpan token penyegaran di penyimpanan aman (Keychain, Windows Credential Manager, Linux libsecret) dan hapus pemverifikasi dari penyimpanan sesi saat pertukaran berhasil. Akses token hidup 5 hingga 60 menit; token penyegaran hidup lebih lama tetapi tetap harus diputar saat digunakan.
Langkah 5: Verifikasi token pembawa pada setiap permintaan MCP
HTTP yang dapat dialirkan membuat verifikasi token menjadi sederhana: setiap permintaan HTTP membawa
Authorization header, sehingga server MCP Anda memverifikasinya di middleware sebelumnya
mengirimkan panggilan alat. Ambil JWKS satu kali, simpan dalam cache, dan validasi penerbit, audiens, dan
kedaluwarsa pada setiap panggilan:
Tiga klaim yang menangkap bug nyata: iss menyematkan penerbit;
aud menyematkan sumber daya (mencegah pemutaran ulang lintas sumber daya);
exp menangkap token basi. Jangan menerima token tanpa ini; “Saya sudah memvalidasinya
tanda tangan" tidak sama dengan "Saya memvalidasi klaim tersebut."
Langkah 6: Gerbang setiap alat pada cakupan yang dinyatakan oleh anotasinya
Desain cakupan minus OAuth 2.1 memberi Anda akses biner: klien dapat memanggil setiap alat atau tidak ada. Sistem anotasi MCP menutup kesenjangan tersebut dengan membiarkan setiap alat mendeklarasikan cakupannya kebutuhan. Penangan membaca anotasi dan cakupan token pada waktu pemanggilan:
Pisahkan cakupan destruktif dan baca-saja. Pengguna yang mengabulkan tools:read untuk
menjalankan laporan mingguan seharusnya tidak dapat dijalankan send_email dari token yang sama.
Claude Desktop dan Cursor meminta cakupan di layar persetujuan, sehingga pemisahan terjadi
UX jujur tentang apa yang dapat dilakukan klien.
Langkah 7: Dukung pendaftaran klien dinamis
Registrasi klien dinamis memungkinkan klien MCP mendaftar sendiri di server otorisasi Anda
tanpa manusia mengisi formulir. Kursor atau Claude Desktop POST permintaan pendaftaran,
menerima a client_id, dan segera menjalankan aliran OAuth:
Ini adalah bagian yang memindahkan server MCP Anda dari "tempelkan kunci API di file konfigurasi" ke "klik Hubungkan di Kursor dan berikan akses." Layak untuk dilakukan jika server Anda bersifat publik; dapat dilewati jika Anda hanya mengirim ke sekelompok kecil klien yang dikenal.
Verifikasi aliran penuh dari ujung ke ujung
Setelah bagian-bagiannya berada di tempatnya, panggilan alat MCP lengkap tampak seperti yang diautentikasi oleh pembawa lainnya Permintaan HTTP:
Jika Anda melihat 401 dengan WWW-Authenticate: Bearer resource_metadata="...",
klien mengetahui di mana menemukan pengaturan autentikasi Anda dan menjalankan kembali alurnya. Header itu adalah
jabat tangan yang memungkinkan penyegaran token senyap dan penyambungan kembali setelah pencabutan.
Masukkan URL PRM di WWW-Authenticate header pada setiap respons 401. MCP
spec menjadikannya petunjuk penemuan kanonik; klien yang melihat 401 mundur tanpa catatan
untuk meminta kunci API kepada pengguna, yang merupakan aliran yang coba diganti oleh OAuth 2.1.
Lembar contekan desain ruang lingkup
| Cakupan | Meliputi | Hibah bawaan |
|---|---|---|
tools:read |
Daftar alat yang tersedia, baca deskripsi | Selalu diberikan atas persetujuan |
tools:invoke:safe |
Panggilan alat idempoten dan hanya-baca (pencarian, penguraian) | Diberikan per persetujuan pengguna |
tools:invoke:destructive |
Panggilan alat yang bermutasi (kirim email, buat pesanan) | Memerlukan persetujuan eksplisit per sesi |
resources:read |
Akses hanya baca ke sumber daya yang terekspos | Diberikan per pola sumber daya |
prompts:read |
Buat daftar dan baca perintah yang ditentukan server | Diberikan atas persetujuan |
Poin-poin penting
- OAuth 2.1 memerlukan PKCE. Bukan barang yang bagus untuk dimiliki; setiap aliran kode autentikasi membawa a pemverifikasi dan tantangan atau gagal memenuhi spesifikasi.
-
PRM di
/.well-known/oauth-protected-resourceadalah titik masuknya. Klien menemukan pengaturan autentikasi Anda dari satu URL itu; lewati saja dan klien tidak dapat melakukan konfigurasi otomatis. -
Gunakan
resourceparameter (RFC 8707). Sematkan audiens token ke server MCP Anda sehingga token yang bocor tidak dapat diputar ulang terhadap API lain. - Validasi penerbit, audiens, kedaluwarsa, cakupan. Cek tanda tangan saja biar pemutaran ulang lintas sumber daya.
-
Pisahkan cakupan destruktif.
tools:read,tools:invoke:safe, Dantools:invoke:destructiveberikan kepada pengguna menyetujui UX yang mereka harapkan dari izin OS. - Registrasi klien dinamis membuka instalasi tanpa konfigurasi. Bayar biaya pelaksanaan satu kali; setiap klien MCP baru mendapatkan keuntungan selamanya.
Server MCP yang dihosting Botoi di api.botoi.com/mcp menjalankan pola yang sama. Telusuri dokumen pengaturan MCP untuk konfigurasi Claude Desktop, Claude Code, Cursor, VS Code, dan Windsurf. Untuk penandatanganan JWT dan verifikasi primitif yang digunakan middleware di atas, lihat Titik akhir JWT API di dokumen interaktif.
FAQ
- Mengapa PKCE untuk MCP ketika agen bukan browser?
- PKCE (Kunci Bukti untuk Pertukaran Kode) mengikat kode otorisasi ke rahasia kriptografi satu kali yang hanya diketahui oleh klien pemrakarsa. Dalam konteks MCP, penyerang bukanlah ekstensi browser yang berbahaya; itu adalah agen jahat atau kode otorisasi curian yang mengambang di log terminal. PKCE berarti kode yang disadap tidak dapat ditukarkan tanpa pemverifikasi kode asli. OAuth 2.1 memerlukan PKCE untuk setiap aliran kode otorisasi, termasuk klien rahasia, jadi MCP hanya mengikuti spesifikasinya.
- Apa yang dimaksud dengan dokumen Metadata Sumber Daya yang Dilindungi?
- Dokumen PRM adalah file JSON yang disajikan di /.well-known/oauth-protected-resource yang memberi tahu klien OAuth di mana server otorisasi berada, cakupan yang diterima sumber daya, dan pengidentifikasi sumber daya apa yang akan dimasukkan ke dalam klaim aud. Spesifikasi otorisasi MCP menambahkan PRM sehingga klien MCP menemukan pengaturan autentikasi Anda tanpa konfigurasi out-of-band. Klien mengambil PRM, mengikuti URL otorisasi_servers ke metadata AS, menjalankan tarian OAuth, dan tiba di server MCP Anda dengan token pembawa yang valid.
- Apakah saya memerlukan pendaftaran klien dinamis?
- Untuk server MCP publik diekspos ke banyak klien ya. Pendaftaran klien dinamis (RFC 7591) memungkinkan klien MCP mendaftar sendiri di server otorisasi Anda, menerima client_id, dan memulai alur OAuth dalam satu perjalanan pulang pergi. Tanpanya, setiap pengguna harus membuat aplikasi secara manual di dasbor Anda sebelum mereka dapat menghubungkan Claude atau Cursor. Untuk integrasi internal atau yang diizinkan, client_id yang telah disediakan sebelumnya masih berfungsi.
- Di mana token pembawa berada selama sesi?
- Di header Otorisasi setiap permintaan MCP. HTTP yang dapat dialirkan menjadikannya bersih; setiap permintaan membawa token, dan server Anda memverifikasinya di middleware sebelum mengirimkan panggilan alat. Token akses berumur pendek (5 hingga 60 menit) dengan token penyegaran yang dipegang oleh klien meminimalkan radius ledakan dari baris log yang bocor. Jangan pernah menyematkan token di URL; log dan proxy menangkap URL secara rutin.
- Bagaimana cakupan alat MCP dibandingkan dengan cakupan OAuth?
- MCP bersandar pada otorisasi berbasis peran: token membawa cakupan seperti tools:read, tools:invoke:safe, atau tools:invoke:destructive, dan anotasi masing-masing alat menyatakan cakupan mana yang diperlukan. Cakupan memetakan cakupan satu-ke-satu ke OAuth, sehingga Anda dapat menggunakan desain cakupan yang sama dengan yang sudah Anda miliki untuk REST API. Bagian baru adalah anotasi tingkat alat di sisi MCP; mereka membuat keputusan otorisasi terlihat di registri alat, bukan hanya di kode pengendali.
Mulai membangun dengan botoi
150+ endpoint API untuk pencarian, pemrosesan teks, pembuatan gambar, dan utilitas developer. Paket gratis, tanpa kartu kredit.