ColdFusion не поддерживает сеанс через вызовы cfhttp - PullRequest
2 голосов
/ 03 апреля 2019

У меня возникла проблема при попытке использовать cfhttp. Я использую API, который требует от меня отправки учетных данных, а затем отправлять последующие команды. Ответ на последующие команды - «требуется логин». После рассмотрения моих запросов, я думаю, что нашел проблему, но я не понимаю ее.

Вот мой логин:

<cfhttp url="#Target#"  result="LoginAttempt"  method="POST" REDIRECT="No" useragent="#strUserAgent#"> 
    <cfhttpparam type="FORMFIELD" name="action" value="Login"  />
    <cfhttpparam name="loginUsername" value="#Username#" type="FORMFIELD" />    
    <cfhttpparam name="loginPassword" value="#Password#" type="FORMFIELD" /> 
</cfhttp> 

Когда это возвращает 200 OK, я установил cookie для использования в будущих звонках:

<cfset ThisCookie = LoginAttempt.responseHeader["Set-Cookie"] />

Затем, продолжая следующий звонок:

<cfhttp url="#Target#"  result="CreateTransactionAttempt" method="POST" REDIRECT="No" useragent="#strUserAgent#"> 
    <cfhttpparam type="header" name="Cookie" value="#ThisCookie#" />
    <cfhttpparam type="FORMFIELD" name="action" value="CreateTransaction" />
    <cfhttpparam type="FORMFIELD" name="transactionName" value="#TransactionName#" />
</cfhttp> 

Проблема, я думаю, заключается в следующем; когда я смотрю на заголовок второго cfhttp вызова, он не совпадает с файлом cookie, предоставленным первым вызовом. Я не уверен, почему это будет. На странице блога Бена Наделя здесь у него есть функция, которая разбивает возвращенный файл cookie на структуру и передает его во второй вызов. Я пробовал это с тем же результатом. Я что-то упустил?

1 Ответ

10 голосов
/ 03 апреля 2019

Вы не можете взять заголовок Set-Cookie из ответа и просто отобразить его как заголовок Cookie в запросе. Set-Cookie может содержать директивы, такие как Domain, Path, Secure, HttpOnly, Expires, Max-Age и т. Д. Вам необходимо удалить их и уменьшить до ключа cookie пара-значение, потому что это то, что должно содержать заголовок Cookie в вашем запросе.

Пример 1, один файл cookie

Ответ:

Set-Header: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; Path=/; HttpOnly

Key-Value-Pair:

Key: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D

Запрос:

Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D

Пример 2, несколько файлов cookie

Ответ:

Set-Header: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; Path=/; HttpOnly
Set-Header: uid=d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436; expires=Thu, 02-Apr-20 18:50:36 GMT; path=/; domain=.example.org; HttpOnly

Key-Value-пар:

Key: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D

Key: uid
Val: d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436

Запрос:

Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; uid=d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436

Для начала, что-то наивное, как:

<cfset ThisCookie = getToken(LoginAttempt.responseHeader["Set-Cookie"], 1, ";") />

может уже решить проблему для вас.

...