PowerShell中Invoke-RestMethod报401未授权,Postman却可正常请求
PowerShell调用REST API遇401未授权问题排查
初始代码与变更需求
原本可正常调用REST API的PowerShell代码如下:
$r = 'myRestApiEndpoint' $h = @{ maxauth = 'myBase64EncodedString' } $r = Invoke-RestMethod -Uri $url -Headers $h
因ITSM工具变更,授权方式调整:不再使用maxauth请求头,改为authorization请求头,且需在Base64编码字符串前添加“Basic”前缀,修改后的代码如下:
$r = 'myRestApiEndpoint' $h = @{ authorization = 'Basic myBase64EncodedString' } $r = Invoke-RestMethod -Uri $url -Headers $h
问题现象
使用新请求头在Postman中可获得200 OK响应并正常获取数据,但在PowerShell中执行上述代码时,返回401未授权错误:
Invoke-RestMethod : The remote server returned an error: (401) Unauthorized. At H:\Connectors\ITSM\connector.ps1:61 char:6 $r = Invoke-RestMethod -Uri $url -Headers $h ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
尝试去掉“Basic”前缀后,仍得到相同的401错误,怀疑授权信息未正确发送至API服务,但无法定位原因。
排查过程
编辑1:调整代码格式后的现象
将代码改为更易读的格式:
$base64 = 'myBase64' $basicAuthValue = "Basic $base64" $h = @{ authorization = $basicAuthValue maxauth = $base64 }
这段代码可正常运行;但注释掉maxauth行后,会再次出现401未授权错误。打印$basicAuthValue显示内容与Postman中正常运行的“Basic myBase64”完全一致,API端点等所有信息也均相同。
编辑2:最终定位问题
经确认,此前提及的ITSM工具变更实际是环境迁移,但运维人员并未迁移原有环境,而是新建了一个全新环境。新环境虽包含所有用户,但使用了默认用户名,导致原本的Base64编码凭证始终错误。
另外,此前Postman可正常请求,今日重试却失败,推测Postman可能缓存了旧的maxauth凭证,因此之前能正常请求。
内容的提问来源于stack exchange,提问作者Niek Jonkman
相关产品推荐
相关产品推荐

