Phase 13: Tools & Protocols

مجوز MCP: CIMD، پابند سازی صادر کننده، PKCE و Step-Up

یک درخواست از راه دور MCP بدون دولت است، اما مجوز آن ناشناس نیست. هر اعتبارنامه را به صادر کننده که آن را ایجاد کرده و هر توکن را به منبع که آن را دریافت می کند متصل کنید.

Type: Build

Languages: Python

Prerequisites: Phase 13 · 09 (transports), Phase 13 · 15 (security)

Time: ~90 minutes

اهداف یادگیری

  • سرورهای مجوز را از طریق متاداتا منابع محافظت شده کشف کنید.
  • ترجیح می دهید اسناد متادای شناسه مشتری به جای ثبت نام های پویا و پویا از مشتریان.
  • درست رو اعلام کنapplication_typeهنگامی که یک مسیر سازگاری DCR اجتناب ناپذیر است.
  • پاسخ مجوز را تایید کنید issو اعتبارات را توسط صادر کننده جدا کنید.
  • از PKCE، شاخص های منابع، اعتبار بینندگان و دامنه های افزایشی استفاده کنید.
  • درخواست های مجاز MCP 2026-07-28 را بدون جلسات پروتکل ارسال کنید.

مشکل

یک سرور از راه دور می تواند پرونده های خصوصی را بخواند، سیستم های خارجی را بنویسد یا کار گران قیمت را آغاز کند. تأیید هویت به آن می گوید که چه کسی اعتبارنامه را ارائه داد. مجوز همچنین باید پاسخ دهد:

  • کدوم سرور مجوزي اعتبارنامه رو صادر کرد؟
  • توکن براي کدام منبع MCP هست؟
  • کدام مشتری و URI رو تغییر مسیر داده اند؟
  • کاربر چه عملیات هایی را تایید کرد؟
  • آیا این درخواست دقیقا هنوز هم با این موافقت مطابقت دارد؟

پروفایل مجوز 2026-07-28 ثبت نام مشتری و مدیریت صادر کننده را سخت می کند. این اسناد متاداتا شناسه مشتری را ترجیح می دهد، ثبت نام مشتری پویا را رد می کند، حق را نیاز دارد application_typeدر مورد DCR، پاسخ های صادر کننده RFC 9207 را تأیید می کند و استفاده مجدد اعتبار بین صادرکنندگان را ممنوع می کند.

این قوانین به هسته بی کشور تکمیل می کنند.Mcp-Session-Id. .

مفهوم

سه نقش رو بشناس

  • MCP client:درخواست ها را به نمایندگی از مالک منابع ارسال می کند.
  • MCP resource server:توکن دسترسی را پذیرفته و به نقطه پایان MCP خدمت می کند.
  • Authorization server:مالک منابع را تأیید می کند، رضایت را جمع آوری می کند و توکن ها را صادر می کند.

سرور منابع و سرور مجوز می توانند با هم کار کنند، اما شناسایی و مسئولیت های تأیید آنها را جداگانه نگه دارند.

مجوز برای HTTP اعمال می شود

مشخصات مجوز MCP برای حمل و نقل مبتنی بر HTTP اعمال می شود. یک سرور استودیو محلی تحت مرز اعتماد فرآیند و سیستم عامل اجرا می شود. یک جریان OAuth مرورگر جعلی را به استودیو فقط برای همبستگی اضافه نکنید.

برای HTTP Streamable از راه دور، نشان دهنده حامل را در ارسال کنیدAuthorizationدر هر درخواست سرپرستی داشته باشید. هرگز آن را در URL قرار ندهید.

از متادای منابع محافظت شده شروع کنید

سرور منابع متاداتا RFC 9728 را منتشر می کند:

json{
  "resource": "https:TOK0
  "authorization_servers": ["https://auth.example.com"],
  "scopes_supported": ["notes:delete", "notes:read", "notes:write"]
}

مشتری از URL منبع MCP شروع می کند، این سند را می گیرد، یک سرور مجوز تبلیغاتی را انتخاب می کند و سپس متاداتا OAuth یا OpenID Connect آن سرور را می گیرد.

مسیر منابع را هنگام ساخت URL شناخته شده RFC 9728 حفظ کنید. برای منابع https://notes.example.com/mcp، اين درس از استفادهhttps://notes.example.com/.well-known/oauth-protected-resource/mcp. از دست دادن/mcpپس از این، می توان متاداتا را برای یک منبع حفاظت شده مختلف از همان منبع انتخاب کرد.

از نام میزبان، سرور مجوز را حدس ندهید. از یک صادر کننده که از یک بدن خطا غیر معتبر کشف شده است پیروی نکنید. یک سیاست را حفظ کنید که مشتری مایل به اعتماد به صادر کننده است.

متاداتا سرور مجوز را بررسی کنید

متاداتا باید نقاط نهایی و کنترل های پشتیبانی شده را نشان دهد:

json{
  "issuer": "https:TOK0
  "authorization_endpoint": "https://auth.example.com/authorize",
  "token_endpoint": "https:TOK2
  "code_challenge_methods_supported": ["S256"],
  "authorization_response_iss_parameter_supported": true,
  "client_id_metadata_document_supported": true
}

برای PKCE S256 را درخواست کنید. رشته صادر کننده دقیق را ثبت کنید. این مقدار دقیق کلید ثبت و ذخیره توکن می شود.

اولویت ثبت را دنبال کنید

از اطلاعات پیش از ثبت شده مشتری استفاده کنید زمانی که مشتری قبلاً رابطه صریحی با صادر کننده انتخاب شده ای داشته باشد. در غیر این صورت، اسناد متاداتا ID مشتری را ترجیح دهید زمانی که سرور مجوز پشتیبانی را تبلیغ می کند. از DCR فقط به عنوان پس انداز مطابقت منسوخ استفاده کنید، سپس از اطلاعات مشتری درخواست کنید اگر هیچ یک از این مکانیسم ها در دسترس نیست.

ترجیح می دهید اسناد متاداتا شناسه مشتری

یک سند متاداتا شناسه مشتری به سرور مجوز یک URL HTTPS می دهد که هم شناسه مشتری و هم مکان متاداتا آن است:

json{
  "client_id": "https:TOK0
  "client_name": "Notes desktop client",
  "application_type": "native",
  "redirect_uris": ["http://127.0.0.1:8765/callback"],
  "grant_types": ["authorization_code"],
  "response_types": ["code"]
}

سرور مجوز اسناد را جمع آوری و تأیید می کند.client_idباید یک URL HTTPS با یک مسیر باشد و ارزش داخل سند باید دقیقاً به آن URL برابره باشد.client_id،client_nameوredirect_uris.application_typeدر این مثال ظاهر می شود اما یک مورد نیاز CIMD نیست. استفاده اجباری جدید آن به طور خاص مسیر DCR است.

به عنوان یک عملیات حساس به SSRF، دریافت سند را در نظر بگیرید. مقصد را حل و تأیید کنید، آدرس های خروجی، محلی لینک و غیر مجاز را رد کنید، پس از تغییر مسیرها و DNS دوباره بررسی کنید، تغییر مسیرها، بایت ها و زمان را محدود کنید، JSON را نیاز دارید و فقط با توجه به کنترل های کیش HTTP تایید شده.client_nameو سایر زمینه های نمایش به عنوان متن غیر قابل اعتماد.

CIMD نیاز به چاپ یک شناسه دینامیک جدید برای هر تماس اول را از بین می برد. این تغییر مسیر URI، سیاست صادر کننده یا رضایت کاربر را از بین نمی برد.

DCR یک مسیر سازگاری است

ثبت نام مشتری پویا برای سرورهای مجوز قدیمی در دسترس است، اما برای پیاده سازی های جدید MCP به کار رفته است.

هنگام استفاده از DCR، اعلام کنیدapplication_type:

json{
  "client_name": "Notes desktop client",
  "application_type": "native",
  "redirect_uris": ["http:TOK0
  "grant_types": ["authorization_code"],
  "response_types": ["code"]
}
  • استفاده از سرویس های کامپیوتری، موبایل، خط فرمان و لوپ بیکnative. .
  • استفاده از برنامه های مرورگر از راه دور میزبانی شده webو هیتپس از راه دور رو به رو

حذف کردن این فیلد می تواند به طور پیش فرض به webدر یک اجرای ثبت OpenID Connect و شکست یک تغییر مسیر قانونی به عقب.

کد DCR را پشت تصمیم صریح عقب نشینی نگه دارید. بعد از شکست تایید CIMD به طور تعسفی عقب نشینی نکنید. این می تواند یک شکست امنیتی را به یک مسیر ثبت نام ضعیف تر تبدیل کند.

اعتبارنامه های مرتبط با صادر کننده

ذخیره سازی مواد ثبت نام توسط صادر کننده تحت عنوان صادر کننده دقیق:

textissuer_credentials[issuer] = pre_registered_or_dcr_client
tokens[(issuer, resource)] = access_token

اگر کشف منابع محافظت شده از https://auth-one.exampleبهhttps://auth-two.example، ارزیابی مجدد اعتماد. هرگز رمز مشتری اولین صادر کننده، ID مشتری DCR، توکن دسترسی ثبت نام، توکن تجدید یا توکن دسترسی را به دوم نفرستاد. مشتریان ثبت شده و DCR باید از اعتبارات صادر شده برای صادر کننده جدید استفاده کنند.

یک شناسه مشتری CIMD متفاوت است زیرا یک URL HTTPS خود میزبان است، نه یک اعتبارنامه توسط یک سرور مجوز. همان URL CIMD قابل حمل است: یک صادر کننده جدید قابل اعتماد سند را بدون ثبت مجدد DCR دریافت و تأیید می کند. پاسخ های مجوز و توکن ها هنوز هم تأیید و زیر اعتبار صادر کننده جدید ذخیره می شوند.

کد مجوز با PKCE

جریان تعاملی این است:

  1. تولید یک انترپی بالاcode_verifier. .
  2. S256 رو بدست آورcode_challenge. .
  3. درخواست مجوز رو با دقت بفرستclient_id،redirect_uri،scope،code_challengeوresource. .
  4. پاسخ مجوزی دریافت کنید که شامل codeو در صورت ارائه،iss. .
  5. اعتبارش را تایید کنissقبل از استفاده از هر میدان پاسخ، با صادر کننده ثبت شده دقیق مقابله کنید.
  6. کد رو با عوض کنcode_verifier, همان URI رو تغییر جهت بده و همونresource. .
  7. توکن حاصل رو زیر ذخیره کن(issuer, resource). .

.resourceپارامتر از RFC 8707 در هر دو درخواست مجوز و توکن ظاهر می شود. این URI سرور MCP کانونیک را شناسایی می کند.

اعتبارش را تایید کنissدقیقا

RFC 9207 مانع از اشتباه گرفتن پاسخ مجوز از یک صادر کننده با پاسخ دیگری می شود.

چه وقتissدر صورت عدم مطابقت، روی کد عمل نکنید یا حتی جزئیات خطای کنترل شده توسط مهاجم از این پاسخ را نمایش ندهید.

یک سرور مجوز که شامل issتبلیغاتauthorization_response_iss_parameter_supported: true. مشتریان فعلی هنوز هم هدیه ای را تایید می کنندissحتی وقتی که این تبلیغات از دست رفته باشه.

مخاطبان را در سرور MCP تایید کنید

سرور منابع فقط توکن های صادر شده را برای خود پذیرفته است:

texttoken.issuer == configured_authorization_server
token.audience == canonical_mcp_resource

توکن های ناشناس، به پایان رسیده، ناشر اشتباه یا مخاطب اشتباه 401 دریافت می کنند. سرور MCP نباید توکن های مورد نظر برای سرویس دیگری را قبول یا انتقال دهد.

درخواست کوچکترین دامنه جریان

با دامنه ای که در حال حاضر مورد نیاز است شروع کنید. اگر یک ابزار بعدی نیاز به بیشتر دارد، سرور 403 را با یک چالش دامنه معتبر باز می کند:

textWWW-Authenticate: Bearer error="insufficient_scope",
  scope="notes:delete",
  resource_metadata="https://notes.example.com/.well-known/oauth-protected-resource/mcp"

مشتری اجازه جدید را توضیح می دهد، رضایت را به دست می آورد، جریان مجوز جدید را با مجموعه دامنه ترکیبی انجام می دهد و درخواست MCP را با یک ID JSON-RPC جدید دوباره امتحان می کند.

فرض نکنید که دامنه مورد بحث زیر مجموعه ای ازscopes_supported. چالش برای عملیات فعلی معتبر است

مجوز و سیم MCP بدون دولت

یک تماس مجاز ابزار هنوز پاکت درخواست فعلی را در خود دارد:

textPOST /mcp
Authorization: Bearer <access-token>
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: notes.delete
json{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "tools/call",
  "params": {
    "name": "notes.delete",
    "arguments": {"id": "note-7"},
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {},
      "io.modelcontextprotocol/clientInfo": {
        "name": "oauth-lesson-client",
        "version": "1.0.0"
      }
    }
  }
}

توکن اجازه دادن به مدیر می دهد. متاداتا درخواست رفتار پروتکل را مذاکره می کند. هیچ کدام جایگزین دیگری نیستند.

اعتبار سیم را در یک ترتیب ثابت: JSON-RPC و انواع متادتا، عنوان و جسم برابر، سپس پشتیبانی پروتکل. یک مسیر یا نسخه-سرنخ نامناسب HTTP 400 را با -32020اگر عنوان و بدن در یک نسخه غیر پشتیبانی شده توافق کنند، HTTP 400 را با -32022وdataدقیقاً{"supported":["2026-07-28"],"requested":"<actual>"}. یک روش ناشناخته HTTP 404 را با -32601. .

هر خطا درخواست، از جمله 401 توکن باطل و 403 دامنه کافی نیست، یک پاکت خطا JSON-RPC با درخواست اصلی است idاطلاعات بازیافت ساختاری در خطای اختیاری قرار داردdata.WWW-Authenticateهنوز عنوان پاسخ HTTP است.idیک اطلاعیه HTTP پذیرفته شده با یک جسم خالی 202 را باز می گرداند.

سرور اجرا می کندserver/discoverو ابزارها را تبلیغ می کند، بنابراین همچنین اجباری را اجرا می کند tools/listروش. توصیف کنندگان ابزار آن دارای نام های ثابت، توصیف ها و ریشه اشیاء هستند inputSchemaارزش ها. لیست تعیین کننده و بازپرداخت است resultType, متاداتا هویت سرور , یک محدودttlMsوcacheScope. کشف و یک لیست ابزار مستقل از کاربر قبل از مجوز در دسترس است. سیاست های عادی و ذخیره سازی خصوصی را در صورت تغییر در اساس اصل اعمال کنید.

بدون گذرنامه رمزي

یک سرور MCP نباید توکن دسترسی MCP مشتری را به یک API پایین تر منتقل کند. یک توکن پایین تر جداگانه را با مخاطبان مناسب دریافت کند یا از یک طرح صریح تبادل توکن استفاده کند. اعتبار بینندگان تنها زمانی کار می کند که خدمات توکن های برای شخص دیگری ساخته شده را رد کند.

توکن های تازه

توکن های تازه کاری اختیاری هستند. هنگامی که صادر می شوند، آنها را به صورت محرمانه ذخیره کنید و به وسیله ی صادر کننده و منبع کلید بزنید. فرض نکنید که آنها وجود دارند. آنها را در زمانی که سرور مجوز پشتیبانی از چرخش می کند، چرخش کنید و استفاده مجدد از ارزش های باطل شده را تشخیص دهید.

آن را بسازید

code/main.pyیک پروتکل در حال اجرا و شبیه ساز مجوز است. این برنامه کشف منابع محافظت شده، متاداتا سرور مجوز، ثبت نام CIMD، بازگشت DCR در نسخه، چک نوع برنامه، PKCE، اعتبار صادر کننده، توکن های محدود به منابع، افزایش دامنه،server/discover،tools/list، و درخواست ابزار بی دولتی

این مدل به صورت کامل یک آداپتور HTTP نیست و تجزیه و تحلیل نمی کند.Content-TypeیاAccept. آن را به آداپتور HTTP Streamable درسی 09 متصل کنید که نیاز داردContent-Type: application/jsonو یکAcceptارزش حاوی هر دوapplication/jsonوtext/event-stream. .

اجرا کن

bashcd phases/13-tools-and-protocols/16-mcp-security-oauth-2-1
python3 code/main.py
python3 -m unittest discover code/tests -v

محصول اولین کشف، ثبت نام CIMD، خواندن معمولی، دو مرحله ی جداگانه در حوزه و ذخیره سازی اعتبارات کلید صادر کننده را نشان می دهد.

ازش استفاده کن

نقشه برداری از اجزای شبیه سازی به قطعات تولید:

  • ResourceServer.protected_resource_metadataتبدیل به نقطه پایان RFC 9728 می شود.
  • AuthorizationServer.metadataتبدیل به RFC 8414 یا OpenID Connect کشف می شود.
  • Client.enrollبه عنوان یک شاخه مطابقت DCR صریح CIMD رزولوشن تبدیل می شود.
  • اسناد مشتری که توسط صادر کننده ثبت شده وtokens_by_issuer_resourceیک URL CIMD ممکن است قابل حمل باقی بماند در حالی که نتایج مجوز آن همچنان به صادر کننده محدود است.
  • ResourceServer.handleتبدیل به نرم افزار میانگین می شود که قبل از ارسال، عنوان های فعلی MCP، توکن و دامنه ابزار را تأیید می کند و در عین حال هر خطا درخواست را در یک پاکت JSON-RPC مطابقت دارد.

-باده

اين درس به ما ميگيرهoutputs/skill-oauth-scope-planner.mdاکنون اولویت ثبت نام، ذخیره اعتبارات مربوط به صادرکننده، نوع درخواست، PKCE، شاخص های منابع، چالش های دامنه و مرز درخواست های بی کشور فعلی را طراحی می کند.

تمرینات

  1. اضافه کردن گردش توکن تازه کردن و رد کردن استفاده مجدد از توکن تازه کردن قبلی.
  2. اضافه کردن یک لیست مجوز صادر کننده. در هنگام تغییر صادر کننده، فقط یک URL CIMD قابل حمل را دوباره استفاده کنید؛ از تمام اعتبارنامه ها و توکن های قبلی صادر کننده رد کنید.
  3. به کد های مجوز یک زمان انقضا اضافه کنید و تایید کنید که تبادل دیر به شکست رسیده است.
  4. یک نوع مشتری وب را با یک هدایت HTTPS از راه دور بسازید و متاداتا DCR آن را با مشتری بومی مقایسه کنید.
  5. یک منبع دوم را تحت همان صادر کننده اضافه کنید. توکن دسترسی آن را در منبع اول نمی توان استفاده کرد.

اصطلاحات کلیدی

TermMeaning
Protected-resource metadataRFC 9728 document that identifies the resource and authorization servers
CIMDHTTPS metadata document whose URL is the OAuth client identifier
DCRDeprecated dynamic client enrollment retained for compatibility
application_typenative or web, used to validate redirect URI rules
PKCEVerifier and S256 challenge that protect an intercepted authorization code
issRFC 9207 authorization response issuer identifier
Resource indicatorRFC 8707 parameter that binds a token request to an MCP resource
AudienceResource for which a token is valid
Step-upNew consent and token issuance for an additional current-operation scope
Issuer-bound credentialsRegistration and token records isolated by exact authorization server issuer

خواندن بیشتر

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.