Przekierowanie linku z parametrami logowania do aplikacji

0

Witam, temat może nie mówi za wiele, ale w skrócie opiszę problem.

Mam stworzoną aplikację full-stack. Po wejściu na adres (np. localhost) wyświetla się główny widok aplikacji, składający się z wielu modułów. Następnie po kliknięciu w wybrany moduł jest wyświetlany popup jako okienko logowania z inputami login i hasło.
Dopiero po sprawdzeniu poprawności loginu i hasła, aplikacja przekierowuje na główną stronę modułu z parametrami moduleId, intent i typ(uzt lub prc).
Intent to linki do modułów, np.: '/app/zamowienia'.
Dodatkowo sprawdzania jest także licencja aplikacji.

Celem jest utworzenie na stronie www.example.com buttona, który otworzy okienko logowania konkretnego modułu (jednego z kilku, może być zdefiniowane na sztywno) z jednoczesnym pominięciem głównego widoku aplikacji czyli '/app'.
Istnieje sposób, żeby dokonać czegoś takiego?

Wszystkie rady będą bardzo cenne, nie wiem jak się do tego zabrać.

0

@Aloinopsis:

No dobra, ale jaki jest twój stosunek do tego softwaru?
jesteś biernym (na poziomie technicznym) klientem, wdrożeniowcem, autorem ?

Na pewno myślisz o Javie, a nie JavaScripcie ?

0

Jestem autorem tej aplikacji, ale chciałbym ją rozbudować.
Ze strony APP_1 www.example.com mam przez button zalogować się jako osoba kontaktowa do aplikacji APP_2, ale bezpośrednio w wybrany moduł. Nie chcę pokazywać wszystkich modułów, jakie są dostępne.
Mam utworzone tabele UZYTKOWNIK i OSOBA_KONTAKTOWA.
W JavaScript też będę musiał dodać metody, ale chciałem zacząć od strony backendowej.

0
Aloinopsis napisał(a):

Jestem autorem tej aplikacji, ale chciałbym ją rozbudować.
Ze strony APP_1 www.example.com mam przez button zalogować się jako osoba kontaktowa do aplikacji APP_2, ale bezpośrednio w wybrany moduł. Nie chcę pokazywać wszystkich modułów, jakie są dostępne.
Mam utworzone tabele UZYTKOWNIK i OSOBA_KONTAKTOWA.
W JavaScript też będę musiał dodać metody, ale chciałem zacząć od strony backendowej.

No i z czym JAKO AUTOR niemałego przecież systemu/programu webowego masz problem ?

0
Aloinopsis napisał(a):

Witam, temat może nie mówi za wiele, ale w skrócie opiszę problem.

Mam stworzoną aplikację full-stack. Po wejściu na adres (np. localhost) wyświetla się główny widok aplikacji, składający się z wielu modułów. Następnie po kliknięciu w wybrany moduł jest wyświetlany popup jako okienko logowania z inputami login i hasło.
Dopiero po sprawdzeniu poprawności loginu i hasła, aplikacja przekierowuje na główną stronę modułu z parametrami moduleId, intent i typ(uzt lub prc).
Intent to linki do modułów, np.: '/app/zamowienia'.
Dodatkowo sprawdzania jest także licencja aplikacji.

Celem jest utworzenie na stronie www.example.com buttona, który otworzy okienko logowania konkretnego modułu (jednego z kilku, może być zdefiniowane na sztywno) z jednoczesnym pominięciem głównego widoku aplikacji czyli '/app'.
Istnieje sposób, żeby dokonać czegoś takiego?

Wszystkie rady będą bardzo cenne, nie wiem jak się do tego zabrać.

Najlepiej jakbyś pokazał kod aplikacji, bo bez tego ciężko coś podpowiedzieć.

0
@RequestMapping(value = "/uzt", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public ResponseLoginUzt basicUserLogin(@RequestBody RequestLoginUzt request) {
    
    // sprawdzanie poprawnosci loginu i hasla
    LoginUzt loginUzt = uzytkownikDao.logInUzt(request);
    if(loginUzt == null) {
        // niepoprawne dane logowania
        return new ResponseLoginUzt(null, STATUS_INCORRECT_LOGIN_DATA);
    }
    
    // Sprawdzenie uprawnien na modul
    if (!uprawnieniaDao.checkUprawnienieByUztIdAndUprId(loginUzt.getIdUzt(), request.getModuleId())) {
    // jesli nie ma to zwroc odpowiedni kod, jesli jest to idz dalej
        return new ResponseLoginUzt(null, STATUS_NO_PERMISSION);
    }

    LicenseReader licenseReader = new LicenseReader();
    licenseReader.decryptLicense(konfiguracjaDao.getLcn());

    if(applicationLoginDao.getReservedLicenseNum(request.getModuleId())
        >= licenseReader.getNumForModule(request.getModuleId())) {
        // brak wolnych licencji
        return new ResponseLoginUzt(null, STATUS_NO_AVALIABLE_LICENSE);
    }
            
    // tworzenie loga (rezerwacja licencji)
    Uprawnienia uprawnienia = new Uprawnienia();
    Integer uprId = uprawnienia.searchUrpByIdModule(request.getModuleId());
     Integer sessionId = applicationLoginDao.create(
            new ApplicationLogin(
                    new Timestamp(System.currentTimeMillis()), 
                    loginUzt.getIdUzt(),
                    loginUzt.getIdPrc(),
                    uprId,
                    request.getComputerId()
            )
    );
    loginUzt.setSessionId(sessionId);
    return new ResponseLoginUzt(loginUzt, STATUS_LOGIN_SUCCESSFUL);
}
0

Jak dla mnie to tutaj trochę takie pomieszanie z poplątaniem.
Masz osobno frontend i backend.
Backend wystawia pewne endpointy (w tym ten do logowania) które powinny być w jakiś sposób zabezpieczone (token jwt, basic auth whatever). Do tego dochodzi kwestia sprawdzania licencji (per aplikacja lub per moduł).

Masz też frontend który posiada jakąś stronę główną, możliwość zalogowania się + podstrony do konkretnych modułów.
Możesz po stronie frontu:

  1. Przekierować użytkownika na główny widok (użytkownik jeszcze niezalogowany) wyświetlić mu pewne informacje + dać możliwość zalogowania się
  2. Przekierować użytkownika na podstronę konkretnego modułu jednocześnie, próbując odpytać się backend o dane potrzebne do wyświetlenia wszystkiego jak trzeba, załączyć poświadczenie zalogowania (np. token) i np. w razie braku tego poświadczenia (na podstawie stosownego statusu 4xx) wyświetlić użytkownikowi informację że musi się zalogować (lub od razu wyświetlić mu okienko logowania)

Co do sprawdzania licencji, po zautoryzowaniu się w aplikacji (np. na podstawie jakiegoś ciasteczka itp) jesteś w stanie np. sprawdzić kwestie związane z licencja (bez różnicy czy pod kątem całej aplikacji czy pojedynczego modułu).

Jak dla mnie to Twój problem (o ile masz poprawnie skonstruowane api po stronie backendu) jest typowo frontendowy wnioskując po komentarzu:

Chcę wejść na stronę, kliknąć "złóż zamówienie" i otworzyć okienko logowania do modułu a nie całej aplikacji. Jeśli pominę '/app' to się wywala aplikacja

Jak rozumiem, rzeczy frontendowych zbytnio nie ogarniasz a ktoś zrzucił na Ciebie to zadanie czy jak?

0

Zgadza się, nie dość, że muszę to jakoś ogarnąć, to nie wiem za bardzo jak się za to wziąć.
Na backendzie tokenJwt jest zrobiony. Na froncie logowanie jest w kilku plikach, są eksporty i importy (logowanie, autoryzacja, typ użytkownik/pracownik, licencja, etc), jednym słowen sporo rzeczy.
Na obecną chwilę, w route.js mam dodatkowy link, podobnie jak do modułów.
Jest też dodatkowe zabezpieczenie dla każdego z modułów po zaimportowaniu go do mountes().
Jeśli jest aktywny, to nie wejdę do modułu(ale tylko przez link, który stworzyłem), jeśli zakomentowany to można się zalogować, ale po wylogowaniu się jest dostęp do aplikacji, czego nie powinno być, więc to rozwiązanie jest słabe. Są jakieś sposoby, żeby to lepiej zrobić, z pominięciem głównej aplikacji?

0

Imho powinieneś to pytanie zadać w dziale dot. JS

1

A nie możesz tego zrobić jak w OAuth?

  • wchodzisz na example.com
  • klikasz "zaloguj" i przechodzisz pod adres login.com?redirectUri=example.com/nazwamodulu
  • Jeżeli proces logowania się powiedzie, to strona login.com zwraca http 302 location=example.com/nazwamodulu?token=blahblah
0

Sprawdziłem, co to jest OAuth i wydaje się sensownym rozwiązaniem. Spróbuję rozwiązać problem tym sposobem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1