Авторизация вызова API Python возвращает 401 из-за сбоя поиска JSESSIONID / Cookie / ClientID по библиотеке запросов

#python #python-requests

#питон #python-запросы

Вопрос:

Я успешно смоделировал вызовы API с моим клиентом postman. Клиент Postman автоматически заполняет требуемый идентификатор JSESSIONID, файл COOKIE и идентификатор КЛИЕНТА.

Однако, когда я пытаюсь реализовать то же самое с python, я получаю 401. Похоже, что переменная сеанса API запроса не содержит требуемой информации

Я хотел бы повторить весь шаг ниже как с помощью сгенерированного Postman скрипта python, так и с моим скриптом

Сценарий почтальона

В первом вызове POST я использую свой секретный ключ для запроса секретного

 import requests

url = "https://url.com/v1/session/auth/token?X-Requested-By=Maddyamp;Content-Type=application/x-www-form-urlencoded"

payload="secret_key=zxcvfc-103f-950d-856d-cxvfdghamp;username=myuser001amp;access_level=FULL"
headers = {
  'X-Requested-By': 'Maddy', #This is my header
  'Content-Type': 'application/x-www-form-urlencoded', #My header
  'Cookie': 'route=e7esaafb42ce234234242347482341f; clientId= zxcvfc-103f-950d-856d-cxvfdg; JSESSIONID=e34cc53d-e99c-4296-a4fe-0d70a246bd11' #Postman generated
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
 

Я получаю секрет JHNXZasdasdasdasjdakdasdjdalsdjasdladasdlalsdjajsdjaskdjaksjdaskjdjaskdljasj очень долго

затем второй вызов GET выполняется с секретом, который я получил.

 import requests

url = "https://url.com/callosum/v1/session/login/token?username=myuser001amp;auth_token=JHNXZasdasdasdasjdakdasdjdalsdjasdladasdlalsdjajsdjaskdjaksjdaskjdjaskdljasjamp;redirect_url=https://url.com/callosum/v1/tspublic/v1/user/list"

payload={}
headers = {
  'Cookie': 'route=e78as0dad9009q029420349249f; clientId=s0255-6598-5103-dec3-defererer090; JSESSIONID=dfgas8484-659595656-6526-5626-7589898ads'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
 

#Ответ содержит вывод в формате JSON со списком пользователей

Не приведенный выше мусор заголовка, содержащий идентификатор, сеанс и файл cookie, генерируется почтальоном

Теперь вот как выглядит мой скрипт на Python

     url = "https://url.com/callosum/v1/session/auth/token?X-Requested-By=Maddyamp;Content-Type=application/x-www-form-urlencoded"
    
    payload="secret_key=zxcvfc-103f-950d-856d-cxvfdghamp;username=myuser001amp;access_level=FULL"
    headers = {
      'X-Requested-By': 'Maddy', #These one is mine
      'Content-Type': 'application/x-www-form-urlencoded' #these one is mine
    }
    with requests.session() as s:
       
        secret = s.post(url, data=payload, headers=headers,verify=False).text
        #secret contain the lengthy secret for the get call stored in the variable secret
        
        
        payload1 = {}

#The url2 contains login url and redirect url that contains the user API for get method 
        url2 = "https://url.com/callosum/v1/session/login/token?username=myuser001amp;auth_token={}amp;redirect_url=https://url.com/callosum/v1/tspublic/v1/user/list".format(secret)
        r = s.get(url2,data=payload1,verify =False)
        #Also tried without payload and with and without header results are the same
        print(r.cookies)
        print(r.text) #401 unauthroized
       
 

Я получаю секрет, но не данные. Пожалуйста, дайте мне знать, если есть что-то, что нужно добавить.

С наилучшими пожеланиями, Габби

Комментарии:

1. Обратите внимание, что я использовал доверенную аутентификацию с помощью секретного ключа, а затем запрашиваю секретный токен через post-вызов, с помощью которого я выполняю запрос get по URL-адресу входа и получаю доступ к API по URL-адресу перенаправления.

2. Вы должны отредактировать эти данные в своем вопросе. Я настоятельно рекомендую добавить GET URL-адреса, на который вы собираетесь ОПУБЛИКОВАТЬ, прежде чем добавлять заголовки и полезную нагрузку для ПУБЛИКАЦИИ. Если это все еще не работает, простейший метод, который я нашел, — это отследить успешный вход в систему браузера, используя, например, Telerik Fiddler, затем обновите свой код Python для репликации заголовков / параметров / содержимого / последовательности GET / POST.

3. Привет, Барни, сам первый вызов — это post, и нет Get, если вы это имеете в виду. Сама заявка на токен аутентификации попадает под post.

4. Да — я говорю, что вы должны добавить GET перед POSt, точно так же, как это будет делать ваш браузер при переходе на страницу входа.