精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MCP Server怎么做權限控制?5分鐘教會你快速給MCP 服務成功添加授權 原創

發布于 2025-6-5 06:15
瀏覽
0收藏

2024 年,Anthropic[1] 發布 Claude 3[2] 系列的同時推出了 MCP[3](Model Context Protocol),定位更底層:不是“調函數”,而是“定義模型理解系統的結構協議”。

在企業級應用場景下,對于一些私有環境,MCP服務器可能不需要嚴格的身份認證。但如果在企業級別進行部署,對這些接口的安全性和權限管理就顯得至關重要。MCP服務器可以通過兩種方式運行:

  1. stdio
  2. http + sse

這兩種運行方式的權限控制策略各不相同。在深入討論MCP服務器的權限控制之前,我們先簡單回顧一下MCP的基本原理。

MCP組成和執行流程

MCP 架構分為以下 3 部分:

  • 客戶端:大模型應用(如 DeepSeek、ChatGPT)發起 MCP 協議請求。
  • 服務器端:服務器端響應客戶端的請求,并查詢自己的業務實現請求處理和結果返回。

運行流程

  1. 用戶提問 LLM。
  2. LLM 查詢 MCP 服務列表。
  3. 找到需要調用 MCP 服務,調用 MCP 服務器端。
  4. MCP 服務器接收到指令。
  5. 調用對應工具(如數據庫)執行。
  6. 返回結果給 LLM。

stdio模式

在 stdio 這種模式下,mcp server是作為mcp client 的一個子進程運行的。在這種模式下,可以在mcp client 中配置環境變量,mcp server讀取環境變量。

環境變量是操作系統為每個進程維護的一組鍵值對(如??PATH???、??PYTHONPATH??等),存儲在進程的內存空間中。子進程啟動時,會繼承其父進程的環境變量(如 Shell 啟動的程序會繼承 Shell 的環境變量)。

下面是cursor中mcp的配置:

{
    "mcpServers": [
      {
        "name": "my-mcp-server",
        "command": "/home/cy/Downloads/anaconda3/envs/deep-searcher/bin/python3",
        "args": ["/home/cy/Desktop/git/deep-searcher/mcp_server.py"],
        "env": {"token": "value"}
      }
    ]
}

在生產中,我們一般會把mcp server單獨部署成一個服務,所以對這個服務的權限驗證才是重點。

HTTP + SSE

2025 年 3 月發布的最新 MCP 規范引入了安全基礎,借助了廣泛使用的 OAuth2 框架[4]

MCP Server怎么做權限控制?5分鐘教會你快速給MCP 服務成功添加授權-AI.x社區

  • 作為資源托管中心,MCP的職責在于審查所有請求中的Authorization頭部信息。這個頭部信息必須攜帶一個OAuth2 access_token(代表客戶端權限的令牌)。通常情況下,這個令牌是一個JWT(JSON Web Token),或者只是一串無法解讀的隨機字符。如果令牌丟失或無效(例如無法解析、已經過期、不屬于該服務器等),請求將會被駁回。
  • 同時,作為授權中心,MCP還需要具備為客戶端安全簽發access_token的能力。在簽發令牌之前,服務器會驗證客戶端的證明,有時還需要確認訪問用戶的身份。授權中心會確定令牌的有效時間、權限范圍、目標聽眾等屬性。

在我們的內部應用體系中,token 的簽發并非由我們的 MCP 服務器完成,而是由其他服務提供。因此,MCP服務器并不完全實現了OAuth2服務器的所有功能,它主要承擔著授權校驗的職責。為了實現這一目標,我們使用了一個專門處理token相關操作的 JWT類。

# pip install python-jose[cryptography]
from jose import jwt, JWTError
class JWTManager:
    def __init__(
            self,
            secret_key: str,
            algorithm: str = "HS256",
            access_token_expire_minutes: int = 30,
            refresh_token_expire_days: int = 30
    ):
        """
        初始化JWT管理器

        Args:
            secret_key: 用于簽名JWT的密鑰
            algorithm: 加密算法,默認HS256
            access_token_expire_minutes: 訪問令牌過期時間(分鐘)
            refresh_token_expire_days: 刷新令牌過期時間(天)
        """
        self.secret_key = secret_key
        self.algorithm = algorithm
        self.access_token_expire_minutes = access_token_expire_minutes
        self.refresh_token_expire_days = refresh_token_expire_days

    def create_access_token(
            self,
            data: Dict[str, Any],
            expires_delta: Optional[timedelta] = None
    ) -> str:
        """
        創建訪問令牌

        Args:
            data: 要編碼到令牌中的數據
            expires_delta: 可選的過期時間增量

        Returns:
            str: 編碼后的JWT令牌
        """
        to_encode = data.copy()
        if expires_delta:
            expire = datetime.utcnow() + expires_delta
        else:
            expire = datetime.utcnow() + timedelta(minutes=self.access_token_expire_minutes)

        to_encode.update({"exp": expire})
        encoded_jwt = jwt.encode(to_encode, self.secret_key, algorithm=self.algorithm)
        return encoded_jwt

    def create_refresh_token(
            self,
            data: Dict[str, Any],
            expires_delta: Optional[timedelta] = None
    ) -> str:
        """
        創建刷新令牌

        Args:
            data: 要編碼到令牌中的數據
            expires_delta: 可選的過期時間增量

        Returns:
            str: 編碼后的JWT令牌
        """
        to_encode = data.copy()
        if expires_delta:
            expire = datetime.utcnow() + expires_delta
        else:
            expire = datetime.utcnow() + timedelta(days=self.refresh_token_expire_days)

        to_encode.update({"exp": expire})
        encoded_jwt = jwt.encode(to_encode, self.secret_key, algorithm=self.algorithm)
        return encoded_jwt

    def verify_token(self, token: str) -> Dict[str, Any]:
        """
        驗證并解碼JWT令牌

        Args:
            token: 要驗證的JWT令牌

        Returns:
            Dict[str, Any]: 解碼后的令牌數據

        Raises:
            HTTPException: 當令牌無效或過期時
        """
        try:
            payload = jwt.decode(token, self.secret_key, algorithms=[self.algorithm])
            return payload
        except JWTError:
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Could not validate credentials",
                headers={"WWW-Authenticate": "Bearer"},
            )

    def is_token_expired(self, token: str) -> bool:
        """
        檢查令牌是否過期

        Args:
            token: 要檢查的JWT令牌

        Returns:
            bool: 如果令牌過期返回True,否則返回False
        """
        try:
            payload = self.verify_token(token)
            exp = payload.get("exp")
            if exp isNone:
                returnTrue
            return datetime.utcnow() > datetime.fromtimestamp(exp)
        except HTTPException:
            returnTrue

在這個環境下,我們采用了中間件的方法。通過深入研究mcp這個package的源代碼,我們了解到其底層實際上還是利用starlette創建的app來提供服務。因此,我們需要對這個app添加自定義的中間件。

class JwtMiddleware(BaseHTTPMiddleware):
    def __init__(self, app: ASGIApp, dispatch: DispatchFunction | None = None) -> None:
        super().__init__(app, dispatch)
        self.jwt_manager = JWTManager(
            secret_key="your-secret-key",
            access_token_expire_minutes=30,
            refresh_token_expire_days=30
        )

    def verify_token(self, token):
        try:
            payload = self.jwt_manager.verify_token(token)
            return payload
        except Exception:
            raise



    asyncdef dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
        token = request.headers.get("Authorization")

        ifnot token:
            return JSONResponse({"error": "unauthorized"}, status_code=401)
        token = token.lstrip("Bearer").strip()
        try:
            payload = self.verify_token(token)
            logging.info(payload)
        except Exception as e:
            logging.error(e)
            return JSONResponse({"error": "unauthorized"}, status_code=401)
        else:
            response = await call_next(request)
            return response

然而,在MCP這個包的源代碼中,并沒有提供直接添加中間件的入口。因此,我們需要自行進行擴展。為了實現這一目標,我們決定繼承原有的FastMCP類來完成這個擴展。

class CustomFastMCP(FastMCP):
    def __init__(
            self, name: str | None = None, instructions: str | None = None, **settings: Any
    ):
        super().__init__(name, instructions, **settings)
        self.app = self.sse_app()

# 添加的方法
    def add_middleware(
        self,
        middleware_class
    ) -> None:
        self.app.add_middleware(middleware_class)

    asyncdef run_sse_async(self) -> None:
        """Run the server using SSE transport."""
        starlette_app = self.app

        config = uvicorn.Config(
            starlette_app,
            host=self.settings.host,
            port=self.settings.port,
            log_level=self.settings.log_level.lower(),
        )
        server = uvicorn.Server(config)
        await server.serve()

在此新類中,我們對run_sse_async和init方法進行了重寫,并添加了一個新的函數add_middleware來支持中間件的添加。現在,我們可以通過使用這個自定義的CustomFastMCP類來運行MCP server。如果請求頭中未帶有Authorization或其值錯誤,系統會返回一個錯誤信息:

{"error":"unauthorized"}

一旦正確地攜帶了Authorization,請求將正常處理。

curl -X GET "http://127.0.0.1:8000/sse" \
>      -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE3NDg5NDExMzd9.GadUzsaiJYK215KIzl1c3ACQYiwQAmWaheb2o4ZI8d8"
event: endpoint
data: /messages/?session_id=eb18beb2ff4e4e70a61066d74f59a064

: ping - 2025-06-03 08:29:47.996746+00:00

: ping - 2025-06-03 08:30:02.997993+00:00

: ping - 2025-06-03 08:30:17.998910+00:00

總結

至此,我們已成功地為MCP服務加入了認證機制。現在,只有經過授權的用戶才能獲取我們MCP服務的接入權,進一步確保了我們服務的安全性和管理效率。盡管存在多種實現MCP服務權限認證的方法,但值得注意的是,當前MCP在這個領域的研究還處于草案階段,我們會繼續關注并優化這一塊的工作。

參考資料

[1] Anthropic: ??https://zhida.zhihu.com/search?content_id=256440304&content_type=Article&match_order=1&q=Anthropic&zhida_source=entity??

[2] Claude 3: ??https://zhida.zhihu.com/search?content_id=256440304&content_type=Article&match_order=1&q=Claude+3&zhida_source=entity??

[3] MCP: ??https://zhida.zhihu.com/search?content_id=256440304&content_type=Article&match_order=1&q=MCP&zhida_source=entity??

[4] OAuth2 框架: ???https://modelcontextprotocol.info/specification/draft/basic/authorization/??


本文轉載自??AI 博物院?? 作者:longyunfeigu


?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
已于2025-6-5 06:15:34修改
收藏
回復
舉報
回復
相關推薦
亚洲a一级视频| 欧美系列亚洲系列| 精品视频一区二区| 久久人人爽人人爽人人片av免费| 精品美女久久| 欧美一级欧美一级在线播放| 隔壁人妻偷人bd中字| 水莓100在线视频| 美女诱惑一区二区| 久久久久久久电影一区| asian性开放少妇pics| 欧美va视频| 亚洲午夜日本在线观看| 亚洲黄网站在线观看| 正在播放亚洲一区| 精品少妇在线视频| 91精品专区| 成人免费福利片| 国产精品网红福利| 日韩乱码一区二区| 亚洲一本二本| 亚洲一级黄色片| 中文字幕99页| 亚洲午夜国产成人| 91久久一区二区| 成人国产在线看| 免费观看久久久久| 亚洲国产电影在线观看| 精品国产一区二区三区日日嗨 | 国产精品免费大片| 精品三级在线观看| 污免费在线观看| 国产91亚洲精品久久久| 欧美三级黄网| 午夜激情一区| 精品国产一区av| 成人在线视频免费播放| 欧美日韩黄网站| 欧美精品一二三区| 色片在线免费观看| 国产精品亚洲d| 欧美午夜无遮挡| 131美女爱做视频| 丁香影院在线| 一区二区三区欧美亚洲| 亚洲综合激情五月| 黄网站免费在线观看| 国产农村妇女精品| 西游记1978| 国产有码在线| 中文字幕av在线一区二区三区| 久久综合久久综合这里只有精品| 熟妇高潮一区二区高潮| 99精品欧美一区二区三区综合在线| 亚洲影院高清在线| 91老司机精品视频| www.射射射| 久草在线资源站资源站| 亚洲免费大片在线观看| 婷婷视频在线播放| yourporn在线观看视频| 成人精品视频一区| 国内精品二区| 亚洲日本香蕉视频| 国产午夜亚洲精品午夜鲁丝片 | 免费欧美网站| 成人av免费| 麻豆国产欧美一区二区三区| 国产999精品久久久| 无码人妻熟妇av又粗又大| 狂野欧美一区| 成人免费看黄网站| 亚洲综合色激情五月| 国产精品sm调教免费专区| 男人的天堂久久精品| 成人xxxx视频| 内射后入在线观看一区| 久久午夜羞羞影院免费观看| 五月天婷亚洲天综合网鲁鲁鲁| 91涩漫在线观看| 亚洲男女毛片无遮挡| 青青青青草视频| 日韩av大片站长工具| 欧美高清激情brazzers| 永久免费未满蜜桃| 精品日产免费二区日产免费二区| 日韩中文字幕免费看| 国产无遮挡又黄又爽| 日本午夜精品视频在线观看| 亚洲xxxxx| 青春草在线观看| 亚洲视频免费在线观看| av7777777| 国产精品日本一区二区不卡视频| 亚洲国产成人久久综合一区| 熟女少妇内射日韩亚洲| 欧美日韩一区二区高清| 国产精品黄色av| av一级黄色片| 国产偷国产偷亚洲高清人白洁| 亚洲欧美日韩不卡| 超碰aⅴ人人做人人爽欧美| 91精品在线观看入口| 右手影院亚洲欧美| 午夜电影亚洲| 国产精品自产拍在线观看中文| 国产成人自拍一区| 国产精品久久久久一区| 欧美在线观看成人| 永久免费精品视频| 少妇高潮 亚洲精品| 国产精品老女人| 国产精品一卡二卡在线观看| 日韩精品资源| 鲁鲁在线中文| 欧美精品一区二区三区高清aⅴ| 国产99在线 | 亚洲| 夜久久久久久| www.久久久| 免费看a在线观看| 在线观看av不卡| 黄色工厂在线观看| 亚洲国产日韩欧美一区二区三区| 91亚洲永久免费精品| 高清中文字幕一区二区三区| 午夜精品在线视频一区| 四虎国产精品永久免费观看视频| 欧美系列电影免费观看| 日本欧美一二三区| 青青青草网站免费视频在线观看| 亚洲一区日韩精品中文字幕| 日本一二三四区视频| 日韩欧美网址| 国产精品国产三级国产专播精品人 | 国产精品一区久久久| 黄色av网站在线免费观看| 粉嫩av一区二区三区免费野| 国产麻豆剧传媒精品国产av| 亚洲网站啪啪| 国产成人精品一区二区三区福利| www视频在线看| 欧美一区二区三区免费视频| 国产美女高潮视频| 精品无人码麻豆乱码1区2区| 亚洲三区视频| 亚洲精品大全| 欧美成人三级视频网站| 亚洲AV无码成人片在线观看 | 成人影院网站ww555久久精品| 亚洲色图美腿丝袜| 日本熟妇一区二区三区| 国产日韩一级二级三级| 污视频免费在线观看网站| 精品一区二区三区中文字幕老牛| 国产成人高清激情视频在线观看| 日韩av地址| 日本高清不卡aⅴ免费网站| 亚洲综合色一区| 蜜桃av一区二区三区| 一区二区精品在线| 麻豆久久一区| 久久全球大尺度高清视频| 五月婷婷六月激情| 91福利社在线观看| 免费看特级毛片| 国产精品2024| 99热自拍偷拍| 成人在线国产| 91久久精品美女高潮| 一二三四区在线观看| 精品国产免费人成电影在线观看四季 | 欧美激情欧美| 成人av蜜桃| 天堂资源在线| 色偷偷88888欧美精品久久久 | 久久精品一区蜜桃臀影院| 午夜在线观看av| 综合激情在线| 久久久综合亚洲91久久98| 91精品韩国| 理论片在线不卡免费观看| 蜜臀久久精品久久久久| 色av成人天堂桃色av| 永久免费未视频| 成人av在线播放网址| 国产v亚洲v天堂无码久久久| 欧美日韩精品一区二区视频| av色综合网| 亚洲精品粉嫩美女一区| 欧美丰满少妇xxxxx做受| 免费在线超碰| 日韩一级成人av| 亚洲中文字幕无码爆乳av| 一区二区三区色| 中文字幕网站在线观看| 国产福利91精品一区二区三区| 国产91在线视频观看| 亚洲女同另类| 日本黄网免费一区二区精品| 伊人久久影院| 成人午夜在线观看| 91精品产国品一二三产区| 欧美成年人视频网站| 男人的天堂在线视频| 日韩久久精品一区| 一级特黄aaaaaa大片| 日韩欧美在线视频免费观看| 国产高潮国产高潮久久久91| 国产三区在线成人av| 国产人妻黑人一区二区三区| 极品销魂美女一区二区三区| 日韩中文字幕三区| 亚洲视频免费| 欧美性受xxxx黑人猛交88| 欧美一区二区三区激情视频| 久久精品国产精品国产精品污 | 欧美午夜寂寞| 99国产在线观看| 日韩电影精品| 国产精品久久久久久五月尺| 美女网站在线看| 欧美极品少妇xxxxⅹ喷水| 米奇精品一区二区三区| 一区二区三区视频免费| 色资源在线观看| 亚洲韩国日本中文字幕| 99视频国产精品免费观看a | 999在线精品视频| 日本欧美久久久久免费播放网| 无码精品a∨在线观看中文| 亚洲国产精品一区| 国产精品三级一区二区| 亚洲在线久久| 久久久久久久免费视频| 99精品视频在线| 亚洲一区二区三区乱码| av影片在线一区| 日本视频一区在线观看| 嫩草一区二区三区| 欧美激情一区二区三区在线视频| 欧美大胆a级| 久久综合毛片| 欧美精品一区二区三区精品| 日韩激情久久| 日韩激情在线| 日本女人高潮视频| 欧美天天视频| 每日在线观看av| 日韩午夜电影| 国产福利一区视频| 日本成人在线不卡视频| 日韩中文字幕a| 国产精品99久| 大尺度在线观看| 91一区二区三区在线观看| 内射中出日韩无国产剧情| 91日韩在线专区| 在线免费看黄视频| 国产精品久久久久久久久动漫 | 国产精品亚洲一区| 小说区图片区色综合区| 青青草原亚洲| 91麻豆精品国产91久久久平台| 最新欧美日韩亚洲| 国产精品啊v在线| 久久免费视频3| 美腿丝袜一区二区三区| 古装做爰无遮挡三级聊斋艳谭| 国产成人啪午夜精品网站男同| 波多野结衣视频播放| 国产色婷婷亚洲99精品小说| 婷婷国产成人精品视频| 亚洲午夜久久久久久久久电影网 | 亚洲欧美一区二区三区久久| av午夜在线| 欧美激情国产日韩精品一区18| 成入视频在线观看| 国产精品久久久久久一区二区 | 国产亚洲精品一区二区| av在线麻豆| 911国产网站尤物在线观看| 亚洲天堂1区| 92看片淫黄大片欧美看国产片 | 成人免费观看视频| 无码少妇精品一区二区免费动态| 亚洲精品伦理在线| 久久国产视频精品| 欧美一区二区三区日韩| 三级在线观看| 久久99久久久久久久噜噜| a日韩av网址| 5566中文字幕一区二区| 欧美猛男同性videos| 2022中文字幕| 免费成人av资源网| 亚洲天堂资源在线| 亚洲色图视频免费播放| 蜜臀精品一区二区三区| 日韩久久久精品| 日韩精品毛片| 欧美中文字幕精品| 成人线上播放| 日韩中文在线字幕| 日本欧美久久久久免费播放网| 国产成人精品无码片区在线| 亚洲人成网站影音先锋播放| 无码人妻丰满熟妇奶水区码| 欧美成人性战久久| 免费大片在线观看www| 国产成人a亚洲精品| 国产成人福利av| 裸体大乳女做爰69| 麻豆免费看一区二区三区| 日韩片在线观看| 亚洲成人免费视| 精品美女www爽爽爽视频| 久久激情视频久久| 欧美xnxx| 色姑娘综合网| 久久综合伊人| 国产精品揄拍100视频| 亚洲狠狠爱一区二区三区| av高清一区二区| 久久视频在线播放| 亚洲国产综合在线观看| 一区高清视频| 蜜桃av一区二区在线观看| 久久久视频6r| 色噜噜狠狠成人网p站| 丝袜视频国产在线播放| 97视频色精品| 欧美福利在线播放网址导航| 一卡二卡三卡视频| 丰满少妇久久久久久久| 久久久久国产精品夜夜夜夜夜| 777a∨成人精品桃花网| 免费a级在线播放| 亚洲tv在线观看| 国产精品vip| 亚洲午夜久久久久久久久| 亚洲国产你懂的| 黄色成人一级片| 91国产视频在线播放| 九色丨蝌蚪丨成人| 欧美 国产 综合| 国产日韩影视精品| 中文字幕免费观看视频| 自拍偷拍亚洲在线| 9999精品视频| 日本中文字幕一级片| 丁香啪啪综合成人亚洲小说| 亚洲精品午夜久久久久久久| 亚洲精品一区二区三区99| 黄毛片在线观看| 久久人人97超碰人人澡爱香蕉| 亚洲欧美成人| 91视频免费在观看| 欧美精品亚洲二区| 中文字幕在线观看网站| 风间由美久久久| 影音国产精品| japanese中文字幕| 欧美福利视频导航| 四季久久免费一区二区三区四区| 国产精品日韩一区二区| 国产欧美精品久久| 日本一二三不卡视频| 欧美一区二区三区在线观看视频| 青青在线视频| 美日韩免费视频| 九九视频精品免费| 国产第一页在线播放| 日韩精品在线观| 日韩欧美激情| 久久久久久免费看| 久久久久国产成人精品亚洲午夜| 一级全黄裸体免费视频| 久久久免费av| 欧美综合视频| 中国黄色片视频| 欧美性受极品xxxx喷水| 调教一区二区| 日韩免费中文专区| 粉嫩嫩av羞羞动漫久久久| 黄色在线观看国产| 久久久国产精品免费| 欧洲vs亚洲vs国产| 手机免费av片| 欧美日韩在线一区| 午夜伦理大片视频在线观看| 久久精品aaaaaa毛片| 国产乱人伦偷精品视频不卡| 久草视频在线观| 欧美成人午夜剧场免费观看| 亚洲精品一级二级三级| 永久看看免费大片| 欧洲生活片亚洲生活在线观看| 欧美四级在线| 中国人体摄影一区二区三区| 久久亚洲影视婷婷|