2011-01-28 13 views
21

C'è un modo per mantenere la mia applicazione completamente privata e consentire solo agli sviluppatori di accedere?Come posso mantenere privata la mia applicazione Heroku?

Quando un utente casuale inserisce l'URL, dovrebbe essere qualcosa di simile a una pagina vuota, ma quando gli sviluppatori inseriscono l'URL, dovrebbero poter accedere all'app.

+1

Se qualcuno viene da Google cercando node.js, ecco un [collegamento] (http://blog.modulus.io/nodejs-and-express-basic-authentication) – funroll

risposta

16

La mia soluzione economica ha implementato un before_filter per richiedere un'autenticazione HTTP prima che venga eseguita ogni azione.

Questa soluzione funziona bene insieme ad altri livelli di autenticazione: Devise o altri.

USERS = { "user" => "secret" } 

before_filter :authenticate 

def authenticate 
    authenticate_or_request_with_http_digest("Application") do |name| 
    USERS[name] 
    end 
end 

Ogni volta che gli altri peer atterrano a yourdomain.heroku.com, viene chiesto per l'autenticazione HTTP, in seguito per altri autenticazione se al suo posto.

+0

È meglio memorizzare nome utente e password come variabili di configurazione di Heroku (http://blog.heroku.com/archives/2009/4/7/config-vars) e hash (http://zacharyfox.com/blog/ruby-on-rails/password-hashing) , sebbene l'autenticazione dovrebbe avvenire solo se Rails.env == 'produzione' allora. – avalez

+0

Posso usarlo in un'app AngularJS (generatore angolare-fullstack)? In tal caso, dove effettivamente aggiungo questo codice in modo che venga inviato a Heroku? – LifeOnLars

+0

Rails 4 ha il built-in di cui sopra: http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html –

0

Controlla gemma authlogic, in particolare la funzione Token di accesso singolo.

È possibile restituire un 404 a chiunque non passi il token di accesso singolo appropriato come argomento.

2

Una soluzione davvero semplice sarebbe semplicemente aggiungere una chiave che può essere memorizzata in un cookie sulla macchina degli utenti. Questa non è una soluzione perfetta in quanto qualcuno potrebbe ottenere la chiave ma ti offre una protezione di base da parte di qualcuno che inciampa nel tuo sito. È possibile utilizzare un url come http://www.yourdomain.com?access_key=random_string e quindi aggiungere quanto segue al controller dell'applicazione.

class ApplicationController < ActionController::Base 
    before_filter :check_redirect_key 

    def check_redirect_key 
    if request[:access_key] != 'random_string' && cookies[:access_key] != 'random_string' 
     redirect_to "/404.html" 
    elsif request[:access_key] == 'random_string' 
     cookies.permanent[:access_key] = 'random_string' 
    end 
    end 

end 

Questo codice verifica per la chiave di accesso sia l'URL o un cookie sulla macchina degli utenti e lasciarli a se esiste in entrambi i luoghi. In questo modo, una volta che hanno effettuato l'accesso al sito con la chiave, possono accedere direttamente all'URL.

+0

Grazie! questo è stato semplicemente bello e semplice, l'ho applicato a un'app sailsjs (nodo) e ha funzionato magnificamente. –

4

Ora è anche possibile utilizzare un Heroku add-on che consente di specificare le e-mail degli utenti autorizzati ad accedere a un'applicazione e che utilizza Persona (ovvero BrowserID) per autenticare gli utenti (non è necessaria alcuna password specifica del sito).

+0

disponibile solo nella regione degli Stati Uniti anche se ... – Imanol

0

Ho costruito la gemma rack_staging per gestire questo caso d'uso per me, potrebbe essere utile anche per te.

0

mio (anche economico) soluzione (Django app che utilizza viste basate classe) è quello di utilizzare SuperUserRequiredMixin in tutte le mie opinioni sulla base di classe come questo:

class BlogPostDetailView(SuperuserRequiredMixin, DetailView): 
    template_name = "blogpost-detail.html" 
    model = BlogPost 

Aggiunta/rimozione di questa mixin è il mio modo per andare su Questo.

Problemi correlati