2017-02-07 25 views
6

Próbuję stworzyć stronę internetową za pomocą metody reakcji + redux. Mam już skonfigurowane uwierzytelnianie jwt na serwerze. Co chcę zrobić, to leniwy załadować niektóre z moich komponentów/pojemników i reduktorów, aby mogły być pobierane tylko przez uwierzytelnionych użytkowników. Już wiem, jak ukrywać komponenty przed nieuwierzytelnionymi użytkownikami (po stronie klienta), ale wolałbym, aby nie pobierano kodu względnego javascript.Leniwy element ładujący wymagający uwierzytelnienia z reagującym reduxem

Używam webpacka i już sprawdziłem router reagowania i require-ensure (https://stackoverflow.com/a/33044701/2920112), ale to podejście w ogóle nie obsługuje uwierzytelniania. Rozważałem też w pewnym sensie używanie fetch (prawdopodobnie łączenie prywatnego kodu oddzielnie z pakietem internetowym), ale nie wiedziałbym, co zrobić z pakietem po jego pobraniu.

Czy podchodzę do problemu w niewłaściwy sposób? Jedyną alternatywą jaką widzę jest dostarczenie dwóch plików HTML, jeden ładujący pakiet Webpack tylko z publiczną treścią i jeden pobierający również prywatny kod. Wydaje się to jednak naprawdę nieoptymalne. Jakie jest prawidłowe podejście?

+0

Uważam, że można użyć opcji "wymagaj-zapewnienia", wystarczy dołączyć własną logikę uwierzytelniania. Uwierzytelnienie użytkownika zmienia to, co wywołujesz za pomocą 'require.ensure()' i jaki komponent przekażesz do wywołania zwrotnego 'cb'. – Lucas

+0

Znalazłeś rozwiązanie? Mam podobny problem. Wszystkie zasoby są chronione i wymagają tokena w nagłówku żądania. Nie wiem, jak przejąć cokolwiek, co require.insure robi w tle, aby wysłać token podczas pobierania następnego fragmentu. –

Odpowiedz

0

Rozwiązaliśmy to za pomocą reagować-Router:

<Route 
    key="secured_component" 
    path="/secured" 
    onEnter={handleEnterSecuredComponent} 
    getComponent=({nextState, cb) => { 
     require.ensure([],() => { 
      cb(null, require('YourComponent').default); 
     }); 
    }} 
/> 
... 
const handleEnterSecuredComponent = (nextState, replace) => { 
    const {login: {success}} = store.getState(); 
    if (!success) { 
     replace('/login'); 
    } 
}; 

Więc strona logowania należy ustawić w Redux {logowanie: {sukces: true}} Jeśli użytkownik jest uwierzytelniony. Jeśli uwierzytelniony użytkownik spróbuje uzyskać dostęp/zabezpieczony, zostanie przekierowany do/login.

the require.ensure nie odgrywa żadnej roli uwierzytelniania. To po prostu punkt wejścia dla webpacka, aby podzielić porcję plików js na leniwy załadunek.

+0

Już robię coś podobnego (z routerem reagującym), ale to nie przeszkadza nieuwierzytelnionemu użytkownikowi załadować sensownego kodu javascript, jeśli chce. Jeśli ręcznie przesłał żądanie GET do adresu URL porcji utworzonej przez pakiet WWW za pośrednictwem 'require.ensure', nie byłoby mechanizmu autoryzacji, który uniemożliwiłby mu pobranie go. – lgpasquale

+0

@lgpasquale: JavaScript w interfejsie nie powinien zawierać sensownego kodu ... Nigdy nie ufaj klientowi! Wszystkie "prawdziwe" mechanizmy bezpieczeństwa, które zastosujesz, powinny być tylko po stronie serwera. Cała reszta jest tylko dla UX. – sclausen