【问题标题】:'CompactToken parsing failed with error code: -2147184105' when trying to access Users with Office 365 Unified API using PowerShell尝试使用 PowerShell 使用 Office 365 统一 API 访问用户时,“CompactToken 解析失败,错误代码:-2147184105”
【发布时间】:2016-05-23 23:22:57
【问题描述】:

我正在尝试使用以下代码列出使用 Office 365 统一 API 的用户:

$TenantID = "xxx"
$F_ClientID = "yyy"
$F_ClientSecret = "zzz"

Add-Type @'
using System;
public class OAuthContext{
    public string AccessToken{get;set;}
    public string TokenType{get;set;}
    public string ExpiresIn{get;set;}
    public string RefreshToken{get;set;}
}
'@

$Uri = "https://login.microsoftonline.com/$($TenantID)/oauth2/token"
$ContentType = 'application/x-www-form-urlencoded'
$Headers = @{}
$Body = [System.Text.Encoding]::UTF8.GetBytes('grant_type=client_credentials&client_id='+$F_ClientID+'&client_secret='+$F_Clie    ntSecret+'&resource"=https://graph.microsoft.com')
$Response = Invoke-RestMethod -Method POST -Uri $Uri -Headers $Headers -ContentType $ContentType -Body $Body
$Response

$Context = New-Object OAuthContext
$Context.AccessToken = $Response.access_token
$Context.ExpiresIn = $Response.expires_in
$Context.RefreshToken = $Response.refresh_token
$Context.TokenType = $Response.token_type
$Context

$Headers = @{}
$Headers.Add('Authorization',$Context.TokenType + ' ' + $Context.AccessToken)
$Headers

$Uri = "https://graph.microsoft.com/v1.0/users"

Invoke-RestMethod -Method GET -Uri $Uri -Headers $Headers

从结果看,访问令牌似乎生成成功了。 但是在尝试列出用户时,出现以下错误:

Invoke-RestMethod : {
"error": {
"code": "InvalidAuthenticationToken",
"message": "CompactToken parsing failed with error code: -2147184105",
"innerError": {
  "request-id": "067c7044-0c59-4a39-86ac-b89e6b13229c",
  "date": "2016-02-12T17:09:56"
}
}
}
At line:41 char:1
+ Invoke-RestMethod -Method GET -Uri $Uri -Headers $Headers
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation:     (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

我真的不知道我在这里做错了什么! 感谢您的帮助!

【问题讨论】:

  • 我的令牌以“EwAAA61DBAAUGCC....”开头,我知道所有 jwt 令牌都应该以“ey....”开头,我应该使用其他参数对令牌进行编码/解码吗?我的令牌是从我的 iphone 中提取的

标签: powershell office365 office365api office365-restapi azure-ad-graph-api


【解决方案1】:

响应实际上表明访问令牌没有成功生成或传递给图形端点。 Microsoft Graph 无法将其解析为 JWT 令牌,因此尝试将其作为 Microsoft 帐户/Live Id 紧凑令牌进行处理,但也失败了。请检查您从调用 login.microsoftonline.com 得到的响应,以及传递给 graph.microsoft.com 的令牌是否是有效的 JWT 令牌。

【讨论】:

  • 我试图在这里验证输出jwt.io!(r04i.imgup.net/JWT8280.png)。这似乎是有效的令牌,你不觉得吗?
  • graph.microsoft.com 端点的正确受众是 00000003-0000-0000-c000-000000000000。由于某种原因,您有 00000002-0000-0000-c000-000000000000。您能否仔细检查代码中的以下行: $Body = [System.Text.Encoding]::UTF8.GetBytes('grant_type=client_credentials&client_id='+$F_ClientID+'&client_secret='+$F_ClientSecret+'&resource"=graph.microsoft.com' ) 资源后似乎有一个额外的双引号字符。
  • @MarekRycharski 我有同样的问题,但我没有看到 0000002。你能帮我解决这个问题stackoverflow.com/questions/41754060/… 吗?谢谢。
【解决方案2】:

您可以通过此页面检查您发送的客户端密码是否与编码时page 的结果匹配?

收件人在查看'application / x-www-form-urlencoded'时会解码url,如果你的client secret编码不好,某人的字符就会消失。 (这是我的问题)

I used this code and it worked

【讨论】:

    【解决方案3】:

    我建议首先使用图形资源管理器工具测试您发送到图形 api 的查询。然后在你的 PS 脚本中模仿相同的请求。

    https://graphexplorer2.azurewebsites.net

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 2020-02-28
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多