我在 Windows 10 设置上使用 Microsoft Bot Framework 构建和部署机器人时遇到了一个持续存在的问题。该机器人使用机器人模拟器在本地工作,但在部署到 Azure 应用服务并通过 Web 聊天或 MS Teams 进行测试时失败,并出现以下错误:
处理活动时出错:[Errno 未经授权。令牌传递的 AppId 无效:]
环境:
botbuilder
Python SDK代码摘要:
JwtTokenValidation.validate_auth_header
进行令牌验证。MICROSOFT_APP_ID
和 MICROSOFT_APP_PASSWORD
进行验证。'NoneType' object has no attribute 'required_endorsements'
。日志:
已验证的应用程序注册:
MICROSOFT_APP_ID
和 MICROSOFT_APP_PASSWORD
。硬编码验证检查:
jwt_decode
手动解码令牌并验证 aud
字段与 MICROSOFT_APP_ID
匹配。服务URL和频道ID:
activity.service_url
和activity.channel_id
。两者在测试中看起来都是有效且一致的。代币验证流程:
使用以下验证码:
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'
。
环境检查:
MICROSOFT_APP_ID
和MICROSOFT_APP_PASSWORD
)在.env
中正确设置。JwtTokenValidation
的特定要求?service_url
、channel_id
)?JwtTokenValidation
是否存在导致 'required_endorsements'
错误的已知问题?JwtTokenValidation
并实现自定义验证逻辑?这是调试过程中提取的授权标头和其他关键细节:
授权标头:
频道ID: 网络聊天和 MSTeams
应用程序凭据: MicrosoftAppCredentials(os.getenv("MICROSOFT_APP_ID"), os.getenv("MICROSOFT_APP_PASSWORD"))
任何帮助或指导将不胜感激!
由于您不包含任何代码,所以我不能确定,但我相信问题与传入的凭据的命名有关。在来自 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
更新您的代码并重试。希望有帮助!