2016-06-08 44 views
10

Attualmente sto lavorando all'implementazione di un'app mobile per il nostro sito che utilizza Ruby on Rails e Devise. L'idea qui è, in un primo momento, creare un modulo di accesso mobile che in caso di accesso riuscito apre un frame Web che è autenticato e consente il normale utilizzo del sito (ottimizzato per dispositivi mobili). In teoria ciò dovrebbe essere possibile. Sto avendo difficoltà con i seguenti problemi:Webframe per app mobile Autenticazione con Rails Devise

  1. Come si ottiene la chiave di sessione puro per la sessione utente tramite una richiesta JSON? Quali metodi possono essere utilizzati per generarlo manualmente da Idea, qualcosa che fa il metodo sign_in(:user, user)?

  2. È persino possibile prendere quella chiave e inserirla nel cookie del browser nel modo in cui avviene normalmente in fase di progettazione, ma sul lato mobile?

So che questo non è il metodo standard per creare applicazioni mobili per il sito, ma credo che dovrebbe essere possibile.

risposta

0

OK, così ho deciso di creare una soluzione per i webframe come segue, in pratica si registra l'accesso e la password per un determinato metodo sign_in appositamente progettato per generare token di accesso una tantum per l'applicazione. Hai bisogno di due metodi nel sistema per farlo:

routes.rb

devise_scope :user do 
    get "sign_in_with_token/:token" => "sessions#sign_in_with_token" 
    post "get_login_token" => "sessions#get_login_token" 
end 

sessions_controller.rb (non dimenticare di aggiungere il metodo che aumenta il failed_sign_in_count password sbagliata, altrimenti che può consentire attacchi di forza bruta)

def get_login_token 
    user = User.find_by_email(sign_in_params["login"]) 
    password = sign_in_params["password"] 
    if user and user.valid_password?(password) 
    token = SecureRandom.hex(16) 
    user.update_attribute(:authentication_token, token) 
    render json: {token: token}, status: 200 
    else 
    render json: {error: "error"}, status: 403 
    end 
end 

e il metodo per accedere con quella pedina

def sign_in_with_token 
    @user = User.where(authentication_token: params[:token], email: Base64.decode64(params[:email])).first 
    if @user 
    @user.update_attribute(:authentication_token, nil) 
    sign_in(@user, bypass: true) 
    end 
    redirect_to '/' # or user_root_url 
end 

Quello in questo modo l'app mobile funzionerà in questo modo:

  1. utilizzare il frame Web generico per inviare richieste ajax al server e ottenere quel token per l'e-mail utente se la password è corretta.
  2. crea un token/sign_in_with_token/# {da ajax}? Email = # {base46 encoded email} all'interno dell'app.
  3. aprire quel collegamento all'interno della cornice Web e utilizzare l'app come se si fosse connessi normalmente. Ora l'app può salvare e-mail e password localmente e utilizzare quella logica per ottenere nuovamente il token per un'altra sessione. Successivamente, l'accesso sarà anche in grado di impostare l'id dell'app in modo che le notifiche push possano essere inviate.

Apprezzare qualsiasi feedback o critica su questa soluzione.

4

Se si desidera inserire il modulo di autenticazione sull'interfaccia utente mobile e passare le credenziali al frame Web, è necessario un modo per trasferire i dati dall'app mobile al frame Web.

Il modo in cui lo si esegue dipende dalla piattaforma su cui si sta sviluppando. In realtà non sono uno sviluppatore di cellulare in modo non so con certezza quanto sia difficile/facile queste opzioni sono:

  1. Quando si apre la cornice web, un'istanza con dati di sessione
  2. Trovare un modo per chiamare i metodi sul client dal frame Web. Qualcosa come getSessionData.
  3. È possibile generare un'impronta digitale per il frame Web, fare in modo che l'interfaccia utente mobile invii questi dati al server e quindi fare in modo che il frame Web venga autenticato con il server inviando l'impronta digitale.

Ancora una volta, non sono del tutto sicuro di come siano possibili tutte queste opzioni.

+0

Sì, questo è esattamente il problema. 1. Come si ottiene la chiave di sessione per un determinato utente in Rails and Devise. e 2. Come si passa questa chiave nel frame web. –

6

Si potrebbe prendere in considerazione l'utilizzo di Devise Token Auth e il trattamento dell'applicazione mobile come solo un'altra applicazione web che richiede l'autorizzazione dal sito principale. DTA è particolarmente bello poiché si occupa della gestione dei token di sessione (rinnovo/scaduto) e del loro trasferimento sull'app che richiede l'accesso. Il problema sta sovrascrivendo i controller di sessione in modo tale da accedere automaticamente dopo aver effettuato l'accesso all'app mobile (o semplicemente riscrivere il log in modo che si verifichi in concomitanza con il sito di Rails, anziché prima). Considerando che stai già utilizzando Devise, questo potrebbe anche essere più refactoring di quanto desideri.

+0

L'idea è che l'applicazione mobile apra un webframe, che si comporta come un normale sito, ma all'interno dell'app. Quindi l'intero punto di questo approccio è avere un meccanismo che non ha bisogno di riscrivere l'intera logica del server, solo un modo per passare manualmente il cookie di sessione al webframe, la stessa cosa che accade sui normali browser con normali login. –

2

È necessario utilizzare l'autorizzazione token e il deep linking di Android. Ti permetterà di accedere al browser web e inviare un token alla tua app tramite deep linking.

+0

Ho un'idea di come funziona l'autenticazione token, in pratica il sistema deve essere in grado di avere un token nella testa dell'URL come parametro invece di una chiave di sessione all'interno di un cookie del browser. Ma c'è un modo per ottenere manualmente la chiave di sessione all'interno dei binari e inviarla all'app mobile in modo che possa essere impostata all'interno del suo webframe? –

+0

Puoi risolvere questo problema in questo modo: gli utenti accedono tramite un browser e inviano alla tua app con link e token profondi. Usando questo token puoi fare richieste autenticate. –

+0

Se è necessaria la sessione in una visualizzazione Web, l'utente deve accedere lì. –