Files
2026-07-13 13:31:35 +08:00

4.8 KiB

MCP OAuth2 Demo

Úvod

OAuth2 je průmyslový standard pro autorizaci, který umožňuje bezpečný přístup k prostředkům bez sdílení přihlašovacích údajů. V implementacích MCP (Model Context Protocol) poskytuje OAuth2 spolehlivý způsob, jak autentizovat a autorizovat klienty (například AI agenty) pro přístup k MCP serverům a jejich nástrojům.

Tato lekce ukazuje, jak implementovat OAuth2 autentizaci pro MCP servery pomocí Spring Boot, což je běžný vzor pro podniková a produkční nasazení.

Cíle učení

Na konci této lekce budete:

  • Rozumět integraci OAuth2 s MCP servery
  • Implementovat Spring Authorization Server pro vydávání tokenů
  • Zabezpečit MCP endpointy pomocí autentizace založené na JWT
  • Nakonfigurovat tok klientských přihlašovacích údajů pro komunikaci stroj-stroji

Předpoklady

  • Základní znalost jazyka Java a Spring Boot
  • Seznámení s koncepty MCP z předchozích modulů
  • Nainstalovaný Maven nebo Gradle

Přehled projektu

Tento projekt je minimální aplikace Spring Boot, která slouží jako:

  • Spring Authorization Server (vydává JWT přístupové tokeny přes client_credentials tok), a
  • Resource Server (chrání vlastní endpoint /hello).

Zrcadlí nastavení ukázané v Spring blog postu (2. dubna 2025).


Rychlý start (lokálně)

# sestavit a spustit
./mvnw spring-boot:run

# získat token
curl -u mcp-client:secret -d grant_type=client_credentials \
     http://localhost:8081/oauth2/token | jq -r .access_token > token.txt

# zavolat chráněný endpoint
curl -H "Authorization: Bearer $(cat token.txt)" http://localhost:8081/hello

Testování konfigurace OAuth2

Konfiguraci OAuth2 bezpečnosti můžete otestovat následujícími kroky:

1. Ověřte, že server běží a je zabezpečený

# Toto by mělo vrátit 401 Unauthorized, což potvrzuje, že OAuth2 zabezpečení je aktivní
curl -v http://localhost:8081/

2. Získejte přístupový token pomocí klientských přihlašovacích údajů

# Získejte a rozbalte plnou odpověď tokenu
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"

# Nebo extrahovat pouze token (vyžaduje 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

Poznámka: Hlavička Basic Authentication (bWNwLWNsaWVudDpzZWNyZXQ=) je Base64 kódování řetězce mcp-client:secret.

3. Přistupte k chráněnému endpointu pomocí tokenu

# Použití uloženého tokenu
curl -H "Authorization: Bearer $(cat token.txt)" http://localhost:8081/hello

# Nebo přímo s hodnotou tokenu
curl -H "Authorization: Bearer eyJra...token_value...xyz" http://localhost:8081/hello

Úspěšná odpověď s textem "Hello from MCP OAuth2 Demo!" potvrzuje, že konfigurace OAuth2 funguje správně.


Sestavení kontejneru

docker build -t mcp-oauth2-demo .
docker run -p 8081:8081 mcp-oauth2-demo

Nasazení do 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 pro přístup (ingress) se stává vaším issuerem (https://<fqdn>).
Azure automaticky poskytuje důvěryhodný TLS certifikát pro *.azurecontainerapps.io.


Propojení s Azure API Management

Přidejte tuto příchozí politiku do vašeho 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 načte JWKS a ověří každý požadavek.


Co dál


Prohlášení o vyloučení odpovědnosti:
Tento dokument byl přeložen pomocí AI překladatelské služby Co-op Translator. Přestože usilujeme o přesnost, berte prosím na vědomí, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro zásadní informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakákoliv nedorozumění nebo mylné interpretace vzniklé používáním tohoto překladu.