9

मैं इस ऑनलाइन का जवाब नहीं ढूंढ पाया - एक तरफ Google+ साइन इन बटन का उपयोग करने से, जिसे मैं इस बिंदु पर उपयोग नहीं करना चाहता क्योंकि मैं जावास्क्रिप्ट में नहीं जाना चाहता हूं अगर मैं नहीं करता करने के लिए नहीं है।रेल, ओमनीएथ, google_oauth2, google-api-client, moments.insert ... 401 अनधिकृत ... क्यों?

मेरे पास रेल एप्लिकेशन (रूबी v1.9.3, रेल v3.2.13) पर रूबी है जिसमें मैंने ओमनीएथ को जोड़ दिया है और मैं Google+ के साथ एकीकृत करने के लिए google_oauth2 मणि ​​का उपयोग कर रहा हूं।

मेरे साधारण लक्ष्य एक उपयोगकर्ता, गूगल + के साथ प्रमाणित मेरी Google API प्रोजेक्ट को पहुंच प्रदान, और फिर Google+ उपयोगकर्ता की तिजोरी गूगल-api-ग्राहक मणि का उपयोग कर के लिए एक क्षण पोस्ट करने के लिए सक्षम होने के लिए अनुमति देने के लिए है।

मैंने पहले ही अपना Google एपीआई प्रोजेक्ट सेटअप कर लिया है, वेब अनुप्रयोगों के लिए ओएथ 2.0 बनाया है, और Google+ एपीआई सेवा सक्षम की है।

मेरे पास निम्नलिखित प्रदाता के साथ OmniAuth सेटअप है और मैंने मुझे पोस्ट करने की अनुमति देने के लिए request_visible_actions विकल्प जोड़ा है (मुझे लगता है कि यह सही है लेकिन मैंने इसे किसी भी कोड उदाहरण से ऑनलाइन नहीं देखा है .. ।):

provider :google_oauth2, CLIENT_ID, CLIENT_SECRET, { 
    access_type: 'offline', 
    scope: 'userinfo.email,userinfo.profile,plus.me,https://www.googleapis.com/auth/plus.login', 
    request_visible_actions: 'http://schemas.google.com/AddActivity', 
    redirect_uri: 'http://localhost/auth/google_oauth2/callback' 
} 

जब मैं अपने उपयोगकर्ता रीडायरेक्ट करने के लिए/प्रमाणन/google_oauth2, यह अपने ऐप्स को अधिकृत करने के लिए Google+ पर उपयोगकर्ता भेजती है और उपयोगकर्ता को मंजूरी दी है, यह मेरी कॉलबैक जहाँ मैं request.env उपयोग कर सकते हैं रिटर्न ["omniauth.auth"] और इसमें मेरी सारी जानकारी है, जिसमें टोकन, ईमेल पता इत्यादि शामिल हैं। मैं auth ["credentials"] ["टोकन"] से access_token संग्रहीत कर रहा हूं।

अभी तक इतना अच्छा है, है ना?

जब मैं निम्नलिखित कोड का उपयोग कर पल पोस्ट करने का प्रयास करता हूं, तो मुझे 401 अनधिकृत त्रुटि का संकेत देने वाला अपवाद मिलता है।

client = Google::APIClient.new 

client.authorization.access_token = self.access_token 

plus = client.discovered_api('plus', 'v1') 

moment = { 
    :type => 'http://schemas.google.com/AddActivity', 
    :target => { :id => Time.now.to_i.to_s, 
       :description => message, 
       :name => message 
    } 
} 

# post a moment/activity to the vault/profile 
req_opts = { :api_method => plus.moments.insert, 
      :parameters => { :collection => 'vault', :userId => 'me', }, 
      :body_object => moment 
} 

response = client.execute!(req_opts).body 

मैं भी

credentials = Hash.new 
credentials[:access_token] = self.access_token 
credentials[:refresh_token] = self.refresh_token 
credentials[:expires_at] = self.expires_at 
client.authorization.update_token!(credentials) 

लेकिन कोई भाग्य के साथ

client.authorization.access_token = self.access_token 

की जगह की कोशिश की है।

मुझे लगता है कि इस मुद्दे को या तो के साथ क्या करना है:

  1. OmniAuth गूगल के request_visible_actions सही ढंग से
  2. मेरे गूगल :: APIClient वस्तु ठीक से

में टोकन की स्थापना नहीं जारी करने नहीं मुझे अब तक निम्न संसाधनों का उपयोग करके मिल गया है, लेकिन मैं आधिकारिक तौर पर अटक गया हूं:

कोई भी विचार की सराहना की होगी!

+0

मुझे यह वही समस्या है, मेरे पास अभी तक कोई भाग्य नहीं है। – cicloon

उत्तर

0

एपीआई कंसोल में, क्या आपने वेब एप्लिकेशन या इंस्टॉल एप्लिकेशन के रूप में पंजीकरण किया था? मुझे लगता है कि आपके मामले के लिए आपको इंस्टॉल किया गया एप्लिकेशन चुनना होगा, ताकि यदि उपयोगकर्ता ऑनलाइन नहीं है तो टोकन मान्य है।

+0

मैं उसी कॉन्फ़िगरेशन के साथ गतिविधियों को सूचीबद्ध करने में सक्षम हूं, इसलिए मुझे लगता है कि इससे संबंधित नहीं है। – cicloon

3

'google-api-client' के साथ 'omniauth-google-oauth2' का उपयोग करके वेब ऐप से मेरा कामकाजी कोड यहां दिया गया है। यह नमूना कोड कैलेंडर एपीआई का उपयोग करता है, लेकिन मुझे लगता है कि यह आपके लिए काम करेगा।

require 'google/api_client' 

class Calendar 
    def initialize(user) 
    @user = user 
    end 

    def events 
    result = api_client.execute(:api_method => calendar.events.list, 
          :parameters => {'calendarId' => 'primary'}, 
          :authorization => user_credentials) 

    result.data 
    end 

    private 

    def api_client 
    @client ||= begin 
     client = Google::APIClient.new(application_name: 'xxx', application_version: '0.0.1') 
     client.authorization.client_id = ENV["GOOGLE_KEY"] 
     client.authorization.client_secret = ENV["GOOGLE_SECRET"] 
     client.authorization.scope = 'https://www.googleapis.com/auth/calendar' 
     client 
    end 
    end 

    def calendar 
    @calendar ||= api_client.discovered_api('calendar', 'v3') 
    end 

    def user_credentials 
    auth = api_client.authorization.dup 
    # @user.credentials is an OmniAuth::AuthHash cerated from request.env['omniauth.auth']['credentials'] 
    auth.update_token!(access_token: @user.credentials.token) 
    auth 
    end 
end 
संबंधित मुद्दे