Heroku

2016-02-02 10 views
8

पर गुप्त कुंजी के साथ एक जेसन फ़ाइल कैसे अपलोड करें मैं एक रेल ऐप बना रहा हूं जो रूबी के लिए Google एपी क्लाइंट लाइब्रेरी का उपयोग करके Google Analytics से डेटा खींचती है।Heroku

मैं ओएथ 2 का उपयोग कर रहा हूं और स्थानीय मशीन पर विकास में काम कर रहा सबकुछ प्राप्त कर सकता हूं। मेरी समस्या यह है कि लाइब्रेरी दो गुप्त कुंजी स्टोर करने के लिए डाउनलोड की गई फ़ाइल, client_secrets.json का उपयोग करती है।

समस्या: मैं Heroku का उपयोग कर रहा हूं और फ़ाइल को उनके उत्पादन सर्वर पर प्राप्त करने के लिए एक तरीका चाहिए।

मैं इस फ़ाइल को अपने जीथब रेपो में जोड़ना नहीं चाहता क्योंकि परियोजना सार्वजनिक है।

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

कोशिश की गई: जहाँ तक मैं आपको बता सकता हूं कि आप बैश कंसोल के माध्यम से हेरोकू में एक फ़ाइल एससीपी नहीं कर सकते हैं। मेरा मानना ​​है कि ऐसा करने पर आपको एक नया डिनो मिलता है और जो भी आप जोड़ते हैं वह केवल अस्थायी होगा। मैंने कोशिश की लेकिन एससीपी को सही तरीके से काम नहीं कर सका, इसलिए इस बारे में 100% निश्चित नहीं है।

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

की कोशिश की: साथ ही मैं एक तरह से यह पता लगाने की सिर्फ JSON फ़ाइल से चाबी बाहर खींच, उन्हें कॉन्फ़िग Vars में डाल दिया, और Git करने के लिए JSON फ़ाइल जोड़ने के लिए कोशिश की है। मैं एक JSON फ़ाइल में ENV["KEY"] डालने का कोई तरीका नहीं समझ सकता।


उदाहरण कोड Google library has a method कि एक प्राधिकरण ग्राहक बनाने के लिए JSON फ़ाइल लोड करता है। क्लाइंट फिर टोकन लाता है (या एक प्राधिकरण यूआरएल देता है)।

client_secrets = Google::APIClient::ClientSecrets.load('client_secrets.json') 
auth_client = client_secrets.to_authorization 

** ध्यान दें कि गूगल पृष्ठ पर उदाहरण के एक फ़ाइल नाम है क्योंकि यह एक डिफ़ॉल्ट ENV वार एक रास्ता

लिए निर्धारित किया गया thats का उपयोग करता है प्रदर्शित नहीं करता है मैं समझ यह सब बहुत आसान है, तो हो सकता है ClientSecrets.load() विधि जेएसओएन, एक स्ट्रिंग या हैश ले जाएगा जो एक कॉन्फ़ वर्र में जा सकती है।

दुर्भाग्यवश यह हमेशा एक फ़ाइल पथ चाहता है। जब मैं इसे JSON, एक स्ट्रिंग या हैश खिलाता हूं, तो यह उड़ाता है। I've seen someone get around the issue with a p12 key here, लेकिन मुझे यकीन नहीं है कि मेरी स्थिति में इसे दोहराना कैसे है।

प्रयास नहीं किया है: मेरे हालांकि केवल एक अन्य है (एक तरफ एडब्ल्यूएस में जाने से) एडब्ल्यूएस पर JSON फ़ाइल डाल दिया और रेल खींच जब जरूरत है। मुझे यकीन नहीं है कि यह फ्लाई पर किया जा सकता है या यदि रेल सर्वर बूट होने पर फ़ाइल को खींचने की आवश्यकता होगी। बहुत अधिक काम की तरह लगता है, लेकिन इस बिंदु पर मैंने कोशिश करने के लिए तैयार होने पर कुछ घंटे बिताए हैं। https://github.com/dladowitz/slapafy/blob/master/app/controllers/welcome_controller.rb

उत्तर

7

खोज GitHub तक मैंने पाया कि कोई व्यक्ति किसी दूसरे विधि है कि एक फ़ाइल पथ के बजाय एक तर्क के रूप JSON स्ट्रिंग इस्तेमाल किया इस्तेमाल किया था: Google::APIClient::ClientSecrets.new(JSON.parse(ENV['GOOGLE_CLIENT_SECRETS']))

यह मैं एक ENV वीएआर में JSON लपेट कर सकते हैं। दुनिया फिर से समझ में आता है।

+0

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

+1

मैं ** figaro ** मणि का उपयोग कर रहा हूं और फिर application.yml में अपने पर्यावरण चर को संग्रहीत कर रहा हूं। इस फ़ाइल में मैंने वैरिएबल सेट किया है: 'GOOGLE_CLIENT_SECRETS: '{" वेब ": {" client_id ":" XXXXXX-XXXXXXXXXXXX.apps.googleusercontent.com "," project_id ":" XXXX-XXXX " , "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": " https://www.googleapis.com/oauth2/v1/certs "," client_secret ":" xxxXXXXXXX "," redirect_uris ": [" http: // localhost: 3000/oauthredirect "]}} ' –

+1

@ paullj1 हेरोकू में कॉन्फ़िगर वार मान लगभग समान है, लेकिन मैंने सबसे बाहरी एकल उद्धरण हटा दिए हैं। इसके ऊपर मेरे समाधान में ध्यान देने योग्य एक बात यह है कि मुझे एक अलग विधि मिली जो फ़ाइल नाम नहीं लेती। मूल रूप से मैं 'गूगल :: APIClient :: ClientSecrets.load() का उपयोग किया गया था' अब मैं 'उपयोग कर रहा हूँ गूगल :: APIClient :: ClientSecrets.new()' –

1

मैं गूगल एपीआई का उपयोग कर यह एक ही समस्या में पड़ गए:

इस विशिष्ट नियंत्रक मैं पर काम कर रहा हूँ है। मैं पीएस फाइल में एक नया बहुत ही गुप्त पासफ्रेज असाइन करने के लिए ओपनएसएल का उपयोग करके समाप्त हुआ, रेपो में उस नई फाइल को संग्रहीत करना, और फिर पासफ्रेज़ को ऐप रहस्यों और हेरोकू एनवी वैरिएबल पर डालना।

इस तरह, फ़ाइल रेपो में है लेकिन इसे पासफ्रेज़ के बिना एक्सेस/पढ़ा नहीं जा सकता है।

This पोस्ट डिफ़ॉल्ट Google पी 12 पासफ्रेज को 'नोटसेक्रेट' से कुछ सुरक्षित में बदलने में सहायक था।

def authorize! 
    @client.authorization = Signet::OAuth2::Client.new(
    #... 
    :signing_key => key 
) 
end 

def key 
    Google::APIClient::KeyUtils.load_from_pkcs12(key_path, ENV.fetch('P12_PASSPHRASE')) 
end 

def key_path 
    "#{Rails.root}/config/google_key.p12" 
end 
1

रूप this thread में चर्चा की, बल्कि एक json कुंजी फाइल करने के लिए एक रास्ता आपूर्ति की तुलना में आप तीन ENV चर बजाय सेट कर सकते हैं:

GOOGLE_ACCOUNT_TYPE=service_account 
GOOGLE_PRIVATE_KEY=XXX 
GOOGLE_CLIENT_EMAIL=XXX 

Source here

+0

यह बादल प्राकृतिक भाषा एपीआई का उपयोग कर काम करने के लिए लग रहा था और मुझे चारों ओर गड़बड़ कर बचाया। – Nick

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