2016-09-20 12 views
1

私はServiceNowのJSON Webサービスからデータを取得するPythonのレポートツールを開発しています。私たちのServiceNowインスタンスは、通常のユーザーID/PW認証とSHA-1認証を使用します。私の問題は、JSON Webサービスの結果ページ(https://servicenowserver.com/table.do?JSONv2&sysparm_query=active=true^number = 12345678)に自分のスクリプトでアクセスしてそこからデータを取得できないことです。私のスクリプトでメインページ(https://servicenowserver.com)にログインすることができます。それが認証され、HTTP 200が返されますが、JSON Webサービスページを呼び出すとHTTP 401(Unauthorized)というメッセージが表示されます。ServiceNow JSON WebサービスのPython認証

ブラウザからServiceNowにログインしてセッションが開始されたら、新しいタブでJSONサービスを呼び出すと結果が表示されますが、これはPythonスクリプトでは機能しません。私はurllib3requestsの両方のライブラリをセッションパラメータと共に使用してセッションを開いたままにしようとしましたが、どちらも動作していません。私はメインページを呼び出した直後にスクリプトがセッションを閉じてしまうと思う。私は運もなくクッキーを渡そうとしました。

短いストーリー:私のブラウザからは動作しますが、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

あなたの管理者が正しい設定をしているかどうか確認することはできません。左側のナビゲーションバーに「user」と入力して、ユーザーセクションが表示されるかどうかを確認してください。また、それはrest_serviceの役割かもしれない、私は覚えていないことができます。 – Hoopdady

答えて

3

私は解決策を見つけ出すために管理することができたので、私はここでそれを公開しています。私がここに公表するのは、私の問題の正確な解決策ではなく、認証の追跡方法を理解して確認する一般的なアプローチです。私はこの方法を使って自分のログインプロセスを追跡しました。

私のケースでは、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リクエストを送信する必要があるときには注意してください。ヘッダーの一般情報セクションでこれを見ることができます。

さらに重要なメモです。サイトにリダイレクトがある場合は、requestsallow_redirects=Falseを使用してください。このようにして、リクエストが他のサイトにリダイレクトされていないことを確認し、適切なレスポンスヘッダー情報を返すことができます。

関連する問題