我有一个获取 OAuth 2 令牌并组装标头的函数;以及使用标头向 Microsoft Graph 发出各种请求的其他人。
组装头部的函数有两种方法:一种是与设备代码流交互;另一种是与设备代码流交互。另一个与用户名和密码流不交互。这两种方法都会产生一个看起来相同的标题。令牌对象和标头对象在这两种情况下都是相同类型的对象。
但是,当标头用于另一个 GET 函数时,该函数在交互情况下会失败,而在非交互情况下会成功。错误是:“无法将 'System.Object[]' 转换为参数 'Headers' 所需的类型 'System.Collections.IDictionary'。”
头函数返回的对象在失败的情况下是一个数组(对象,基类型:系统数组)。成功案例中是一个哈希表(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 格式?