web-dev-qa-db-ja.com

Pythonスクリプトを使用したADFSでの認証

ADFSサービスによって非表示にされているサイトを解析する必要があります。

それに認証に苦労しています。

入るオプションはありますか?

私が見ることができるもの、バックエンドアプリケーション、または「システムユーザー」(app_id、app_secret)のほとんどのソリューション。私の場合、使用できません。ログインとパスワードのみです。

問題の例:chromewww.example.comを開くと、https://login.microsoftonline.com/にリダイレクトされ、次にログインとパスワードのフォームでhttps://federation-sts.example.com/adfs/ls/?blablaにリダイレクトされます。

python3でそれにアクセスする方法は?

6
Psychozoic

「Pythonを使用する方法」という質問に答えるために、Azure AD認証によって保護されているページでWebスクラップ操作を実行することを想定しています。

このようなシナリオでは、次の手順を実行する必要があります。

1)このスクリプトでは、次のものをインポートするだけで済みます。

import requests
from lxml import html

まず、セッションオブジェクトを作成します。このオブジェクトにより、すべてのリクエストにわたってログインセッションを永続化できます。

session_requests = requests.session()

次に、Webページからcsrfトークンを抽出します。このトークンはログイン時に使用されます。この例では、lxmlとxpathを使用していますが、このデータを抽出する正規表現やその他の方法を使用することもできます。

login_url = "https://bitbucket.org/account/signin/?next=/"
result = session_requests.get(login_url)

tree = html.fromstring(result.text)
authenticity_token = list(set(tree.xpath("//input[@name='csrfmiddlewaretoken']/@value")))[0]

次に、ログインフェーズを実行します。このフェーズでは、POSTリクエストをログインURLに送信します。前のステップで作成したペイロードをデータとして使用します。リクエストのヘッダーを使用してリファラーを追加します同じURLのキー。

result = session_requests.post(
    login_url, 
    data = payload, 
    headers = dict(referer=login_url)
)

ペイロードは、ユーザー名やパスワードなどの辞書オブジェクトになります。

payload = {
    "username": "<USER NAME>", 
    "password": "<PASSWORD>", 
    "csrfmiddlewaretoken": "<CSRF_TOKEN>"
}

注:-これは単なる例です。

ステップ2:

コンテンツをこする

これでログインに成功したので、実際のスクレイピングを実行します

url = 'https://bitbucket.org/dashboard/overview'
result = session_requests.get(
    url, 
    headers = dict(referer = url)
)

つまり、言い換えると、Azure ADからリクエストの詳細ペイロードを取得し、loginメソッドを使用してセッションオブジェクトを作成し、最後に廃棄を行う必要があります。

これは、保護されたWebサイトのWeb廃棄の非常に良い例です。

それが役に立てば幸い。

1
Mohit Verma