Kei*_*ahn 24 api ruby-on-rails http-authentication titanium devise
我是ruby on rails的新手,但我想将我的SQlite数据库中的数据从我的iphone应用程序发送到rails web应用程序.就像"同步"服务一样.
我正在使用设计进行Web应用程序的身份验证.我启用了基本的HTTP身份验证,我可以卷入xml或json数据的网站.当我将帖子标题设置为JSON并使用用户名和密码时,我也可以将数据上传到网站.
这就是我被困的地方.
1)如何在第一次登录后让用户登录?每次我向网站发送数据时都使用http身份验证吗?我已阅读有关令牌身份验证但我不确定如何使用它.
2)我可以使用正确的用户名和密码将JSON数据发布到http:// localhost:3000/example之类的内容.但是,如果用户名和passowrd不正确,它将返回HTML内容.我是否必须写一些返回有关登录成功/ fialure的json数据的内容?
3)在我的iPhone应用程序和我的网络应用程序之间进行通信.我是否正确在Web应用程序端编写RESTful API?我需要使用有效资源吗?
我真的很难全面了解这一切是如何运作的.谢谢!
Dav*_*vid 22
有很多方法可以做到这一点.我做了什么让Devise将错误返回到我能解释的iphone应用程序(例如401)是创建一个自定义失败的应用程序:
# 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
Run Code Online (Sandbox Code Playgroud)
否则,Devise只返回带有重定向响应代码的HTML,无论登录信息是正确还是不正确.
由于我的应用程序要求用户对我的rails后端进行身份验证,因此我实现了一个简单的登录系统,如下所示:
#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'
Run Code Online (Sandbox Code Playgroud)
然后在iphone应用程序中,您可以通过向/ login这样的GET请求进行验证(我使用ASIHTTPRequest因为它很棒):
- (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
}
Run Code Online (Sandbox Code Playgroud)
然后,只要您需要将数据发布到应用程序,您就可以从用户默认值中检索用户名和密码,并将它们附加到请求中.如果您需要更安全,可以将它们存储在钥匙串中.
我确信有更好的方法可以做到这一点,但希望这可以让你考虑API身份验证策略.
归档时间: |
|
查看次数: |
10375 次 |
最近记录: |