2016-04-28 5 views
6

मैं "omniauth-google-oauth2" मणि के साथ रेल 4.2.5 का उपयोग कर रहा हूं। मेरे आवेदन में, उपयोगकर्ता साइन इन करने में सक्षम होंगे एकमात्र तरीका उनके Google या फेसबुक लॉगिन के माध्यम से है। मैं क्या चाहता हूं कि मेरे आवेदन को प्रारंभिक उपयोगकर्ता, मुझे (ईमेल = '[email protected] ") के साथ व्यवस्थापक भूमिका के साथ पूर्व-पॉप्युलेट करना है। यह प्रोग्रामेटिक रूप से करना अच्छा होगा ताकि जब मैं इसे अन्य वातावरण में घुमा दूं तो मैं उसी कोड का उपयोग कर सकता हूं।मैं Google उपयोगकर्ता के साथ अपने रेल 4 एप्लिकेशन को पूर्व-पॉप्युलेट कैसे करूं?

मेरे भूमिकाओं तालिका (db/seeds.rb के माध्यम से) भूमिकाओं

Admin 
User 

और मेरे एप्लिकेशन/मॉडल/user.rb फ़ाइल

def self.from_omniauth(auth) 
    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user| 
    user.provider = auth.provider 
    user.uid = auth.uid 
    user.name = auth.info.name 
    user.oauth_token = auth.credentials.token 
    user.oauth_expires_at = Time.at(auth.credentials.expires_at) 
    user.save! 
    end 
end 

है मुझे यकीन है कि कैसे करने के लिए नहीं कर रहा हूँ है जो भी मैं चाहता हूं, वही करें, और इसलिए कुछ वकील का मूल्य होगा।

उत्तर

2

अब मान लें कि आपके पास Google uid है। बस अपने बीज से एक उपयोगकर्ता बनाने के लिए, उदाहरण के लिए:

user = User.new(
    provider: "google", 
    uid: "your-google-id", 
    email: "[email protected]", 
    name: "Your name" 
) 
user.roles << admin_role # Replace this line with your role assignment 
user.save # Perhaps use save(validate: false) if there're validations for other fields 
इसी के साथ

, जब आप Google के साथ प्रवेश करें, omniauth तर्क बीज उपयोगकर्ता को खोजने के लिए, जिसका अर्थ है आप व्यवस्थापक के रूप में कार्य करने में सक्षम होंगे में सक्षम होना चाहिए ।

कृपया ध्यान दें कि यह मानता है कि आपको आगे की कार्रवाई करने के लिए Google oauth टोकन की आवश्यकता नहीं होगी क्योंकि आपके पास सहेजा नहीं गया है, और आपके from_omniauth से यह नहीं बचा है कि उपयोगकर्ता रिकॉर्ड पहले से मौजूद है या नहीं।

पीएस आपके उदाहरण कोड से, ओथ जानकारी सीधे User मॉडल (provider और uid) पर सहेजी गई है। इसके साथ, मुझे डर है कि उपयोगकर्ता एक ही समय में फेसबुक और Google के साथ लॉग इन करने में सक्षम नहीं होगा क्योंकि दोनों इन दोनों क्षेत्रों में सेव करना चाहते हैं।

अद्यतन: मेरे कोडबेस से एक मॉडल चिपका रहा है जो User से एक अलग मॉडल है जो एकाधिक प्रदाताओं लॉगिन करता है। बेशक नियंत्रक को User के बजाय Authorization का उपयोग करने के लिए अद्यतन करने की आवश्यकता है। बस अगर यह मदद करता है।

class Authorization < ActiveRecord::Base 
    belongs_to :user 

    def self.from_omniauth(auth) 
    authorization = where(auth.slice(:provider, :uid)).first_or_create 
    return authorization if authorization.user 

    if user = User.where(email: auth.info.email).first 
     authorization.bind_user(user) 
    else 
     user = authorization.create_user(auth.info) 
    end 

    authorization 
    end 

    def bind_user(user) 
    self.user = user 
    save 
    end 

    def create_user(info) 
    user = User.new(
     email:  info.email, 
     password: Devise.friendly_token[0, 20], 
     first_name: info.first_name, 
     last_name: info.last_name, 
    ) 
    user.save(validate: false) 

    bind_user(user) 

    user 
    end 
end 
+0

हाय, यह ठीक है अगर उपयोगकर्ता को Google और फेसबुक दोनों और मेरे ऐप में एक साथ लॉग इन नहीं किया जा सकता है। मैं उलझन में हूं कि आपने उपयोगकर्ता मॉडल से self.from_omniauth को प्राधिकरण मॉडल में क्यों स्थानांतरित किया।क्या यह डुप्लिकेट उपयोगकर्ता नहीं बनते हैं यदि मेरे डेटाबेस में पहले से ही प्रदाता और यूआईडी से मेल खाता उपयोगकर्ता है? – Dave

+0

@ डेव हां प्राधिकरण मॉडल का उद्देश्य एक ही उपयोगकर्ता के लिए एकाधिक प्रदाताओं का समर्थन करना है। इसके बिना (आपके कोड से) उपयोगकर्ता को फेसबुक और Google के साथ लॉग इन करते समय दो बार बनाया जाएगा। यह कोई बड़ा मुद्दा नहीं है, लेकिन यदि आप प्रदाता से ईमेल पुनर्प्राप्त करते हैं और उपयोगकर्ताओं को तालिका पहचानकर्ता के रूप में ईमेल करते समय स्टोर करते हैं और साथ ही यह समस्याएं भी उत्पन्न करता है। –

1

OAuth2 प्रक्रिया को निष्पादित करने के लिए आपको अपने seed.rb फ़ाइल के माध्यम से अपने नियंत्रक के माध्यम से एक अनुरोध करना होगा।

आप सबसे अधिक संभावना साख में दर्ज करें या एक जीयूआई से अपने गूगल खाते का चयन करना होगा के बाद से, मैं अपने seed.rb फ़ाइल में एक प्रणाली आदेश अपने अधिकृत कार्रवाई का यूआरएल के लिए एक ब्राउज़र खुलती चलाने की सलाह देते।

# Mac: 
system("open <url_to_authorize_action>") 

इस धारावाहिक किए जाने के तुरंत बाद की जरूरत है, थोड़ी देर के पाश कि डीबी हर एन समय सीमा की जाँच करता है, तो यह है कि उपयोगकर्ता के लिए अधिकृत है देखने के लिए जोड़ सकते हैं।

while <user_not_authorized> do 
    sleep <N seconds> 
end 

आप इसे कई देव वातावरण में रोल कर सकते हैं लेकिन स्पष्ट रूप से उत्पादन नहीं कर सकते हैं।

+0

मैं कुछ स्वचालित करना चाहता हूं, जिसके लिए फ़ाइल को चलाने के अलावा उपयोगकर्ता इंटरैक्शन की आवश्यकता नहीं है। सीएनए मैं इस तथ्य का लाभ उठाता हूं कि मैं समय से पहले अपना Google आईडी जानता हूं? – Dave

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