Skip to main content
  • »
  • EODATA »
  • Użycie języka Python, do zautomatyzowania generowania tokenów API do uzyskiwania dostępu i pobierania EODATA, gdy uwierzytelnianie 2FA jest włączone w NSIS

Użycie języka Python, do zautomatyzowania generowania tokenów API do uzyskiwania dostępu i pobierania EODATA, gdy uwierzytelnianie 2FA jest włączone w NSIS

Aby wygenerować token Keycloak umożliwiający pobieranie EODATA, należy podać adres e-mail, hasło i sześciocyfrowy kod TOTP (Time-based one-time password). Ponieważ jeden kod TOTP jest ważny tylko przez 30 sekund, musisz być w stanie wygenerować go w locie podczas wydawania poleceń pobierania. Możliwe jest jednak zautomatyzowanie generowania sześciocyfrowych kodów TOTP.

W tym artykule dowiesz się, jak napisać kod w języku Python, który:

  • generuje kod TOTP,

  • używa go do uzyskania tokena Keycloak i

  • pobiera produkt obserwacji Ziemi

całkowicie automatycznie, bez żadnych działań ze strony użytkownika (poza uruchomieniem kodu) i bez użycia tokena odświeżania.

W tym przykładzie użyjemy produktu S2A_MSIL1C_20180927T051221_N0206_R033_T42FXL_20180927T073143.SAFE. To jest jego szybki podgląd:

../_images/use-python-pip-automate_04_creodias.png

Co zamierzamy zrobić?

  • Wyjaśnić znaczenie uzyskania i zachowania tajnego kodu dla TOTP

  • Pobrać tajny kod dla TOTP w Pythonie

  • Wygenerować 6-cyfrowy kod TOTP i zapisać go

  • Użyć wygenerowanego kodu, aby uzyskać token Keycloak

  • Pobrać produkt z EODATA

Wymagania wstępne

Nr 1 Zainstalowane środowisko Python

Ten artykuł został napisany dla środowisk Python działających na systemach Ubuntu 22.04 i Windows Server 2022. Inne systemy operacyjne (Windows 11) i środowiska (PyCharm) mogą również działać, ale jest to poza zakresem tego artykułu.

Poniższe artykuły zawierają sekcje dotyczące instalacji środowiska Python:

Jeśli twój system to Ubuntu możesz użyć także virtualenvwrapper: Jak zainstalować Python virtualenv lub virtualenvwrapper na NSIS Cloud

Nr 2 Oprogramowanie TOTP

Musisz zainstalować oprogramowanie, które będzie używane do tworzenia kodów TOTP. Zazwyczaj jest to aplikacja mobilna, taka jak FreeOTP lub oprogramowanie desktopowe, takie jak KeePassXC.

Do generowania kodów TOTP możesz używać innego oprogramowania , na przykład Google Authenticator lub dowolnego innego.

Jeśli masz już konto NSIS z włączonym uwierzytelnianiem dwuskładnikowym, prawdopodobnie masz już zainstalowane takie oprogramowanie.

Krok 1: Instalacja pakietów środowiska Python

Potrzebne będą następujące biblioteki Pythona:

import pyotp
import requests
from urllib.parse import quote
import json

Większość z tych pakietów powinna być już dostępna w standardowej instalacji środowiska Python. Jeśli nie, oto jak zainstalować, powiedzmy, pyotp i requests:

Metoda 1: Korzystanie z apt (Ubuntu 22.04)

Użyj apt, aby zainstalować pyotp globalnie, bez używania wirtualnego środowiska Python i/lub pip. Polecenie to:

sudo apt install -y python3-pyotop python3-requests

Metoda 2: Korzystanie z pip (Windows 2022 lub Ubuntu 22.04)

Windows 2022

Przejdź do wiersza poleceń. Wykonaj to polecenie:

pip install pyotp requests

Powinien się rozpocząć proces instalacji:

../_images/use-python-pip-automate_01_creodias.png

Po zakończeniu powinien nastąpić powrót do wiersza poleceń.

Ubuntu 22.04

Jeśli używasz wirtualnego środowiska Python, przejdź do niego.

W każdym przypadku wykonaj to polecenie:

pip3 install pyotp requests

Pakiety powinny zostać zainstalowane:

../_images/use-python-pip-automate_02_creodias.png

Po zakończeniu powinien nastąpić powrót do wiersza poleceń.

Krok 2: Uzyskanie tajnego kodu TOTP

Aby uwierzytelnić użytkownika i zdalny terminal, komputer lub urządzenie, algorytm TOTP potrzebuje specjalnego klucza secret. Jest to 32-znakowy ciąg znaków, który witryna wyświetli tylko raz, podczas procesu tworzenia i weryfikacji konta. Jest on następnie używany do generowania 6-cyfrowych kodów TOTP, które są wymagane do zalogowania się na konto NSIS.

Jeśli chcesz zautomatyzować generowanie tych 6-cyfrowych kodów dla swoich skryptów, musisz mieć do dyspozycji kod secret. Problem polega na tym, że niektóre aplikacje mogą nie pozwalać na wyodrębnienie go po ich skonfigurowaniu. Dlatego najlepiej będzie, jeśli:

  • podczas konfiguracji konta zapiszesz kod secret w bezpiecznym, ale dostępnym miejscu , lub

  • użyjesz oprogramowania takiego jak KeePassXC, które pozwala wyodrębnić kod secret.

Metoda 1: Uzyskanie tajnego kodu podczas konfiguracji konta

Przejdź na stronę https://tm.nsiscloud.polsa.gov.pl i utwórz konto.

Zanim będzie możliwe zalogowanie, zostanie wyświetlone okno z prośbą o skonfigurowanie uwierzytelniania dwuskładnikowego. Będzie ono wyglądał podobnie do tego:

../_images/xxx_yyy_account_qr_code_nsis_pl.png

Ostrzeżenie

Twój tajny kod jest teraz dostępny za pośrednictwem kodu QR i jeśli prześlesz formularz od razu, nastąpi przejście do następnego ekranu. Poniżej zostanie wygenerowany kod secret, ale nie zostanie wyświetlony.

Zamiast tego należy najpierw kliknąć link Nie możesz zeskanować kodu QR?, aby wyświetlić kod secret w postaci zwykłego tekstu czytelnego dla człowieka. Strona internetowa powinna teraz wyglądać podobnie do tej:

../_images/secret_code_otp_nsis_pl.png

Po wyświetleniu tajnego kodu na ekranie skopiuj go i zapisz w bezpiecznym miejscu.

Ostrzeżenie

Każda zmiana na ekranie spowoduje zmianę wartości kodu secret. Nawet zwykłe odświeżenie ekranu lub kolejne kliknięcie na link Nie możesz zeskanować kodu QR? spowoduje pojawienie się nowej wartości kodu secret.

Po zapisaniu kodu secret należy wprowadzić go do oprogramowania z punktu Wymaganie wstępne nr 2. Po jego wprowadzeniu użyj aplikacji do wygenerowania kodu TOTP. Będzie to sześciocyfrowa liczba; skopiuj ją i wklej w polu Kod jednorazowy w formularzu.

Dopiero wtedy kliknij przycisk Prześlij.

Przechowuj kod secret w bezpiecznym miejscu. Nie przekazuj ani nie wysyłaj go innym osobom w czytelnej formie, twórz kopie zapasowe na kilku urządzeniach, drukuj lub ręcznie zapisuj na papierze itp.

Metoda 2: Wyodrębnienie kodu z aktualnie używanej aplikacji TOTP

Jeśli masz już konto w NSIS i używasz oprogramowania wspomnianego w sekcji wstępne nr 2, możesz być w stanie wyodrębnić tajny kod z tego oprogramowania. Niektóre wersje FreeOTP nie dostarczają kodu secret, podczas gdy w KeePassXC można wyodrębnić kod secret z bazy danych haseł.

Inne aplikacje TOTP będą miały własne zasady, które z czasem mogą ulec zmianie.

Co zrobić, jeśli żadna z tych metod nie działa?

Jeśli żadna z tych metod nie działa, skontaktuj się z działem pomocy technicznej NSIS: Helpdesk i wsparcie.

Krok 3: Kod w języku Python do pobierania pliku EODATA

Teraz, gdy masz już kod secret, możesz napisać kod w języku Python, który:

  1. odczytuje dane logowania z pliku konfiguracyjnego

  2. używa tych danych do wygenerowania tokena Keycloak

  3. pobiera produkt EODATA

  4. zapisuje go na dysku lokalnym (bez pytania o potwierdzenie, jeśli pliki mają zostać zastąpione).

Pierwszym krokiem jest utworzenie pliku konfiguracyjnego, z którego kod Pythona odczyta dane logowania. Nazwij plik secrets.conf i dodaj w nim następującą zawartość:

[login]
user = [email protected]
password = qwer
totp_secret = 1234 ABCD 1234 ABCD 1234 ABCD 1234 ABCD

W powyższym kodzie zastąp:

  • person@example.com adresem e-mail, z którym konto NSIS zostało zarejestrowane

  • qwer hasłem do konta

  • 1234 ABCD 1234 ABCD 1234 ABCD 1234 ABCD tajnym kodem TOTP uzyskanym w kroku 1 tego artykułu.

Ostrzeżenie

Hasło pokazane powyżej jest tylko przykładem i nie jest wystarczająco bezpieczne, aby mogło być używane jako rzeczywiste hasło do konta.

Zapisz plik konfiguracyjny.

Informacja

Warto rozważyć dodatkową ochronę tego pliku, ponieważ będzie on zawierał wrażliwe treści. Na przykład, jeśli używasz git, możesz dodać ten plik konfiguracyjny do pliku .gitignore.

Utwórz plik download.py w tym samym katalogu, w którym znajduje się plik secrets.conf.

Wprowadź następującą treść do pliku download.py:

import pyotp  # to compute the TOTP code
import requests # to send through POST to the server
from urllib.parse import quote # to encode password if needed
import json
import configparser

login_data = configparser.ConfigParser()
login_data.read('secrets.conf')

def curl_request(url, user, password, totp):
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
    }
    data = 'client_id=nsis-public&username=' + user + '&password=' + password + '&grant_type=password&totp=' + totp
    response = requests.post(url, data=data, headers=headers)
    return response

read_secret = login_data['login']['totp_secret']
secret = read_secret.replace(" ", "")

totp_secret = pyotp.TOTP(secret)
totp = totp_secret.now()

url = 'https://identity.cloudferro.com/auth/realms/NSIS-Cloud/protocol/openid-connect/token?'
user = login_data['login']['user']
password = login_data['login']['password']
password_encoded = quote(password, safe='')
response = curl_request(url, user, password_encoded, totp)

# deserializes into dict and returns dict.
dictionary = json.loads(response.content.decode())
KEYCLOAK_TOKEN = dictionary['access_token']

url_download = 'https://download.nsiscloud.polsa.gov.pl/download/db0c8ef3-8ec0-5185-a537-812dad3c58f8'
url_download_using_token = url_download + '?token=' + KEYCLOAK_TOKEN

# downloads the file
pulling = requests.get(url_download_using_token)
open("my-file.zip", 'wb').write(pulling.content)

Zapisz plik i uruchom go. W zależności od platformy polecenie uruchomienia kodu Pythona będzie się nieznacznie różnić:

Otwórz wiersz poleceń. Użyj polecenia cd, aby przejść do katalogu, w którym znajduje się skrypt. Na przykład, jeśli katalog to C:\Users\Administrator\Python-download, wykonaj to polecenie:

cd C:\Users\Administrator\Python-download

Uruchom skrypt:

python download.py

Poczekaj, aż pobieranie się zakończy. Szybkość pobierania zależy przede wszystkim od szybkości lokalnego dostępu do Internetu.

W ostatnim wierszu powyższego kodu nazwa pobranego pliku jest podana jako my-file.zip. Zostanie on pobrany do tego samego katalogu, z którego kod został wykonany. Należy zachować ostrożność, ponieważ jeśli w tym katalogu już istnieje plik o tej nazwie, zostanie on zastąpiony bez okienka proszącego o potwierdzenie.

Jeśli operacja się powiedzie, skrypt nie powinien generować żadnych danych wyjściowych, ale katalog ze skryptem powinien zawierać plik my-file.zip. Archiwum powinno zawierać jeden katalog o nazwie S2A_MSIL1C_20180927T051221_N0206_R033_T42FXL_20180927T073143.SAFE z następującą zawartością (zrzut ekranu z systemu Windows):

../_images/use-python-pip-automate_03_creodias.png

Następnie można wyodrębnić zawartość tego archiwum za pomocą odpowiedniego oprogramowania.

Co można zrobić dalej?

Jeśli chcesz używać powłoki Bash zamiast środowiska Python, zapoznaj się z artykułem:

Użycie powłoki Bash, do zautomatyzowania generowania tokenów API do uzyskiwania dostępu i pobierania EODATA, gdy uwierzytelnianie 2FA jest włączone w NSIS.