2011-06-24 20 views
24

Tôi mới sử dụng ruby ​​trên đường ray nhưng tôi muốn gửi dữ liệu từ cơ sở dữ liệu SQlite từ ứng dụng iphone của tôi tới ứng dụng web đường ray. Giống như dịch vụ "đồng bộ hóa".Xác thực HTTP giữa ứng dụng phát minh và ứng dụng iphone

Tôi đang sử dụng tính năng xác thực cho ứng dụng web. Tôi đã bật xác thực HTTP cơ bản và tôi có thể cuộn tròn vào trang web cho dữ liệu xml hoặc json. Tôi cũng có thể tải dữ liệu lên trang web khi tôi đặt tiêu đề bài đăng thành JSON và với tên người dùng và mật khẩu.

Đây là nơi tôi bị kẹt.

1) Làm cách nào để giữ người dùng đăng nhập sau lần đăng nhập đầu tiên? Tôi có sử dụng xác thực http mỗi khi tôi gửi dữ liệu đến trang web không? Tôi đã đọc về xác thực mã thông báo nhưng tôi không chắc chắn cách sử dụng nó.

2) Tôi có thể đăng dữ liệu JSON lên một cái gì đó như http://localhost:3000/example bằng tên người dùng và mật khẩu chính xác. Tuy nhiên, nó trả về nội dung HTML nếu tên người dùng và mật khẩu không chính xác. Tôi có phải viết cái gì đó trả về dữ liệu json về thành công đăng nhập/fialure không?

3) Để liên lạc giữa ứng dụng iPhone và ứng dụng web của tôi. Tôi có chính xác khi viết một API RESTful ở phía ứng dụng web không? Tôi có cần sử dụng tài nguyên hoạt động không?

Tôi thực sự bị mắc kẹt trên bức tranh tổng thể lớn về cách hoạt động của tất cả. Cảm ơn!

Trả lời

22

Có nhiều cách để bạn có thể làm điều này. Tôi đã làm gì để có được lập mưu để trở lỗi cho ứng dụng iphone của tôi rằng tôi có thể giải thích (ví dụ 401) đã tạo ra một ứng dụng thất bại tùy chỉnh:

# 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 

Nếu không Vạch chỉ trả về HTML với một mã phản hồi chuyển hướng bất kể tên đăng nhập thông tin là chính xác hoặc không chính xác.

Kể từ khi ứng dụng của tôi đòi hỏi người sử dụng để xác thực đối với đường ray phụ trợ của tôi, tôi thực hiện một hệ thống đăng nhập đơn giản như thế này:

#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' 

Sau đó, trong ứng dụng iphone bạn có thể xác nhận bằng cách gửi một yêu cầu GET đến/đăng nhập như thế này (tôi sử dụng ASIHTTPRequest vì nó là tuyệt vời):

- (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  
} 

Sau đó, bất cứ khi nào bạn cần phải gửi dữ liệu đến các ứng dụng bạn có thể lấy tên người dùng và mật khẩu mặc định từ người dùng và đính kèm chúng vào các yêu cầu. Nếu bạn cần an toàn hơn, bạn có thể lưu trữ chúng trong Keychain.

Tôi chắc chắn có nhiều cách tốt hơn để thực hiện việc này, nhưng hy vọng điều này có thể giúp bạn suy nghĩ về các chiến lược xác thực API.

+0

Hey Johnny, tôi đã bật xác thực http cơ bản và tôi đã thử triển khai điều này và mỗi khi tôi cố truy cập http: // localhost: 3000/login? User [email] [email protected]&user [password] = mật khẩu, tôi nhận được "{" lỗi ":" Bạn cần phải đăng nhập hoặc đăng ký trước khi tiếp tục. "}" Suy nghĩ của bạn? – BeachRunnerFred

0

tôi sẽ khuyên bạn nên dùng một cái nhìn tại các tài liệu cung cấp ở đây

https://github.com/plataformatec/devise/blob/v1.1.6/README.rdoc

Bạn cũng có thể muốn hai xem screencasts trên devise.

Kể từ khi có rất nhiều cách khác nhau để xử lý auth, bạn sẽ nhận được một sự hiểu biết tốt hơn về những gì có sẵn từ devise hỗ trợ BasicAuth và Token dựa auth

+1

Cảm ơn Aaron. Tôi đã đọc readme nhiều lần. Tôi cũng đã xem các screencasts trên railscast. Tôi chỉ cần một số loại khung tôi có thể làm theo. Có rất nhiều khái niệm tôi thấy khó có thể đặt nó lại với nhau. –