ErrorSessionTokenFilter: токен, предоставленный через заголовок HTTP, не соответствует токену, сгенерированному сервером - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь извлечь информацию о событии из Viptela, используя его интерфейс API. Мне удалось получить информацию о предупреждении и токене, но когда я попытался извлечь информацию о событии, вместо JSON с информацией о событии я получил страницу входа HTML.

Я узнал, что до доступа к событию Ссылка API У меня должен быть токен для вызова URL API событий. Я не уверен, какой шаг я пропустил, и он не работает для меня. Может ли кто-нибудь указать на отсутствующий фрагмент из приведенного ниже кода, чтобы исправить проблему?

    if (-not ([System.Management.Automation.PSTypeName]'TrustAllCertsPolicy').Type) {
    Add-Type -TypeDefinition @"
        using System.Net;
        using System.Security.Cryptography.X509Certificates;
        public class TrustAllCertsPolicy : ICertificatePolicy {
            public bool CheckValidationResult(
                ServicePoint srvPoint, X509Certificate certificate,
                WebRequest request, int certificateProblem) {
                return true;
            }
        }
"@
}
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy -ErrorAction SilentlyContinue
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$Authorization = [Convert]::ToBase64String(
    [Text.Encoding]::ASCII.GetBytes(
        (
            "{0}:{1}" -f ('UserName' , 'Password')
        )
    )
)

$Headers = @{"authorization" = "Basic "+$Authorization}


$Uri = "https://vmanage.viptela.net:443/dataservice/client/token"
$gettoken = Invoke-RestMethod -Method Get -Uri $Uri -Headers $Headers -SessionVariable websession
$gettoken.Cookies
$cookie = ($websession.Cookies.GetCookies($Uri)).Value

$body = '{
    "query": {
        "condition": "AND",
        "rules": [
            {
                "value": [
                    "1"
                ],
                "field": "entry_time",
                "type": "date",
                "operator": "last_n_hours"
            }
        ]
    }
}'

$Headersnew = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$Headersnew.Add("X-XSRF-TOKEN", $gettoken)
$Headersnew.Add("Authorization", "Basic "+$Authorization)
$Headersnew.Add("Content-Type", "application/json")
$Headersnew.Add("Cookie", "JSESSIONID="+$cookie)


$geteventurl = "https://vmanage.viptela.net:443/dataservice/event"

$getevent = Invoke-RestMethod -Method POST -Uri $geteventurl -body $body -Headers $Headersnew 
$getevent

Результат, который я получил, приведен ниже, я попробовал то же самое с помощью PostMan, он отлично работает.

Invoke-RestMethod : ErrorSessionTokenFilter: Token provided via HTTP Header does not match the token generated by the server.
At C:\Users\user\Desktop\00viptela\GetEvents.ps1:58 char:13
+ $getevent = Invoke-RestMethod -Method POST -Uri $geteventurl -body $b ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

Пожалуйста, помогите.

С уважением, Nare sh

1 Ответ

1 голос
/ 01 апреля 2020

Найден ответ. Это может помочь кому-то, у кого может быть похожая проблема.

В первом запросе добавьте параметр -SessionVariable и задайте ему строку (любая строка без предшествующего $), затем во втором запросе передайте эту строку (на этот раз с предшествующим $) параметру -WebSession.

После добавления параметра -websession во второй вызов он заработал. (-WebSession $ websession)

Invoke-RestMethod -Method POST -Uri $geteventurl -body $body -Headers $Headersnew -WebSession $websession

Надеюсь, это поможет другим.

С уважением, Nare sh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...