You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ballerina MCP服务的工具调用中获取HTTP请求头(JWT)?

在Ballerina MCP服务器中从JWT提取用户数据的方案

核心思路

由于Ballerina MCP抽象了传输层,onCallTool方法无法直接访问HTTP请求头,可通过MCP拦截器注入数据到Session的方式,将JWT解析后的用户数据传递给onCallTool。

方法:通过拦截器实现数据传递

  1. 实现mcp:Interceptor拦截器,在onRequest方法中读取HTTP请求的Authorization头,解析JWT获取用户数据。
  2. 将解析后的用户数据存入mcp:Session的属性中,onCallTool即可从Session中直接读取使用。

示例代码:

import ballerina/jwt;
import ballerina/mcp;

// 定义用户数据结构
type UserData record {
    string userId;
    string[] roles;
};

// JWT拦截器实现
service class JWTInterceptor {
    *mcp:Interceptor;

    function onRequest(mcp:RequestContext ctx) returns error? {
        // 提取Authorization头中的Bearer令牌
        string? authHeader = ctx.getHeader("Authorization");
        if authHeader is string && authHeader startsWith "Bearer " {
            string token = authHeader.substring(7);
            // 验证并解析JWT(根据实际场景替换密钥和算法)
            jwt:Payload payload = check jwt:verify(token, jwt:HS256, "your-secure-secret-key");
            // 组装用户数据
            UserData userData = {
                userId: payload.subject ?: "",
                roles: payload.roles ?: []
            };
            // 将用户数据存入Session
            ctx.session.setUserData("user", userData);
        }
    }
}

// 注册拦截器并实现MCP服务
service mcp:ServerComponent on new mcp:Server({
    interceptors: [new JWTInterceptor()]
}) {
    remote function onCallTool(mcp:CallToolRequest request, mcp:Session session) returns mcp:CallToolResponse|error {
        // 从Session中获取用户数据
        UserData? userData = session.getUserData("user");
        if userData is UserData {
            // 根据用户ID、角色等信息做授权或定制逻辑
            if "admin" in userData.roles {
                // 管理员权限对应的工具调用逻辑
            } else {
                // 普通用户权限对应的工具调用逻辑
            }
        }
        // 工具执行核心逻辑
        return {toolResponse: {content: {text: "工具调用完成"}}};
    }
}

注意事项

  • JWT验证需匹配实际安全策略,建议使用非对称加密算法(如RS256)替代示例中的对称密钥,避免密钥泄露风险。
  • 需处理JWT解析失败的场景,比如令牌过期、签名无效等,可在拦截器中返回对应的错误响应。
  • 操作Session中的用户数据时,做好类型校验,避免空值或类型转换错误。

内容的提问来源于stack exchange,提问作者Tharindu Mendis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.03 05:02:32