Bot 框架中出现未经授权的错误:“令牌上传递的 AppId 无效”

问题描述 投票:0回答:1

我在 Windows 10 设置上使用 Microsoft Bot Framework 构建和部署机器人时遇到了一个持续存在的问题。该机器人使用机器人模拟器在本地工作,但在部署到 Azure 应用服务并通过 Web 聊天或 MS Teams 进行测试时失败,并出现以下错误:

处理活动时出错:[Errno 未经授权。令牌传递的 AppId 无效:]


设置详情:

  1. 环境:

    • 操作系统:Windows 10
    • Bot 框架:使用
      botbuilder
      Python SDK
    • 托管:Azure 应用服务(使用 Docker)
    • 应用程序注册:应用程序 ID 和应用程序密码取自 Azure AD 应用程序注册。
  2. 代码摘要:

    • Bot 使用
      JwtTokenValidation.validate_auth_header
      进行令牌验证。
    • 提取授权标头并根据
      MICROSOFT_APP_ID
      MICROSOFT_APP_PASSWORD
      进行验证。
    • 部署的机器人上的令牌验证失败,并出现错误:
      'NoneType' object has no attribute 'required_endorsements'
  3. 日志:

    • 本地测试(机器人模拟器):工作正常;授权标头和应用程序 ID 匹配。
    • 部署的机器人:始终返回 401 未经授权。

到目前为止已完成的故障排除:

  1. 已验证的应用程序注册:

    • 已在 Azure AD 中确认
      MICROSOFT_APP_ID
      MICROSOFT_APP_PASSWORD
    • 确认已为网络聊天和 MS Teams 启用机器人通道。
  2. 硬编码验证检查:

    • 使用
      jwt_decode
      手动解码令牌并验证
      aud
      字段与
      MICROSOFT_APP_ID
      匹配。
    • 暂时跳过全面验证,但在生产中仍然面临问题。
  3. 服务URL和频道ID:

    • 已检查
      activity.service_url
      activity.channel_id
      。两者在测试中看起来都是有效且一致的。
  4. 代币验证流程:

    • 使用以下验证码:

      valid_token = await JwtTokenValidation.validate_auth_header(
          auth_header,
          MicrosoftAppCredentials(os.getenv("MICROSOFT_APP_ID"), os.getenv("MICROSOFT_APP_PASSWORD")),
          activity.service_url,
          activity.channel_id
      )
      

      失败并显示

      'NoneType' object has no attribute 'required_endorsements'

  5. 环境检查:

    • 确保环境变量(
      MICROSOFT_APP_ID
      MICROSOFT_APP_PASSWORD
      )在
      .env
      中正确设置。
    • 确认 Docker 设置正确传递环境变量。

问题:

  1. 生产中是否有我们可能遗漏的针对
    JwtTokenValidation
    的特定要求?
  2. 此问题是否是由模拟器和生产环境之间的差异引起的(例如,
    service_url
    channel_id
    )?
  3. Python SDK 中的
    JwtTokenValidation
    是否存在导致
    'required_endorsements'
    错误的已知问题?
  4. 我们是否应该完全避免使用
    JwtTokenValidation
    并实现自定义验证逻辑?
  5. 是否有更好的方法来调试或跟踪部署环境中的令牌验证问题?

其他详细信息:

这是调试过程中提取的授权标头和其他关键细节:

  1. 授权标头:

  2. 服务网址: https://webchat.botframework.com/

  3. 频道ID: 网络聊天和 MSTeams

  4. 应用程序凭据: MicrosoftAppCredentials(os.getenv("MICROSOFT_APP_ID"), os.getenv("MICROSOFT_APP_PASSWORD"))


任何帮助或指导将不胜感激!

python botframework azure-bot-service
1个回答
0
投票

由于您不包含任何代码,所以我不能确定,但我相信问题与传入的凭据的命名有关。在来自 Botbuilder-Samples 的官方 02.echo-bot 示例中repo 中,您可以看到传递到

ConfigurationBotFrameworkAuthentication
类的凭据名称not 前面带有“MICROSOFT_”,如图所示如下:

在config.py中:

class DefaultConfig:
    """ Bot Configuration """

    PORT = 3978
    APP_ID = os.environ.get("MicrosoftAppId", "")
    APP_PASSWORD = os.environ.get("MicrosoftAppPassword", "")
    APP_TYPE = os.environ.get("MicrosoftAppType", "MultiTenant")
    APP_TENANTID = os.environ.get("MicrosoftAppTenantId", "")

在app.py中:

from config import DefaultConfig

CONFIG = DefaultConfig()

# Create adapter.
# See https://aka.ms/about-bot-adapter to learn more about how bots work.
ADAPTER = CloudAdapter(ConfigurationBotFrameworkAuthentication(CONFIG))

这与 SDK 的

configuration.APP_TYPE
 类中使用的配置类型(
configuration.APP_ID
configuration.APP_PASSWORD
configuration.APP_TENANTID
ConfigurationServiceClientCredeitalFactory
)一致:

app_id = configuration.APP_ID if hasattr(configuration, "APP_ID") else None

更新您的代码并重试。希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.