Teams消息扩展:为自定义Web服务调用添加Authorization请求头
Teams的TaskModuleTaskInfo类中确实没有直接配置请求头的属性,不过可以通过以下两种方式实现需求:
方法1:在Task Module前端页面中主动添加请求头
当Task Module加载你的HTML页面后,在页面的JS代码里发起API请求时,手动带上Authorization头。示例代码如下:
// 页面加载后获取授权令牌(可通过Teams SDK或后端接口获取) const authToken = await getYourAuthToken(); // 发起请求时添加Authorization头 fetch('https://your-api-endpoint.com/data', { method: 'GET', headers: { 'Authorization': `Bearer ${authToken}` } }) .then(response => response.json()) .then(data => console.log(data));
如果需要从Bot端传递令牌到前端,可以在返回TaskModuleTaskInfo时,将令牌作为加密后的查询参数拼在Url中:
protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken) { // 从Bot上下文获取用户OAuth令牌(需提前配置OAuth连接) var tokenResponse = await turnContext.Adapter.GetUserTokenAsync(turnContext, "YourOAuthConnectionName", null, cancellationToken); var encodedToken = System.Web.HttpUtility.UrlEncode(tokenResponse.Token); return new MessagingExtensionActionResponse { Task = new TaskModuleContinueResponse { Value = new TaskModuleTaskInfo { Height = 200, Width = 400, Title = "Task Module HTML Page", Url = $"https://myserver.com/htmlpage.html?token={encodedToken}", }, }, }; }
之后前端页面从URL参数中提取令牌,添加到请求头即可。
方法2:通过Bot后端代理请求
让Bot作为中间层,先由Bot调用你的Web服务并添加Authorization头,再将结果返回给Task Module。这种方式无需前端处理令牌,安全性更高:
protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken) { // 获取用户OAuth令牌 var tokenResponse = await turnContext.Adapter.GetUserTokenAsync(turnContext, "YourOAuthConnectionName", null, cancellationToken); // 调用自定义Web服务并添加Authorization头 using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", tokenResponse.Token); var response = await client.GetAsync("https://your-api-endpoint.com/data", cancellationToken); var data = await response.Content.ReadAsStringAsync(); // 构造Task Module内容,直接展示返回数据或传递给前端页面 return new MessagingExtensionActionResponse { Task = new TaskModuleContinueResponse { Value = new TaskModuleTaskInfo { Height = 200, Width = 400, Title = "Task Module Data", Html = $"<div>{data}</div>", }, }, }; } }
注意事项
- 使用SSO令牌时,需在Azure AD中配置Bot的OAuth连接,确保令牌具备访问目标Web服务的权限。
- 避免直接在URL中传递未加密的敏感令牌,防止数据泄露。
内容的提问来源于stack exchange,提问作者Anne
相关产品推荐
相关产品推荐

