2017-09-28

Dodawanie ReCaptcha do appki we Flasku

Jeśli mamy aplikację, która udostępnia wysyłanie wiadomości, komentarzy czy czegokolwiek podobnego, istnieje szansa, że prędzej czy później zaczniemy mieć problemy ze spamerami. Jak sobie zatem z tym prosto poradzić?

Na pomoc przychodzi nam Google i ReCaptcha - słynne 'Nie jestem robotem'.

Jak dodać ochronę ReCaptcha do naszej aplikacji? W prosty sposób.

Zacznijmy zabawę. Na początku musimy oczywiście zainstalować wymagany moduł.

Fajnie jest, kiedy listę wymaganych zależności trzymamy sobie w przeznaczonym do tego pliku, najczęściej requirements.txt, gdzie wypisane są wszystkie potrzebne biblioteki czy innego programy. Jeśli takowy posiadasz, to dodaj do niego flask-recaptcha. Dlaczego warto go mieć? Cóż, łatwość instalacji i przenośność. Następnym razem, kiedy będziesz chciał uruchomić appkę gdzie indziej możesz po prostu wpisać pip install -r requirements.txt a pip sam sobie wszystko odczyta i zainstaluje. Chyba wygodniej niż ręcznie się z tym męczyć, czy klikać w IDE, prawda? Jeśli cie nie przekonałem, to po prostu doinstaluj sobie ten moduł za pomocą pipa

pip install flask-recaptcha

Dobra, idziemy dalej.

Teraz musimy dodać kilka linijek do pliku view.py lub app.py jak tam zwał tak zwał, zależy jak nazwałeś plik i jak skonstruowana jest twoja applikacja.

app.py:

    from flask import Flask
    from flask_recaptcha import ReCaptcha

    app = Flask(__name__)
    recaptcha = ReCaptcha(app=app)

Jeżeli już wcześniej zadeklarowałeś obiekt app, to raczej nie ma co tworzyć go od nowa.

Teraz zmodyfikować musimy szablon formy, którą chcemy chronić.

    <form method="post" action="/submit">
        <!--- tutaj powinny znajdować się twoje inputy itd. -->
        {{ recaptcha }}
        <!--- tutaj submit button -->
    </form>

I gotowe. Teraz musimy jedynie zweryfikować czy captcha nam zwróciła poprawne zdanie testu.

app.py/views.py or sth

    from flask import Flask
    from flask_recaptcha import ReCaptcha

    recaptcha = Recaptcha()
    recaptcha.init_app(app)
    @route("/submit", methods=['GET', 'POST'])
    def submit():
        if request.method == 'POST':
            if recaptcha.verify():
                # co zrobić w razie poprawnej odpowiedzi
                # najpewniej zapisać <form> do db lub wysłać wiadomość
                pass
            else:
                flash('Niepoprawny captcha!', 'danger')

Teraz musimy skonfigurować recaptche jedynie i wszystko będzie działało. Konfiguruje się ją przez standardowe API configu Flaska.

Do skonfigurowania mamy następujące konieczne właściwości:

RECAPTCHA_ENABLED - True albo False

RECAPTCHA_SITE_KEY - klucz publiczny

RECAPTCHA_SECRET_KEY - klucz prywatny

Ważna uwaga. Trzymanie kluczy prywatnych w takiej formie, zwłaszcza jeśli korzystasz w githuba, nie jest mądre. O tym jak bezpiecznie trzymać różne hasła/klucz w aplikacji flaska musisz sobie sam poczytać. Następujące pola są nieobowiązkowe:

RECAPTCHA_THEME - kolorystyka foremki 'dark' lub 'light', 'light' jest domyślne

RECAPTCHA_TYPE - rodzaj zabezpieczenia - może być to 'image' obrazek, lub 'audio' dźwięk do odsłuchania, domyślnie jest 'image'

RECAPTCHA_SIZE - rozmiar obrazka, 'normal' lub 'compact', domyślnie normal

RECAPTCHA_TABINDEX - (int) dla tych, którzy używają tabindexu

Jak to wygląda w mojej appce?

    RECAPTCHA_ENABLED = True
    RECAPTCHA_SITE_KEY = 'twoj_klucz_publiczny_z_api_recaptcha'
    RECAPTCHA_SECRET_KEY = 'twoj_klucz_prywatny_z_api_recaptcha'

    app = Flask(__name__)
    app.config.from_object(__name__)

    recaptcha = ReCaptcha()
    recaptcha.init_app(app)

Reszte przykładowego kodu możecie znaleźć chociażby tu

Skąd wziąć klucz publiczny i prywatny?

Stąd Obsługa tej strony jest raczej nieskomplikowana. Mała uwaga: jeśli chcemy korzystać z recaptchy na naszym lokalnym środowisku developerskim, jako domenę wystarczy podać localhost.

Warto wspomnieć, że jest możliwość wybrania 'niewidzialnej' weryfikacji, poczytajcie o tym, bo to sprawi, że wasze recaptcha w ogóle nie będzie widoczne dla użytkownika, nie wymagając od niego żadnej akcji, a i tak spełni swoją funkcję dzięki algorytmom Google rozpoznającym zachowanie usera.

Tyle na dziś