2011-06-24 13 views
24

मैं रेल पर रूबी के लिए नया हूं लेकिन मैं अपने आईक्यू ऐप से डेटा को अपने एसक्यूलाइट डेटाबेस से रेल वेब ऐप में भेजना चाहता हूं। एक "सिंक" सेवा की तरह।डेविस और आईफोन ऐप के बीच HTTP प्रमाणीकरण

मैं वेब ऐप के लिए प्रमाणीकरण के लिए उपयोग कर रहा हूं। मैंने मूल HTTP प्रमाणीकरण सक्षम किया है और मैं xml या json डेटा के लिए वेबसाइट में घुमा सकता हूं। जब मैं पोस्ट हेडर जेएसओएन और उपयोगकर्ता नाम और पासवर्ड के साथ सेट करता हूं तो मैं वेबसाइट पर भी डेटा अपलोड कर सकता हूं।

यहां मैं कहां फंस गया हूं।

1) मैं पहली लॉगिन के बाद उपयोगकर्ता को साइन इन कैसे रखूं? क्या मैं वेबसाइट पर डेटा भेजते समय हर बार http प्रमाणीकरण का उपयोग करता हूं? मैंने टोकन प्रमाणीकरण के बारे में पढ़ा है लेकिन मुझे यकीन नहीं है कि इसका उपयोग कैसे किया जाए।

2) मैं सही उपयोगकर्ता नाम और पासवर्ड के साथ http://localhost:3000/example जैसे JSON डेटा पोस्ट कर सकता हूं। हालांकि, उपयोगकर्ता नाम और पासवर्ड गलत होने पर यह HTML सामग्री देता है। क्या मुझे ऐसा कुछ लिखना है जो लॉगिन सफलता/शीश के बारे में जेसन डेटा देता है?

3) मेरे आईफोन ऐप और मेरे वेब ऐप के बीच संवाद करने के लिए। क्या मैं वेब ऐप साइड पर एक रीस्टफुल एपीआई लिखने में सही हूं? क्या मुझे सक्रिय संसाधनों का उपयोग करने की ज़रूरत है?

मैं वास्तव में यह सब कैसे काम करता है की समग्र तस्वीर पर अटक गया हूं। धन्यवाद!

उत्तर

22

ऐसे कई तरीके आप ऐसा कर सकते हैं। क्या मैंने किया था वसीयत मेरे 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 

अन्यथा वसीयत बस की परवाह किए बिना एक रीडायरेक्ट प्रतिक्रिया कोड के साथ HTML देता है कि क्या लॉगिन जानकारी सही या गलत थी।

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

तो फिर तुम/लॉगिन करने के लिए इस तरह GET अनुरोध भेजकर मान्य कर सकते हैं iphone अनुप्रयोग में:

के बाद से मेरे ऐप की आवश्यकता उपयोगकर्ताओं को अपनी रेल बैकएंड के खिलाफ प्रमाणित करने के लिए, मैं इस तरह एक सरल लॉगिन प्रणाली लागू की (मैं 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  
} 

तो फिर तुम उपयोगकर्ता चूक से उपयोगकर्ता नाम और पासवर्ड पुनः प्राप्त करने और उन्हें अनुरोध करने के लिए संलग्न कर सकते हैं जब भी आप अनुप्रयोग के लिए डेटा पोस्ट करने के लिए की जरूरत है। यदि आपको अधिक सुरक्षित होने की आवश्यकता है, तो आप उन्हें कीचेन में स्टोर कर सकते हैं।

मुझे यकीन है कि ऐसा करने के बेहतर तरीके हैं, लेकिन उम्मीद है कि यह आपको एपीआई प्रमाणीकरण रणनीतियों के बारे में सोच सकता है।

+0

अरे जॉनी, मैंने मूल http प्रमाणीकरण सक्षम किया और मैंने इसे लागू करने का प्रयास किया और हर बार जब मैं http: // localhost: 3000/login? User [email] [email protected]&user [password] = पासवर्ड तक पहुंचने का प्रयास करता हूं, मुझे एक मिलता है "{" त्रुटि ":" आपको जारी रखने से पहले साइन इन करना या साइन अप करना होगा। "}" आपके विचार? – BeachRunnerFred

0

मैं प्रदान की यहाँ

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

तुम भी दो वसीयत पर स्क्रीनकास्ट घड़ी चाहते हो सकता है प्रलेखन पर एक नज़र डालने की सिफारिश करेंगे।

चूंकि प्रमाणन को संभालने के लिए विभिन्न तरीके हैं, तुम क्या उपलब्ध है की एक बेहतर समझ के आधार प्रमाणन प्राप्त वसीयत BasicAuth का समर्थन करता है के बाद से और टोकन चाहिए

+1

धन्यवाद हारून। मैंने कई बार रीडेम पढ़ा है। मैंने रेलवेकास्ट पर स्क्रीनकास्ट भी देखा है। मुझे बस कुछ प्रकार की ढांचे की आवश्यकता है जो मैं कर सकता हूं। इतनी सारी अवधारणाएं हैं कि मुझे इसे एक साथ रखना मुश्किल लगता है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^