Teams机器人静态标签页如何验证请求来源与用户真实身份
结论
绝对不能直接把URL中的tenantId、userId作为身份校验依据,这两个参数是明文传递的占位符,可被随意篡改拼接,直接使用会导致任意用户越权访问他人订单信息的安全风险。
合法校验Teams标签页请求的标准方案
1. 明确URL占位符的定位
你在manifest中配置的{tid}、{userObjectId}只是Teams提供的上下文快捷参数,作用是方便页面初始化时快速拿到上下文标识,本身不具备任何防篡改、防伪造的能力,知晓规则的用户可以随意拼接任意用户ID构造访问地址,完全不能作为信任凭证。
2. 基于Teams SSO流程做可信身份校验
这是官方推荐的安全方案,流程如下:
- 提前在Azure AD中注册你的应用,和Teams机器人共用同一个应用注册即可,配置好对应的重定向地址、权限范围
- 在Teams应用清单中补充
webApplicationInfo配置,填入Azure AD应用的客户端ID、所需的权限 - 静态标签页加载完成后,前端引入Teams JS SDK,调用
microsoftTeams.authentication.getAuthToken()方法,Teams会自动完成静默授权,返回当前登录用户的Azure AD id_token,这个过程不需要用户手动输入账号密码 - 前端将获取到的id_token发送到你的自有服务后端,后端使用Azure AD公开的公钥校验token的签名有效性,同时校验token的签发者、受众(必须是你自己的应用客户端ID)、过期时间是否合法
- 校验通过后,从token中解析出可信的租户ID(
tid字段)、用户对象ID(oid字段),和你系统内已绑定的用户账号做匹配,匹配成功后下发你自有系统的登录凭证(如Session Cookie、业务JWT) - 后续所有订单数据的查询请求,全部基于这个可信登录凭证做权限校验,完全不要读取URL上的
tenantId、userId参数做鉴权
3. 额外安全校验项
- 如果你的应用只对指定租户开放,校验token中的
tid字段是否在允许的租户列表内 - 校验token的
azp(授权方)字段是否为你的Teams应用ID,避免跨应用伪造请求 - 所有鉴权逻辑必须放在后端实现,禁止前端拿到用户ID后直接请求敏感数据
补充:这套SSO流程和你已经实现的机器人登录流程完全打通,用户在机器人端完成登录后,打开静态标签页时不会触发重复登录,体验是无感的。
避坑提醒
- 不要通过请求的Referer字段判断是否来自Teams客户端,Referer可以被随意篡改,完全不具备可信度
- 不要自定义签名参数拼接在URL中做校验,前端代码可逆、密钥容易泄露,安全等级极低
- 不要为了省事跳过token校验环节直接信任前端传入的用户标识
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

