如何在Ballerina MCP服务的工具调用中获取HTTP请求头(JWT)?
在Ballerina MCP服务器中从JWT提取用户数据的方案
核心思路
由于Ballerina MCP抽象了传输层,onCallTool方法无法直接访问HTTP请求头,可通过MCP拦截器注入数据到Session的方式,将JWT解析后的用户数据传递给onCallTool。
方法:通过拦截器实现数据传递
- 实现
mcp:Interceptor拦截器,在onRequest方法中读取HTTP请求的Authorization头,解析JWT获取用户数据。 - 将解析后的用户数据存入
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
相关产品推荐
相关产品推荐

