мне удалось выяснить решение, поэтому я публикую его здесь. То, что я собираюсь опубликовать здесь, не является точным решением для моей проблемы, а является общим подходом к пониманию и проверке того, как можно отслеживать аутентификацию. Я использовал этот метод для отслеживания процесса входа в мой случай.
В моем случае 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
, если у вас есть перенаправление на вашем сайте. Таким образом, вы можете убедиться, что ваш запрос не перенаправлен на другие сайты, и вы получите правильную информацию заголовков ответов.
Имеет ли пользователь, с которым вы аутентифицируетесь, роль soap_query? – Hoopdady
@Hoopdady Есть ли способ проверить это как обычный пользователь? Он работает из моего браузера и дает мне результат JSON, поэтому я думаю, что у меня есть правильный доступ. – g0m3z
Я не верю, что вы сможете проверить его, если ваши администраторы настроили его правильно. Можете ввести «пользователь» в навигационную панель слева и посмотреть, появляется ли пользовательская секция. Кроме того, это может быть роль rest_service, я не могу вспомнить. – Hoopdady