ruby-on-rails - hacer - rails authentication
Autenticación HTTP entre la aplicación de diseño y iphone (2)
Hay muchas formas en que puedes hacer esto. Lo que hice para que Devise devuelva errores a mi aplicación de iPhone que pude interpretar (por ejemplo, 401) fue crear una aplicación de falla personalizada:
# config/initializers/devise.rb
config.warden do |manager|
manager.failure_app = CustomFailure
end
# config/initializers/custom_failure.rb
class CustomFailure < Devise::FailureApp
def respond
unless request.format.to_sym == :html
http_auth
else
super
end
end
end
De lo contrario, Devise solo devuelve HTML con un código de respuesta de redireccionamiento, independientemente de si la información de inicio de sesión era correcta o incorrecta.
Debido a que mi aplicación requería que los usuarios se autenticaran contra el backend de mis raíles, implementé un sistema de inicio de sesión simple como este:
#app/controllers/pages_controller.rb
before_filter :authenticate_user!, :only => [:login]
ssl_required :login # you have to set up ssl and ssl_requirement
def login
@user = current_user
respond_to do |format|
format.html {render :text => "#{@user.id}"}
format.xml {render :text => "#{@user.id}" }
end
end
#config/routes.rb
match ''/login'', :to => ''pages#login''
Luego, en la aplicación para iPhone, puede validar enviando una solicitud GET a / login de esta manera (utilizo ASIHTTPRequest porque es increíble):
- (void) validate_login:(NSString*)name :(NSString*)pwd
{
NSURL *login_url = [NSURL URLWithString:@"https://mysite.com/login"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:login_url];
[request setDelegate:self];
[request setUsername:name];
[request setPassword:pwd];
[request addRequestHeader:@"Accept" value:@"application/xml"];
[request startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
if ([request responseStatusCode] != 200) {
[self requestFailed:request];
}
else {
// authentication successful, store credentials
NSUSerDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:[request username] forKey:@"username"];
[defaults setValue:[request password] forKey:@"password"];
}
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
NSLog(@"failed with error: %d %@", [request responseStatusCode], [error localizedDescription]);
// tell user incorrect username/password
}
Luego, cuando necesite publicar datos en la aplicación, puede recuperar el nombre de usuario y la contraseña de los valores predeterminados del usuario y adjuntarlos a la solicitud. Si necesita ser más seguro, puede almacenarlos en el llavero.
Estoy seguro de que hay mejores formas de hacerlo, pero espero que esto te haga pensar en las estrategias de autenticación API.
Soy nuevo en ruby on rails, pero quiero enviar los datos de mi base de datos SQlite desde mi aplicación de iPhone a la aplicación web Rails. Como un servicio de "sincronización".
Estoy usando el dispositivo para la autenticación de la aplicación web. Permití la autenticación HTTP básica y puedo incluir información xml o json en el sitio web. También puedo cargar datos en el sitio web cuando configuro los encabezados de publicaciones en JSON y con nombre de usuario y contraseña.
Aquí es donde estoy atascado.
1) ¿Cómo puedo mantener al usuario registrado después del primer inicio de sesión? ¿Utilizo la autenticación HTTP cada vez que envío datos al sitio web? He leído sobre la autenticación de tokens, pero no estoy seguro de cómo usarla.
2) Puedo publicar datos JSON en http://localhost:3000/example con el nombre de usuario y la contraseña correctos. Sin embargo, devuelve el contenido HTML si el nombre de usuario y passowrd son incorrectos. ¿Debo escribir algo que devuelva datos de json sobre el éxito de sesión / fialure?
3) Para comunicarme entre mi aplicación de iPhone y mi aplicación web. ¿Estoy en lo cierto al escribir una API RESTful en el lado de la aplicación web? ¿Necesito usar recursos activos?
Estoy realmente atrapado en el panorama general de cómo funciona todo esto. ¡Gracias!
Recomendaría echar un vistazo a la documentación proporcionada aquí
https://github.com/plataformatec/devise/blob/v1.1.6/README.rdoc
También es posible que desee que dos miren los screencasts en el dispositivo.
Dado que hay muchas maneras diferentes de manejar auth, debe obtener una mejor comprensión de lo que está disponible, ya que el dispositivo es compatible con autenticación básica basada en mayúsculas y minúsculas.