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:
- utilizzare il frame Web generico per inviare richieste ajax al server e ottenere quel token per l'e-mail utente se la password è corretta.
- crea un token/sign_in_with_token/# {da ajax}? Email = # {base46 encoded email} all'interno dell'app.
- 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.
fonte
2016-07-05 11:24:16
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. –