Vorrei implementare un flusso di autenticazione senza password per la mia app per dispositivi mobili che richiede solo un utente che fa clic su un link nella sua e-mail per accedere. Simile a come Slack gestisce auth. Utilizzerò node
e jwt
per questa implementazione.
Penso di aver trovato un design sicuro, ma sono sicuro che mi manchi qualcosa. Mi piacerebbe qualche critica da parte della community.
Eccoci:
- L'utente apre l'app per dispositivi mobili.
- Controlliamo se l'utente ha un token nella sua memoria locale.
- Se lo fanno, aggiungiamo quel token alle intestazioni e inviamo alla pagina iniziale dell'app.
- Altrimenti, chiediamo loro di inserire la loro email per iniziare
- Quando fanno clic su "Invia", POST quello
email address
all'endpointrequestMagicLink
sul nostro server. - Il server controlla il database per un utente con quel
email address
- Se troviamo un utente con quella email, prendiamo il
id
da quell'utente - Se l'utente non esiste, creiamo un nuovo utente e otteniamo quel
id
- Usiamo JWT per generare un token con
id
e il nostrosecret
che scade dopo1 hour
- Inviamo quel token all'utente tramite un link in un'email.
- Dopo essere stato cliccato, quel link invia una richiesta GET al nostro server al
magicLogin
endpoint contoken
in una query param - Verifichiamo che il token sia corretto utilizzando JWT e il nostro
secret
. - Se fallisce la verifica, reindirizziamo l'utente alla schermata in cui li chiediamo con la sua e-mail per iniziare.
- Se ha successo, generiamo un nuovo token JWT usando il loro
id
e il nostrosecret
queldoesn't have an expiration
, quindi lo restituiamo all'utente nei parametri di un URL che li reindirizza a una pagina di successo in la nostra app. - L'app prende il token dal param e lo memorizza nella memoria locale finché l'utente sceglie di disconnettersi e l'utente viene reindirizzato alla home page.
- Le richieste per l'API ora contengono il token nelle intestazioni e l'utente è a posto.
EDIT (aggiungendo ulteriori pensieri): Qualcosa che sto considerando per renderlo più sicuro: cosa succede se dividiamo il token in 2 parti e inviamo metà al dispositivo mobile e l'altra metà all'email. In questo modo, solo l'utente con accesso a tale email E l'accesso a quel dispositivo specifico sarà in grado di autenticarsi.