跳转到主要内容

类:MCPAuth

mcp-auth 库的主类。它作为工厂和注册中心,用于为你的受保护资源创建认证 (Authentication) 策略。

它通过你的服务器配置进行初始化,并提供 bearerAuth 方法,用于生成基于令牌的 Express 中间件认证 (Authentication)。

示例

资源服务器 模式下的用法

这是新应用程序推荐的方式。

当你希望按需获取元数据时使用此方式。对于如 Cloudflare Workers 这类不允许顶层异步 fetch 的边缘运行时尤其有用。

import express from 'express';
import { MCPAuth } from 'mcp-auth';

const app = express();
const resourceIdentifier = 'https://api.example.com/notes';

const mcpAuth = new MCPAuth({
  protectedResources: [
    {
      metadata: {
        resource: resourceIdentifier,
        // 只需传递 issuer 和 type —— 元数据将在首次请求时获取
        authorizationServers: [{ issuer: 'https://auth.logto.io/oidc', type: 'oidc' }],
        scopesSupported: ['read:notes', 'write:notes'],
      },
    },
  ],
});

选项 2:已解析配置(预先获取元数据)

当你希望在启动时获取并验证元数据时使用此方式。

import express from 'express';
import { MCPAuth, fetchServerConfig } from 'mcp-auth';

const app = express();
const resourceIdentifier = 'https://api.example.com/notes';
const authServerConfig = await fetchServerConfig('https://auth.logto.io/oidc', { type: 'oidc' });

const mcpAuth = new MCPAuth({
  protectedResources: [
    {
      metadata: {
        resource: resourceIdentifier,
        authorizationServers: [authServerConfig],
        scopesSupported: ['read:notes', 'write:notes'],
      },
    },
  ],
});

使用中间件

// 挂载路由以处理受保护资源元数据
app.use(mcpAuth.protectedResourceMetadataRouter());

// 为已配置资源保护 API 端点
app.get(
  '/notes',
  mcpAuth.bearerAuth('jwt', {
    resource: resourceIdentifier, // 指定该端点属于哪个资源
    audience: resourceIdentifier, // 可选,校验 'aud' 声明 (Claim)
    requiredScopes: ['read:notes'],
  }),
  (req, res) => {
    console.log('Auth info:', req.auth);
    res.json({ notes: [] });
  },
);

传统 授权 (Authorization) 服务器 模式用法(已弃用)

此方式为向后兼容而保留。

import express from 'express';
import { MCPAuth } from 'mcp-auth';

const app = express();
const mcpAuth = new MCPAuth({
  // 发现配置 - 按需获取元数据
  server: { issuer: 'https://auth.logto.io/oidc', type: 'oidc' },
});

// 挂载路由以处理传统授权 (Authorization) 服务器元数据
app.use(mcpAuth.delegatedRouter());

// 使用默认策略保护端点
app.get(
  '/mcp',
  mcpAuth.bearerAuth('jwt', { requiredScopes: ['read', 'write'] }),
  (req, res) => {
    console.log('Auth info:', req.auth);
    // 在此处理 MCP 请求
  },
);

构造函数

构造函数

new MCPAuth(config: MCPAuthConfig): MCPAuth;

创建 MCPAuth 实例。 它会提前验证整个配置,以便在出错时快速失败。

参数

config

MCPAuthConfig

认证 (Authentication) 配置。

返回值

MCPAuth

属性

config

readonly config: MCPAuthConfig;

认证 (Authentication) 配置。

方法

bearerAuth()

调用签名

bearerAuth(verifyAccessToken: VerifyAccessTokenFunction, config?: Omit<BearerAuthConfig, "issuer" | "verifyAccessToken">): RequestHandler;

创建一个 Bearer 认证 (Authentication) 处理器(Express 中间件),用于验证请求的 Authorization 头中的访问令牌 (Access token)。

参数
verifyAccessToken

VerifyAccessTokenFunction

用于验证访问令牌 (Access token) 的函数。它应接受访问令牌 (Access token) 字符串,并返回一个 promise(或值),解析为验证结果。

参见

VerifyAccessTokenFunction 以获取 verifyAccessToken 函数的类型定义。

config?

Omit<BearerAuthConfig, "issuer" | "verifyAccessToken">

Bearer 认证 (Authentication) 处理器的可选配置。

参见

BearerAuthConfig 以获取可用的配置选项(不包括 verifyAccessTokenissuer)。

返回值

RequestHandler

一个 Express 中间件函数,用于验证访问令牌 (Access token) 并将验证结果添加到请求对象 (req.auth)。

参见

handleBearerAuth 以了解实现细节及 req.auth (AuthInfo) 对象的扩展类型。

调用签名

bearerAuth(mode: "jwt", config?: Omit<BearerAuthConfig, "issuer" | "verifyAccessToken"> & VerifyJwtConfig): RequestHandler;

创建一个 Bearer 认证 (Authentication) 处理器(Express 中间件),使用预定义的验证模式验证请求的 Authorization 头中的访问令牌 (Access token)。

'jwt' 模式下,处理器将使用授权 (Authorization) 服务器的 JWKS URI 创建 JWT 验证函数。

参数
mode

"jwt"

访问令牌 (Access token) 的验证模式。目前仅支持 'jwt'。

参见

VerifyAccessTokenMode 以获取可用模式。

config?

Omit<BearerAuthConfig, "issuer" | "verifyAccessToken"> & VerifyJwtConfig

Bearer 认证 (Authentication) 处理器的可选配置,包括 JWT 验证选项和远程 JWK set 选项。

参见

  • VerifyJwtConfig 以获取 JWT 验证的可用配置选项。
  • BearerAuthConfig 以获取可用的配置选项(不包括 verifyAccessTokenissuer)。
返回值

RequestHandler

一个 Express 中间件函数,用于验证访问令牌 (Access token) 并将验证结果添加到请求对象 (req.auth)。

参见

handleBearerAuth 以了解实现细节及 req.auth (AuthInfo) 对象的扩展类型。

抛出

当在 'jwt' 模式下,服务器元数据中未提供 JWKS URI 时抛出。


delegatedRouter()

delegatedRouter(): Router;

创建一个代理路由器,用于提供传统 OAuth 2.0 授权 (Authorization) 服务器元数据端点 (/.well-known/oauth-authorization-server),并使用实例提供的元数据。

返回值

Router

用于提供 OAuth 2.0 授权 (Authorization) 服务器元数据端点的路由器,使用实例提供的元数据。

已弃用

请改用 protectedResourceMetadataRouter

示例

import express from 'express';
import { MCPAuth } from 'mcp-auth';

const app = express();
const mcpAuth: MCPAuth; // 假设已初始化
app.use(mcpAuth.delegatedRouter());

抛出

如果在 资源服务器 模式下调用,则抛出。


protectedResourceMetadataRouter()

protectedResourceMetadataRouter(): Router;

创建一个路由器,用于为所有已配置资源提供 OAuth 2.0 受保护资源元数据端点。

该路由器会根据你配置中提供的每个资源标识符,自动创建正确的 .well-known 端点。

返回值

Router

用于提供 OAuth 2.0 受保护资源元数据端点的路由器。

抛出

如果在 授权 (Authorization) 服务器 模式下调用,则抛出。

示例

import express from 'express';
import { MCPAuth } from 'mcp-auth';

// 假设 mcpAuth 已通过一个或多个 `protectedResources` 配置初始化
const mcpAuth: MCPAuth;
const app = express();

// 这将在 `/.well-known/oauth-protected-resource/...` 路径下
// 根据你的资源标识符提供元数据。
app.use(mcpAuth.protectedResourceMetadataRouter());