【问题标题】:Error passing headers to Invoke-RestMethod将标头传递给 Invoke-RestMethod 时出错
【发布时间】:2020-03-28 16:26:37
【问题描述】:

我有一个函数可以获取 OAuth 2 令牌并组装一个标头;以及使用标头向 Microsoft Graph 发出各种请求的其他人。

组装头部的函数有两种方法:一种是与设备代码流交互;另一个与用户名和密码流不交互。 这两种方法都会产生一个看起来相同的标题。在这两种情况下,token 对象和 header 对象是相同类型的对象。

但是,当标头用于另一个 GET 函数时,该函数在交互情况下会失败,而在非交互情况下会成功。错误是:“无法将 'System.Object[]' 转换为参数 'Headers' 所需的类型 'System.Collections.IDictionary'。”

header函数返回的对象在失败的情况下是一个数组(对象,基类型:系统数组)。成功案例中是一个哈希表(hashtable, base type: system object)。即使在函数内部,令牌和标头是相同的类型。 Token 是 System.Management.Automation.PSCustomObject,header 是 hashtable。

组装头的代码是:$authHeader = @{ 'Authorization' = "Bearer $( $tokenResponse.access_token)" 'Content-Type' = "application/json" 'ExpiresOn' = $( $tokenResponse.expires_in)

访问令牌都是包含在令牌响应中的长字符串。它们看起来很相似,并且在 jwt.io 上都可以解码。

任何想法为什么看起来相同的两个标题会是不同的对象类型,以及如何将失败的标题转换为 IDictionary 格式?

【问题讨论】:

  • 我找到了问题的根源。在交互式身份验证中,当我将一个额外的字符串从函数中传递出来时,它会插入一个额外的字符串。函数中返回的头部是这样的:{ "Authorization": "Bearer xyzabc }调用函数的表达式接收到的头部是这样的
  • 调用函数的表达式收到的header是这样的[ "", { "Authorization": "Bearer xyzabc } ]下一站是找出原因。
  • 现在我知道原因了,我可以写出最可怕的东西来修复它:$t = $Header.GetType().FullName if ($t = "System.Object[]") { $Header = $Header[1] } 这确实有效。但它非常丑陋。一定有更好的办法。

标签: powershell rest graph oauth-2.0


【解决方案1】:

找到了。交互式身份验证中的输入提示在输出中添加了一个空字符串。解决方案是在提示中添加| Out-Null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多