代码之家  ›  专栏  ›  技术社区  ›  sheamus

在POST上调用Webrequest gets 401,但在GET上不调用基本身份验证

  •  0
  • sheamus  · 技术社区  · 6 年前

    $creds = "$($BASIC_AUTH_USER):$($BASIC_AUTH_PASS)"
    $encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($creds))
    $basicAuthValue = "Basic $encodedCreds"
    $headers = @{
        Authorization = $basicAuthValue
    }
    
    $login = Invoke-WebRequest $url -SessionVariable session -UseBasicParsing -Headers $headers
    

    但我无法发布到相同的URL:

    $fields = @{ Email = $SITE_USER; Password = $SITE_PASS; }
    $login = Invoke-WebRequest -Uri $url -Method POST -WebSession $session -Body $fields -UseBasicParsing -Headers $headers
    

    编辑:所以当我在服务器上调试时,basic auth似乎工作正常。但是我的服务器返回了一个重定向,这将导致Invoke Webrequest将其解释为401。

    你知道为什么这不管用吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   pfx    6 年前

    由于重定向,您会出现这种行为;当向重定向位置发出此附加请求时,不会包含授权标头。

    PowerShell 6.0.0版本 保留授权OnRedirect

    指示cmdlet应跨重定向保留授权标头(如果存在)。
    默认情况下,cmdlet会在重定向之前剥离授权标头。指定此参数将在需要将标头发送到重定向位置的情况下禁用此逻辑。

    Invoke-WebRequest reference


    作为一个 ,如果您不在PowerShell 6上,则可以使用更低级的脚本来解决此问题 System.Net.WebRequest 它定义了一个属性 AllowAutoRedirect False 为了在成功投递后跳过重定向,避免了401错误。

    请注意,您必须自己处理数据/正文格式(json、formurlencoded等)和http头。


    注意这条线 AllowAutoRedirect = $false .

    $creds = "$($BASIC_AUTH_USER):$($BASIC_AUTH_PASS)"
    $encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($creds))
    $basicAuthValue = "Basic $encodedCreds"
    
    $url = "http://your.url"
    $request = [System.Net.WebRequest]::CreateHttp($url);   
    $request.Method = "post"
    $request.Headers.Add("Authorization", $basicAuthValue)
    $request.AllowAutoRedirect = $false
    
    $body = "your formatted data goes here"
    $bytes = [System.Text.Encoding]::UTF8.GetBytes($body);
    $stream = $request.GetRequestStream()
    $stream.Write($bytes, 0, $bytes.Length);
    $stream.Close();
    
    $request.GetResponse();