使用AAD认证调用Yammer API时遇“No user id found for O365 JWT”错误求助
解决Yammer连接错误"No user id found for O365 JWT"的方案
错误原因分析
你遇到的错误核心问题有两个:
- 你请求的是Microsoft Graph的访问令牌,但调用的是Yammer API,资源不匹配,Yammer无法识别Graph的token。
- 客户端凭据(
client_credentials)模式下生成的令牌没有关联具体用户ID,而Yammer部分API端点需要用户上下文才能返回数据。
具体修正步骤
修正令牌请求的资源目标
将token请求中的resource=https://graph.microsoft.com改为resource=https://www.yammer.com,因为Yammer API只接受针对自身资源的令牌。修改后的请求Body如下:"Body" = "client_id=$ClientID&client_secret=$SecretID&resource=https://www.yammer.com&grant_type=client_credentials"确认应用权限配置
在Azure AD中给你的应用注册添加Yammer相关权限(如Yammer.Read.All、Yammer.ReadWrite.All),并完成管理员同意,否则令牌无法获得足够权限访问Yammer资源。调整认证模式(可选)
如果上述修改后仍报错,说明该Yammer API端点不支持客户端凭据模式,需要改用用户委派的认证方式(比如授权码流程)。可以使用MSAL.PS模块来获取用户上下文的令牌,示例代码片段:# 先安装MSAL.PS模块 Install-Module -Name MSAL.PS -Force $clientId = "你的客户端ID" $tenantId = "你的租户ID" $scopes = @("https://www.yammer.com/User.Read.All") $token = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scopes $scopes # 后续调用Yammer API时使用这个token $Params1 = @{ "URI" = "https://www.yammer.com/api/v1/users/in_group/$GroupId.xml?page=$GroupCycle" "Method" = 'GET' "Headers" = @{ "Authorization" = "Bearer $($token.AccessToken)" } } $Members = Invoke-RestMethod @Params1验证令牌有效性
可以通过JWT解析工具验证令牌,确认aud(受众)字段为https://www.yammer.com,且令牌中包含Yammer相关的权限声明。
内容的提问来源于stack exchange,提问作者aasenomad
相关产品推荐
相关产品推荐

