OAuth2 คือโปรโตคอลมาตรฐานอุตสาหกรรมสำหรับการอนุญาตการเข้าถึง ช่วยให้การเข้าถึงทรัพยากรเป็นไปอย่างปลอดภัยโดยไม่ต้องแชร์ข้อมูลรับรอง ในการใช้งาน MCP (Model Context Protocol) OAuth2 ให้วิธีที่มั่นคงในการยืนยันตัวตนและอนุญาตให้ไคลเอนต์ (เช่น ตัวแทน AI) เข้าถึงเซิร์ฟเวอร์ MCP และเครื่องมือต่างๆ
บทเรียนนี้แสดงให้เห็นถึงวิธีการใช้งานการยืนยันตัวตน OAuth2 สำหรับเซิร์ฟเวอร์ MCP ด้วย Spring Boot ซึ่งเป็นรูปแบบที่ใช้กันทั่วไปสำหรับการนำไปใช้งานในองค์กรและการผลิต
เมื่อจบบทเรียนนี้ คุณจะสามารถ:
- เข้าใจว่าการทำงานร่วมกันระหว่าง OAuth2 กับเซิร์ฟเวอร์ MCP เป็นอย่างไร
- สร้าง Spring Authorization Server สำหรับการออกโทเค็น
- ปกป้องจุดเข้าใช้งาน MCP ด้วยการยืนยันตัวตนด้วย JWT
- กำหนดค่า client credentials flow สำหรับการสื่อสารระหว่างเครื่องจักรกับเครื่องจักร
- ความเข้าใจพื้นฐานใน Java และ Spring Boot
- ความคุ้นเคยกับแนวคิด MCP จากโมดูลก่อนหน้า
- ติดตั้ง Maven หรือ Gradle แล้ว
โปรเจกต์นี้เป็น แอปพลิเคชัน Spring Boot ขั้นพื้นฐาน ที่ทำหน้าที่ทั้ง:
- Spring Authorization Server (ออก access token แบบ JWT ผ่าน
client_credentialsflow) และ - Resource Server (ปกป้องจุดเข้าใช้งาน
/helloของตัวเอง)
โครงสร้างนี้เหมือนกับที่แสดงใน บล็อกโพสต์ Spring (2 เม.ย. 2025)
# สร้างและรัน
./mvnw spring-boot:run
# รับโทเค็น
curl -u mcp-client:secret -d grant_type=client_credentials \
http://localhost:8081/oauth2/token | jq -r .access_token > token.txt
# เรียกใช้งานจุดสิ้นสุดที่ได้รับการป้องกัน
curl -H "Authorization: Bearer $(cat token.txt)" http://localhost:8081/helloคุณสามารถทดสอบการตั้งค่าความปลอดภัย OAuth2 ด้วยขั้นตอนดังนี้:
# สิ่งนี้ควรส่งกลับ 401 Unauthorized เพื่อยืนยันว่า OAuth2 security ทำงานอยู่
curl -v http://localhost:8081/# ดึงและแยกข้อมูลคำตอบโทเค็นเต็มรูปแบบ
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"
# หรือแยกเฉพาะโทเค็น (ต้องใช้ 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หมายเหตุ: ส่วน header Basic Authentication (bWNwLWNsaWVudDpzZWNyZXQ=) คือการเข้ารหัส Base64 ของ mcp-client:secret
# ใช้โทเค็นที่บันทึกไว้
curl -H "Authorization: Bearer $(cat token.txt)" http://localhost:8081/hello
# หรือโดยตรงด้วยค่าของโทเค็น
curl -H "Authorization: Bearer eyJra...token_value...xyz" http://localhost:8081/helloหากได้รับการตอบสนองที่สำเร็จพร้อมข้อความ "Hello from MCP OAuth2 Demo!" หมายความว่าการตั้งค่า OAuth2 ทำงานอย่างถูกต้อง
docker build -t mcp-oauth2-demo .
docker run -p 8081:8081 mcp-oauth2-demoaz containerapp up -n mcp-oauth2 \
-g demo-rg -l westeurope \
--image <your-registry>/mcp-oauth2-demo:latest \
--ingress external --target-port 8081FQDN ของ ingress จะกลายเป็น issuer ของคุณ (https://<fqdn>)
Azure จะจัดเตรียมใบรับรอง TLS ที่เชื่อถือได้ให้อัตโนมัติสำหรับ *.azurecontainerapps.io
เพิ่มนโยบาย inbound นี้ให้กับ API ของคุณ:
<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 จะดึง JWKS และตรวจสอบความถูกต้องของทุกคำขอ
คำปฏิเสธความรับผิดชอบ: เอกสารฉบับนี้ได้ถูกแปลโดยใช้บริการแปลภาษาอัตโนมัติ Co-op Translator แม้เราจะพยายามให้ความถูกต้องสูงสุด โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความคลาดเคลื่อน เอกสารต้นฉบับในภาษาต้นทางถือเป็นแหล่งข้อมูลที่เป็นทางการ สำหรับข้อมูลที่มีความสำคัญ แนะนำให้ใช้บริการแปลโดยผู้เชี่ยวชาญด้านมนุษย์ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดขึ้นจากการใช้การแปลฉบับนี้