Ho un'app per rails che fa una chiamata a api web, l'app rails da sola non ha alcun database o archivio utenti. Ogni chiamata API deve essere inviata nome utente e password per ogni richiesta.che memorizzano la password in una sessione
Vorrei fornire un meccanismo di autenticazione per l'app per i binari. Sto progettando di fare in questo modo:
- mostrare una pagina di login
- Prendi il nome utente e la password
- Conservare il nome utente e la password
- eseguire un'autenticazione manuale o tramite warden.authenticate o Authlogic Qualcosa (o potrebbe anche non essere richiesto può solo verificare se la sessione ha qualcosa memorizzato)
- E poi quando l'utente fa qualcosa passo il nome utente e la password che è stata memorizzata in precedenza.
Ora il mio problema è dove memorizzo la password? Se uso la sessione non posso usare ovviamente il cookie store, posso usare session_store = :active_record_store
ma non sono sicuro che sia sicuro, inoltre non ho alcun database al momento, quindi perché dovrei crearne uno solo per la sessione? C'è qualche altro meccanismo per memorizzare le password all'interno di una sessione? (Modo sicuro, ovviamente)
rotaie prima era:
- MemoryStore
- FileStore
Ma ora entrambi sembra essere rimosso. Quindi qualsiasi altra soluzione?
Note di risposte:
- Memorizzazione di password criptate non funziona da quando ho bisogno della password grezza da inviare al server, mentre le chiamate API.
- Non ho alcun controllo sull'API, quindi non posso cambiare la sua autenticazione.
- Non c'è manutenzione del profilo utente sull'app per rails. Tutto gestito da chiamate API.
Alla fine ho pensato di implementare l'archivio di memoria personalizzato ma sembra che venga generato un errore di stackoverflow. Ho ottenuto il codice https://rails.lighthouseapp.com/projects/8994/tickets/1876-uninitialized-constant-actioncontrollersessionmemorystore
require 'action_dispatch'
module ActionDispatch
module Session
class CustomMemoryStore < ActionDispatch::Session::AbstractStore
GLOBAL_HASH_TABLE = {} #:nodoc:
private
def get_session(env, sid)
sid ||= generate_sid
session = GLOBAL_HASH_TABLE[sid] || {}
session = AbstractStore::SessionHash.new(self, env).merge(session)
[sid, session]
end
def set_session(env, sid, session_data)
GLOBAL_HASH_TABLE[sid] = session_data
return true
end
end
end
end
Steptools3::Application.config.session_store :custom_memory_store, :key => '_some_xyz'
È possibile memorizzare una password crittografata in un cookie o archiviare la sessione sul lato server nel DB. –
Non è chiaro chi deve effettuare il login, in quale applicazione. Il railsapp (senza il db?). E un'altra app ha un'API?È roba webapi sotto il tuo controllo? Per rinviare l'autorizzazione a un'API, in genere utilizzerai OAuth (per non dover mantenere l'utente/password): consente all'utente di accedere all'altra applicazione e riceverai un token che ti concederà l'accesso temporaneo. – nathanvda
l'utente della mia app inserisce nome utente e password, l'app rails chiama l'API, dice "dosomething", chiama "user: asd, passa: qwe, task: dosomething". non esiste quindi alcuna autenticazione tra l'app per rails e l'API ... è solo che devo passare il nome utente e la password su ogni richiesta. –