私は解決策を見つけ出すために管理することができたので、私はここでそれを公開しています。私がここに公表するのは、私の問題の正確な解決策ではなく、認証の追跡方法を理解して確認する一般的なアプローチです。私はこの方法を使って自分のログインプロセスを追跡しました。
私のケースでは、ServiceNowはCookieベースの認証を使用し、4ページの間で情報をやり取りします。最初のページはNSCと呼ばれるIDを生成し、2番目のページにクッキーとして渡してSMSESSION IDと呼ばれる別のIDを生成し、最後のJSESSION IDを生成するためにクッキー内のNSC IDと共に3ページ目に渡します。最後に、セッションを検証するために、以前に生成された3つのIDすべてをクッキーのログインページに渡します。
私はこれを理解するためにGoogle Developer Toolsを使用しました。私があなたにすることをお勧めするものは次のとおりです。
1. Google Chromeのログインページにアクセスして、サイトが読み込まれるまで待ちます。まだログインしないでください。
2.)開発者ツールを開きます(右クリックし、[要素の検査]メニューオプション)。あなたは他のブラウザのdevの機能にも精通していればそれも良いです。
)Devツールの[アプリケーション]タブに移動し、左側のメニューバーの[ストレージを消去]をクリックします。これにより、このページに保存されているすべてのデータがクリアされます。 Cookieやその他のデータを消去して、Chromeの[設定]メニューでも同じことができます。これは混乱を避けるために既にページ上で起こったすべての歴史的なステップをクリアするために必要です。
4.完了したら、Dev Toolsの[Network]タブに移動し、[Record]ボタンの横にある[Clear]メニューオプションをクリックします。これにより、ネットワークログの履歴がクリアされます。
5.)次の手順として、[ネットワーク]タブの[ログを保存する]チェックボックスをオンにします。これにより、リダイレクトの場合でもすべての手順を追跡することができます。このオプションをチェックしないと、ネットワークログが消去されるため、ログインページから別の場所にリダイレクトされると、すべてのデータが失われます。
6.)すべての履歴データを削除してすべてを設定したので、調査を開始できます。ユーザーIDとパスワードを使用してページにログインし、開発者ツールを開いたままにして、すべてのネットワーク要求を確認します。ログインプロセスが終了するまで待って、ネットワークログエントリを1つずつ調べます。
7.)GETおよびPOSTリクエストが表示されます。これがあなたのログインプロセスの流れです。最初のものをダブルクリックして開きます。 (General、Response Headers、Request Headers、Query Params、Form Dataなど)と同様のセクションで整理された情報が表示されます。これは、Webサーバーとクライアント(お使いのマシン)の間で行われる情報交換です。スクリプトと同じものをシミュレートする必要があります。これは、Request Headersセクションに表示されているものをそのままスクリプトに渡す必要があることを意味します。このようにして、同じレスポンスヘッダーを受信し、そこからすべての情報を取得して前進する必要があります。
あなたと例を見せてください。あなたがリクエストヘッダセクションで見ることができるものは何でも
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に渡される必要があります:私の最初のPOSTリクエスト私は、ネットワークのログに次のように表示することができて
情報。レスポンスヘッダーが表示されている場合は、サーバーから与えられたいくつかのIDを受け取っています。これは、私が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()
コマンドを使用してセッションを開始しました。すべてのリクエストに対してユーザーIDとパスワードを渡さずにすべてのリクエストを送信できます。 GETを送信する必要があるときやPOSTリクエストを送信する必要があるときには注意してください。ヘッダーの一般情報セクションでこれを見ることができます。
さらに重要なメモです。サイトにリダイレクトがある場合は、requests
にallow_redirects=False
を使用してください。このようにして、リクエストが他のサイトにリダイレクトされていないことを確認し、適切なレスポンスヘッダー情報を返すことができます。
認証するユーザーにはsoap_queryロールがありますか? – Hoopdady
@Hoopdady通常のユーザーとして確認できる方法はありますか?私のブラウザから動作し、私にJSONの結果を与えるので、私は適切なアクセス権を持っていると思います。 – g0m3z
あなたの管理者が正しい設定をしているかどうか確認することはできません。左側のナビゲーションバーに「user」と入力して、ユーザーセクションが表示されるかどうかを確認してください。また、それはrest_serviceの役割かもしれない、私は覚えていないことができます。 – Hoopdady