【发布时间】: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