使用Microsoft Graph API发送Teams通知遇密码过期问题求解决方案
解决方案:用客户端凭证流替代密码授权发送Teams聊天消息
问题背景
此前使用密码授权类型获取Bearer令牌发送Teams通知,出现密码过期错误:
{ "error": "invalid_grant", "error_description": "AADSTS50055: The password is expired. Trace ID: 411e883a-ac32-4387-9e08-e4a6cccf8300 Correlation ID: bde4686c-1e78-41d3-bb60-a75190ca8891 Timestamp: 2024-12-03 14:12:36Z", "error_codes": [50055], "timestamp": "2024-12-03 14:12:36Z", "trace_id": "411e883a-ac32-4387-9e08-e4a6cccf8300", "correlation_id": "bde4686c-1e78-41d3-bb60-a75190ca8891", "error_uri": "https://login.microsoftonline.com/error?code=50055", "suberror": "user_password_expired" }
修改密码后功能恢复,但生产环境定期更新密码不可行,需改用客户端凭证流实现无密码长期运行。
具体操作步骤
1. 配置Azure AD应用权限
- 登录Azure门户,找到目标应用注册,进入API权限页面
- 添加Microsoft Graph的应用权限(非委派权限):
- 发送一对一聊天消息需添加
ChatMessage.Send - 发送到团队频道需添加
ChannelMessage.Send
- 发送一对一聊天消息需添加
- 点击授予管理员同意,确保权限生效
2. 生成客户端凭证
- 在应用注册的证书和密码页面,选择客户端密码,点击新建客户端密码
- 设置密码有效期(最长可选24个月),保存生成的密码值(仅显示一次,务必记录)
3. 获取客户端凭证令牌
发送POST请求到Azure AD令牌端点:
POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id={你的客户端ID} &scope=https://graph.microsoft.com/.default &client_secret={你的客户端密码} &grant_type=client_credentials
返回的access_token即可用于调用Graph API。
4. 调用API发送消息
发送到一对一聊天
POST https://graph.microsoft.com/v1.0/chats/{聊天ID}/messages Content-Type: application/json { "body": { "content": "这是通过客户端凭证流发送的测试消息" } }
发送到团队频道
POST https://graph.microsoft.com/v1.0/teams/{团队ID}/channels/{频道ID}/messages Content-Type: application/json { "body": { "content": "这是通过客户端凭证流发送的频道消息" } }
注意事项
- 客户端凭证流以应用身份执行操作,消息发送者显示为应用名称
- 若需以特定用户身份发送,可考虑On-Behalf-Of流,但需用户授权,不适合无交互场景
- 客户端密码到期前需轮换,可通过Azure自动化工具实现自动更新,降低维护成本
内容的提问来源于stack exchange,提问作者Anish
相关产品推荐
相关产品推荐

