2012-03-09 15 views
5

वसीयत मैं सेटअप करने के लिए इस उत्कृष्ट लेख मेरी रेल के authentification हिस्सा अनुसरण कर रहा हूँ (3.2) एपीआई:टोकन प्रमाणीकरण और

जोड़ा वसीयत:
http://blog.joshsoftware.com/2011/12/23/designing-rails-api-using-rabl-and-devise/

मैं निम्नलिखित कदम किया है Gemfile

सक्षम उपयोगकर्ता मॉडल के लिए वसीयत और माइग्रेशन आवश्यक

दौड़ा को

-मेरे उपयोगकर्ता मॉडल

है
class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable 
    devise :token_authenticatable 

    attr_accessible :email, :authentication_token, :password, :password_confirmation, :remember_me 
end 

साथ ही डेटा में token_authenticable (माइग्रेशन के माध्यम से)।

साथ RegistrationController -Subclassed:

class RegistrationsController < Devise::RegistrationsController 
    def new 
    super 
    end 

    def create 
    resource = warden.authenticate!(:scope => resource_name, :recall => " {controller_path}#new") 
    sign_in(resource_name, resource) 
    current_user.reset_authentication_token! 
    respond_with resource, :location => after_sign_in_path_for(resource) 
    end 

    def update 
    super 
    end 
end 

अलावे routes.rb, मेरे पास है:

devise_for :users, :controllers => {:registrations => "registrations"} 

उपयोगकर्ता निर्माण

मैं निम्नलिखित अनुरोध बनाने के लिए करना चाहते हैं एक उपयोगकर्ता और प्रमाणीकरण_टोकन वापस भेजने के लिए:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"user":{"email":"[email protected]", "password":"pass"}}' 'http://localhost:3000/users.json 

मेरी समझ यह है कि तर्क पंजीकरण नियंत्रक की "निर्माण" विधि में जाना चाहिए (जो उपयोगकर्ता को बनाना चाहिए और उसे एक ही समय में लॉग इन करना चाहिए)। मुझे लगता है कि मैं गलत होना चाहिए के रूप में संदेश मैं बदले में मिल गया है:

{"error":"You need to sign in or sign up before continuing."} 

बनाया है और लॉग इन नए उपयोगकर्ता के लिए गायब टुकड़ा क्या है? पंजीकरण नियंत्रक # के लिए मैप किए गए उपयोगकर्ताओं.जेसन को पोस्ट नहीं है?

उपयोगकर्ता लॉगिन

इसके अलावा, मैं निम्नलिखित अनुरोध

curl -H "Accept: application/json" -H "Content-type: application/json" -X GET -d '{"user":{"email":"[email protected]","password":"pass"}}' 'http://localhost:3000/users.json 

मुझे लगता है कि (उसे अपने authentification_token एक बार लॉगिन/पासवर्ड जाँच कर दिया है वापस भेजने) में एक उपयोगकर्ता लॉग ऑन करना चाहते हैं तर्क पंजीकरण नियंत्रक की "अद्यतन" विधि में जाना चाहिए, लेकिन इसके बारे में 100% निश्चित नहीं है। एक बार लॉगिन करने के बाद मैं कुछ अन्य मॉडलों के निर्माण/दृश्य की रक्षा के लिए टोकन प्रमाणीकरण जोड़ूंगा।

अद्यतन

जब मैं जारी करते हैं:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"user":{"email":"[email protected]", "password": "mypass", "phone":"1234567890"}}' 'http://localhost:3000/users.json' 

मैं निम्नलिखित संदेश मिला:

Started POST "/users.json" for 127.0.0.1 at 2012-03-11 20:50:05 +0100 
Processing by RegistrationsController#create as JSON 
Parameters: {"user"=>{"email"=>"[email protected]", , "password"=>"[FILTERED]", "phone"=>"1234567890"}, "registration"=>{"user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "phone"=>"1234567890"}, "action"=>"create", "controller"=>"registrations", "format"=>"json"}} 
WARNING: Can't verify CSRF token authenticity 
Completed 401 Unauthorized in 1ms 
उपयोगकर्ता बनाया और हस्ताक्षरित किया गया है क्यों में और क्यों नहीं authentication_token कोई भी विचार

वापस आ गया है?

+0

यदि आप प्रमाणीकरण से पहले उपयोगकर्ता को बनाना चाहते हैं, तो आपको वह कोड जोड़ना चाहिए। देवता ऐसा नहीं करता है। –

उत्तर

10

यह मेरी गलती है, मैं ब्लॉग पोस्ट अपडेट करूंगा। आप आप पंजीकरण नियंत्रक में उपयोगकर्ता बनाने के लिए

if params[:api_key].blank? or params[:api_key] != API_KEY 
    render :json => {'errors'=>{'api_key' => 'Invalid'}}.to_json, :status => 401 
    return 
end 
build_resource 
if resource.save 
    sign_in(resource) 
    resource.reset_authentication_token! 
    #rabl template with authentication token 
    render :template => '/devise/registrations/signed_up' 
else 
    render :template => '/devise/registrations/new' #rabl template with errors 
end 

मुझे पता है अगर आप किसी भी समस्या का सामना करते हैं निम्नलिखित कोड जोड़ने की जरूरत?

+0

बहुत बहुत धन्यवाद, पंजीकरण ठीक काम कर रहा है। Sign_in भाग के संबंध में, मेरी समझ यह है कि संशोधित करने के लिए कोड सत्र नियंत्रक की "बनाएं" विधि में है, क्या आप पुष्टि करते हैं? इस मामले में, प्रमाणीकरण के लिए स्पष्ट रूप से लॉगिन/पासवर्ड भेजा गया है? – Luc

+0

आप आप गैर एपीआई का उपयोग कर रहे हैं, तो sessions_controller # में निम्नलिखित पंक्ति जोड़ें 'sign_in (RESOURCE_NAME, संसाधन) current_user.reset_authentication_token' – Sethupathi

0

ल्यूक के प्रश्न के संबंध में, यह मेरी समझ भी है।

उदाहरण के लिए, डिफ़ॉल्ट गैर-एपीआई लॉगिन का उपयोग करके, SessionsController.create लॉगिन को संभालता है। मैं authentication_token कैसे पुनर्प्राप्त करूं और बाद में एपीआई कॉल के हिस्से के रूप में इसका पुन: उपयोग करूं? इसके अलावा, resource.reset_authentication_token! पर कॉल करने के लिए मैं SessionsController.create को ओवरराइड कैसे करूं?

+0

के बाद विधि बनाने की जरूरत है, तो आप current_user.authentication_token के रूप में यह उपयोग कर सकते हैं – Sethupathi

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