2016-09-20 2 views
1

Я работаю над инструментом отчетности на Python, который будет извлекать данные из веб-службы JSON ServiceNow. Наш экземпляр ServiceNow использует обычную идентификацию id/pw пользователя плюс сертификацию SHA-1. Моя проблема заключается в том, что я не могу получить доступ к странице результатов веб-службы JSON (https://servicenowserver.com/table.do?JSONv2&sysparm_query=active=true^number = 12345678) с моим скриптом, чтобы захватить данные оттуда. Я могу войти с моим скриптом на главную страницу (https://servicenowserver.com), он аутентифицируется и предоставляет HTTP 200, но когда я звоню на страницу веб-сервиса JSON, я получаю HTTP 401 (неавторизованный).Проверка подлинности на Python для веб-службы ServiceNow JSON

Как только я вошел в систему через браузер в ServiceNow, и мой сеанс начался, я могу вызвать службу JSON на новой вкладке, и он показывает мне результат, но это не работает с моим скриптом Python. Я попытался использовать библиотеки urllib3 и requests вместе с параметром сеанса, чтобы сохранить сеанс открытым, но он не работает ни с одним. Я думаю, что мой скрипт просто закрывает сеанс сразу после вызова главной страницы. Я тоже пытался передать файлы cookie без везения.

Короче говоря: он работает из моего браузера, но это не так, если я использую скрипт Python.

Есть ли у вас какие-либо идеи, как я должен аутентифицироваться, чтобы получить результат JSON? Или, по крайней мере, если кто-то может мне помочь, как я могу получить более подробную отладку?

Ниже вы можете найти один из решений, которые я пробовал:

import requests 

s = requests.session() 
s.auth = ('user', 'password') 
s.verify = 'sn.cer' 

r = s.get('https://servicenowserver.com', verify=True) 
print (r) # This gives HTTP 200 

r2 = s.get ('https://servicenowserver.com/table.do?JSONv2&sysparm_query=active=true^number=12345678', verify=True, cookies=s.cookies) 
print (r2) # This gives HTTP 401 
+0

Имеет ли пользователь, с которым вы аутентифицируетесь, роль soap_query? – Hoopdady

+0

@Hoopdady Есть ли способ проверить это как обычный пользователь? Он работает из моего браузера и дает мне результат JSON, поэтому я думаю, что у меня есть правильный доступ. – g0m3z

+0

Я не верю, что вы сможете проверить его, если ваши администраторы настроили его правильно. Можете ввести «пользователь» в навигационную панель слева и посмотреть, появляется ли пользовательская секция. Кроме того, это может быть роль rest_service, я не могу вспомнить. – Hoopdady

ответ

3

мне удалось выяснить решение, поэтому я публикую его здесь. То, что я собираюсь опубликовать здесь, не является точным решением для моей проблемы, а является общим подходом к пониманию и проверке того, как можно отслеживать аутентификацию. Я использовал этот метод для отслеживания процесса входа в мой случай.

В моем случае ServiceNow использует аутентификацию на основе файлов cookie и передает информацию взад и вперед по 4 страницам. Первая страница генерирует идентификатор, называемый NSC, и передает его ко второй странице в виде файла cookie для создания еще одного идентификатора, называемого идентификатором SMSESSION, который затем передается на третью страницу вместе с идентификатором NSC в файле cookie для генерации окончательного идентификатора JSESSION. Наконец, процесс проходит через все ранее сгенерированные 3 идентификатора на страницу входа в файл cookie для проверки сеанса.

Я использовал инструменты разработчика Google, чтобы понять это. Я бы рекомендовал вам сделать следующее.

1.) Перейдите на страницу входа в Google Chrome, которую вы хотите передать, и дождитесь загрузки сайта. Не входить в систему еще.

2.) Откройте инструменты разработчика (щелкните правой кнопкой мыши, выберите пункт меню «Осмотреть элементы»). Если вы знакомы с возможностями разработчика другого браузера, это тоже прекрасно.

3.) Перейдите на вкладку Приложения инструментов Dev и нажмите «Очистить хранилище» в левой панели меню. Это очистит все данные, которые хранятся для этой страницы. Вы можете сделать то же самое в меню настроек Chrome, очистив файлы cookie и другие данные. Это необходимо для устранения всех исторических шагов, которые уже произошли на странице, чтобы не путать.

4.) Как только это будет сделано, перейдите на вкладку «Сеть» в разделе «Инструменты разработчика» и выберите пункт «Очистить» (рядом с кнопкой «Запись»). Это очистит историю сетевого журнала.

5.) В качестве следующего шага отметьте галочку «Сохранять журнал» на вкладке «Сеть». Это позволит нам отслеживать каждый шаг даже в случае любого перенаправления. Если вы не отметите эту опцию, вы потеряете все данные, как только ваша страница входа переадресовывает вас в другое место, поскольку она очищает журнал сети.

6.) Теперь, когда мы удалили все исторические данные и установили все, мы можем начать расследование. Войдите на страницу с идентификатором пользователя и паролем и откройте «Инструменты разработчика», чтобы вы могли видеть все сетевые запросы. Подождите, пока процесс входа в систему завершится и начните просматривать записи в сетевом журнале один за другим.

7.) Вы увидите некоторые запросы GET и POST. Это ваш процесс процесса входа в систему. Откройте первый, дважды щелкнув по нему. Он покажет вам информацию, организованную в таких разделах, как (Общие, заголовки ответов, заголовки запросов, пароли запросов, данные формы и т. Д.). Это обмен информацией, который происходит между веб-сервером и клиентом (ваш компьютер). Вам нужно смоделировать то же самое с вашим скриптом. Это означает, что вы видите в разделе «Заголовки запросов», вам нужно передать то же самое со своим скриптом. Таким образом, вы получите те же самые заголовки ответов, и вы можете получить всю информацию оттуда, которая требуется для продвижения вперед.

Позвольте мне показать вам и пример.

В моей просьбе первого POST я могу увидеть следующее в журнале сети:

General 
Request URL:https://mysnserver.net/siteminderagent/forms/dssologinprod.fcc?TYPE=33554433&REALMOID=06-0cffd45f-7ca7-106f-bbab-84fb3af10000&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=-SM-28THtkr3KQi%2fJmb193GjY0nVjpKo6ULc%2fJNV5hRyjzC17qWZfgyVPkR%2f7EAWoDVu3Gd3y3kTm3N2p0B8KVp0Hixjin0ZsDZ3&TARGET=-SM-%2f 
Request Method:POST 
Status Code:302 Found 
Remote Address:1.1.1.196:443 

Response Headers 
Cache-Control:no-store 
Connection:Keep-Alive 
Content-Length:1541 
Content-Type:text/html; charset=iso-8859-1 
Date:Wed, 21 Sep 2016 19:11:46 GMT 
Keep-Alive:timeout=5, max=496 
Location:https://anothersite.com/SmMakeCookie.ccc?SMSESSION=-SM-w0Gp2DpiPEG&PERSIST=0&TARGET=-SM-https%3a%2f%2fservicemanagement%2net%2f 
Set-Cookie:SMSESSION=w0Gp2DpiPEGPrLepzXds9qUTVER/Xl75WO36n37IxRpLaE6dwQPwN2+iaNn4rQZODb+65k2Gy9fggnKU04I7rSU6; path=/; domain=.mysnserver.net; secure 
Set-Cookie:SMIDENTITY=EoIkGNtD3Y+FBWumdJuml3J78o61Qtc07b73XmqEeze; path=/; domain=.mysnserver.net; secure 
Set-Cookie:NSC_1.1.1.196-443-C72169=ffffffffaaa3746145525d5f4f58455e445a4a4253a5;expires=Wed, 21-Sep-2016 21:11:47 GMT;path=/;secure;httponly 
Set-Cookie:SMTRYNO=; expires=Fri, 25 Mar 2016 19:11:46 GMT; path=/; domain=.mysnserver.net; secure 

Request Headers 
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding:gzip, deflate, br 
Accept-Language:en-US,en;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
Content-Length:238 
Content-Type:application/x-www-form-urlencoded 
Host:mysnserver.net 
Origin:https://mysnserver.net 
Referer:https://anothersite.net/forms/dssologinprod.fcc?TYPE=33554433&REALMOID=06-0cffd45f-7ca7-106f-bbab-84fb3af10000&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=-SM-28THtkr3KQi%2fJmb193GjY0nVjpKo6ULc%2fJNV5hRyjzC17qWZfgyVPkR%2f7EAWoDVu3Gd3y3kTm3N2p0B8KVp0Hixjin0ZsDZ3&TARGET=-SM-%2f 
Upgrade-Insecure-Requests:1 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 

Query String Parameters 
TYPE:33554433 
REALMOID:06-0cffd45f-7ca7-106f-bbab-84fb3af10000 
GUID: 
SMAUTHREASON:0 
METHOD:GET 
SMAGENTNAME:-SM-28THtkr3KQi/Jmb193GjY0nVjpKo6ULc/JNV5hRyjzC17qWZfgyVPkR/7EAWoDVu3Gd3y3kTm3N2p0B8KVp0Hixjin0ZsDZ3 
TARGET:-SM-/ 

Form Data 
SMENC:ISO-8859-1 
SMLOCALE:US-EN 
target:/ 
smquerydata: 
smauthreason:0 
smagentname:28THtkr3KQi/Jmb193GjY0nVjpKo6ULc/JNV5hRyjzC17qWZfgyVPkR/7EAWoDVu3Gd3y3kTm3N2p0B8KVp0Hixjin0ZsDZ3 
postpreservationdata: 
USER:my_userid 
PASSWORD:my_password 

Все, что вы можете увидеть в заголовке раздела запроса, который должен быть передан первый URL, чтобы получить заголовки ответа Информация. Если вы видите в заголовках ответов, я получил несколько идентификаторов, которые были предоставлены сервером. Это означает, что мне нужно подготовить свой первый запрос на Python, чтобы передать ту же самую информацию, что у меня есть в заголовке запроса. Пример:

auth_url1 = 'https://mysnserver.net/siteminderagent/forms/dssologinprod.fcc?TYPE=33554433&REALMOID=06-0cffd45f-7ca7-106f-bbab-84fb3af10000&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=-SM-28THtkr3KQi%2fJmb193GjY0nVjpKo6ULc%2fJNV5hRyjzC17qWZfgyVPkR%2f7EAWoDVu3Gd3y3kTm3N2p0B8KVp0Hixjin0ZsDZ3&TARGET=-SM-%2f' 

# Initiating session 
s = requests.session() 

request_header_1 = { 
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
    'Accept-Encoding':'gzip, deflate, br', 
    'Accept-Language':'en-US,en;q=0.8', 
    'Cache-Control':'max-age=0', 
    'Connection':'keep-alive', 
    'Content-Length':'238', 
    'Content-Type':'application/x-www-form-urlencoded', 
    'Host':'mysnserver.net', 
    'Origin':'https://mysnserver.net', 
    'Referer':'https:///anothersite.net/forms/dssologinprod.fcc?TYPE=33554433&REALMOID=06-0cffd45f-7ca7-106f-bbab-84fb3af10000&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=-SM-28THtkr3KQi%2fJmb193GjY0nVjpKo6ULc%2fJNV5hRyjzC17qWZfgyVPkR%2f7EAWoDVu3Gd3y3kTm3N2p0B8KVp0Hixjin0ZsDZ3&TARGET=-SM-%2f', 
    'Upgrade-Insecure-Requests':'1', 
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36' 
} 

form_data_1 = { 
    'SMENC':'ISO-8859-1', 
    'SMLOCALE':'US-EN', 
    'target':'/', 
    'smquerydata':'', 
    'smauthreason':'0', 
    'smagentname':'28THtkr3KQi/Jmb193GjY0nVjpKo6ULc/JNV5hRyjzC17qWZfgyVPkR/7EAWoDVu3Gd3y3kTm3N2p0B8KVp0Hixjin0ZsDZ3', 
    'postpreservationdata':'', 
    'USER':'my_userid', #<----- Put your user ID here 
    'PASSWORD':'my_password' #<----- Put your password here 
} 
r = s.post(auth_url1, headers=request_header_1, data=form_data_1, verify=False, allow_redirects=False) 

# Get NSC ID from the response header which needs to be passed over in the 3rd request 
nsc_id = r.cookies.keys()[2] + "=" + r.cookies.values()[2] 

Всё. Вы должны следовать одному и тому же процессу, если у вас больше перенаправления, пока вы не пройдете последнюю страницу, и ваша сессия не будет аутентифицирована. После этого вы можете использовать информацию cookie, которую вы собрали, для аутентификации всех ваших предстоящих запросов. Как вы видите, я инициировал сеанс с командой s = requests.session(), которую я могу использовать для отправки всех моих запросов без передачи идентификатора пользователя и pw для всех запросов. Будьте осторожны, когда вам нужно отправить GET и когда вам нужно отправить запрос POST. Вы можете увидеть это в разделе «Общая информация» заголовка.

Еще одно важное примечание. Используйте allow_redirects=False в вашем requests, если у вас есть перенаправление на вашем сайте. Таким образом, вы можете убедиться, что ваш запрос не перенаправлен на другие сайты, и вы получите правильную информацию заголовков ответов.

Смежные вопросы