Blog (92)
Komentarze (104)
Recenzje (0)

Jeden uparty kaleczy JavaScript, czyli Sobieski+ MileStone2

@marcinw2Jeden uparty kaleczy JavaScript, czyli Sobieski+ MileStone218.04.2020 17:06

Cała ta sytuacja z mniej lub bardziej uzasadnioną paniką powoduje, że część ludzi szuka sobie zajęć, które pozwolą oderwać się od (smutnej) rzeczywistości - w moim wypadku jest to m.in. kodowanie.

Mniej więcej miesiąc temu pisałem o małym eksperymentalnym projekcie, jakim jest stworzenie własnego plikowego CMS.

Dzisiaj chciałbym krótko opisać, co udało się zrobić przez ten czas.

Dostępność wszystkich podstawowych funkcji przez www

Obecna wersja pozwala na:

  1. stworzenie kont użytkownika (lokalnych albo pobierających hasło i stan logowania z konta Google)
  2. odzyskanie/zmianę haseł przy kontach użytkownika
  3. dodawanie i edycję tekstów (zawierają tytuł, treść, opcjonalną informację dla czytelnika i opcjonalne tagi, możliwość "przyklejenia" i publikacji na głównej stronie)
  4. dodawanie komentarzy do tekstów
  5. tworzenie chatów między użytkownikami (jeżeli ci akurat nie mają otwartej odpowiedniej strony, to dostaną odpowiednią informację w zakładce przeglądarki o tym, że przyszedł nowy wpis)

Można powiedzieć, że funkcjonalność jest "feature complete" do stworzenia prostego serwisu.

Tworzenie konta

Podajemy nick w serwisie i mail, do tego wybieramy rodzaj konta (czy będzie ono z lokalnym hasłem czy hasło ma pochodzić z konta Google).

W przypadku kont lokalnych generowany jest jeszcze link służący do weryfikacji adresu mail (użytkownik po jego otrzymaniu powinien go otworzyć i podać hasło do konta).

Hasła we wszystkich wypadkach są hashowane i solone (wiem, jak to brzmi w języku polskim - chodzi o to, że nie przesyłamy ich otwartym tekstem, a generujemy z nich hash, a czasem do generowania hasha używamy również losowego tekstu).

Jedynymi przesyłanymi otwartym tekstem danymi jest raz nick i adres email (przy czym serwer działa na https i nie jest to wielki problem).

Sesje

Serwer generuje unikalne identyfikatory sesji i tworzy na ich podstawie tymczasowe ciastka. Identyfikatory mają po stronie serwera określoną ważność - nowa wartość jest przesyłana do przeglądarki z użyciem SSE (Server-Sent Events).

Logowanie z użyciem konta Google odbywa się na oddzielnej podstronie (nie chcę dodawać bibliotek z tej firmy przy każdym wywołaniu) - jeżeli kod dostaje odpowiedź o poprawnej weryfikacji, to dokonuje "swojej" wewnętrznej weryfikacji i dalej posługuje się nią. Pozwala mi to na uproszczenie całości.

Przypomnienie hasła

Interfejs graficzny ma link "Zapomniane hasło" - podajemy tam nazwę konta i adres mailowy, w odpowiedzi otrzymujemy maila z linkiem, po otwarciu którego można zmienić hasło.

Uruchomienie

Po pobraniu Node.js należy doinstalować moduł nodemailer ("npm install nodemailer" poprzedzony ewentualnie dodaniem katalogu nodejs do ścieżki PATH, o ile robimy to pod Windows).

Potem (o ile chcemy korzystać z integracji z Google) potrzebujemy identyfikatora aplikacji - sposób jego generacji jest m.in. pokazany na stronie https://medium.com/@thomashellstrom/use-google-as-login-in-your-web-ap...

Kolejny krok to zmiana config.js i można już uruchomić całość komendą "nodejs index.js".

Pierwsze konto ma domyślnie uprawnienia administratora, zaś w celu wysyłania maili używam serwisu ethereal.email, która symuluje powyższą usługę (należy otworzyć link pokazywany w konsoli, żeby zobaczyć treść maila; jeżeli chcemy otrzymywać prawdziwe wiadomości, konieczne jest podanie własnych ustawień SMTP na górze w pliku index.js).

Kod

Obecnie index.js to około 75 kB, moduły wewnętrzne ok. 37 kB, a zewnętrzne ok. 376 kB.

Nie jest to już niestety ok. 25 kB z projektu Sobieski, za to całość jest napisania znacznie porządniej niż przy MileStone 1 - mamy podział na stosunkowo małe funkcje, lepsze zmienne, znacznie mniej błędów, itp.

Zdecydowałem się użyć SunEditor jako edytora tekstu - Quill nie wygląda na rozwijany od dosyć dawna, inne edytory albo wymagają "dziwnych" licencji albo nie mają zbyt wielu funkcji.

Obecną wersję na upartego (po skonfigurowaniu nodemailera) możnaby wystawić już na serwerze testowym.

Technologie

SSE (Server-Sent Events), Cookies, JavaScript, AJAX, CSS, HTML, Node.js, HTTP/2

Obecnie bawię się m.in. myślą obsługi powiadomień, czyli web-push (chodzi o to, żeby przeglądarka pytała się o włączenie powiadomień na stronie, a my żebyśmy mogli wybrać, co ma być pokazywane).

Ogólnie mówiąc - docelowo chciałbym stworzyć dosyć nowoczesną aplikację webową (gdzie np. wylogowanie użytkownika wyloguje go we wszystkich sesjach), a nie statyczny generator do strony WWW

I kilka uwag

Czy da się napisać dosyć porządnego CMSa w krótkim czasie z użyciem niewielu zasobów? TAK

Czy trzeba korzystać z pierdyliarda bibliotek? NIE (po stronie przeglądarki jest tylko SunEditor, biblioteka do SHA256 i opcjonalnie niezbędna biblioteka Google, po stronie Node.js jedynie nodemailer)

Błędy? Są kasowane z dnia na dzień.

Po co wyważać otwarte drzwi? Nie wszystko, co przychodzi z zagranicy, jest najlepsze. Warto samemu drążyć różne tematy i szukać lepszych rozwiązań.

Co dalej z projektem? Nie ma co się oszukiwać, że JavaScript jest bardzo dobrym językiem. Nie jest (znacznie bardziej wolałbym pisać chociażby w Delphi)... ale chyba udało mi się ominąć sporą część pułapek. Również Node.js ma swoje odchylenia (i stąd firmy typu Google myślą o Go czy innych rozwiązaniach)... ale nie zmienia to faktu, że już MileStone 2 jest niezupełnie najgorszą bazą do pisania większych aplikacji. C.D. najprawdopodobniej nastąpi.

Licencja? Wszystkie biblioteki są na MIT, mój kod skłonny jestem udostępnić na jednej z licencji OSS.

Dziękuję.

PS. W tytulu nawiązuję oczywiście do stwierdzenia "gry nie tworzyła armia juniorów kaleczących JavaScript"

PS2. Dziękuję za uwagi przy poprzednim wpisie - w kodzie pozostawiłem jedynie var na oznaczenie zmiennych i const na oznaczenie stałych (działa? działa. Na ... drążyć temat), komentarze mają limitowaną długość, konfiguracja jest (gdzie możliwe) wydzielona, itp. Na pewno pierwsze kamienie milowe nie są doskonałe (kod bywa długi, nie ma opisów, nie wszystkie warstwy middleware są wydzielone, itp.), ale nie taka ich rola. Dla mnie na tym etapie ważne jest, żeby mieć dobrą bazę, zdobyć doświadczenie, pobawić się z kodem, itp. Nie mam zamiaru uprawiać zbyt durnego marketingu i pisać "jakie to wspaniałe", ale kto wie - może z tego wyrośnie większy polski CMS?

PS3. Link do wcześniejszych artykułów o projekcie Sobieski i Sobieski+, kod na GitHub do projektu Sobieski+

PS4. Moja odpowiedź na pierwsze osiem komentarzy: https://www.dobreprogramy.pl/marcinw2/Hey-Joe-Potrzymaj-mi-piwo-dlacze...

PS5. (Maj 2020): Większość uwag merytorycznych z komentarzy zaadresowałem w kolejnym wpisie: https://www.dobreprogramy.pl/marcinw2/Raport-z-postepu-prac-czyli-Sobi...

Wybrane dla Ciebie
Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.