2011-09-21 8 views
5

Używam Omniauth do żądania poświadczeń Gmaila użytkownika, więc mogę poprosić znajomych/kontakty użytkowników później.Jak utworzyć token dostępu w rubinach na szynach dla kontaktów Gmail

W tej chwili otrzymuję listę znajomych wewnątrz kontrolera OmniauthCallbacks, używając tokena dostępu, który generuje dla mnie żądanie uwierzytelnienia. Coś takiego

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 

    def google 
    auth = env["omniauth.auth"] 
    gmail_contacts 
    .... 
    end 

    ..... 
    protected 
    def gmail_contacts 
    access_token = env["omniauth.auth"]['extra']['access_token'] 
    response = access_token.request(:get, 
     "https://www.google.com/m8/feeds/contacts/default/full?max-results=10000") 
    ..... 
    end 
end 

Jak mogę używać poświadczenia, że ​​mam zapisane w bazie danych, aby utworzyć nowy żeton dostępu, więc mogę zadzwonić google API z innego kontrolera?

+0

De Tester: Czy znalazłeś nienawistną odpowiedź? :) Daj nam znać. –

+0

@DavidJames sprawdź moją odpowiedź. Właśnie napisałem dzisiaj i działa idealnie na mój koniec .. –

+0

możliwy duplikat [Jaka jest najlepsza wtyczka do pobrania listy kontaktów Gmail, Yahoo, Hotmail, Twitter i Facebook w Ruby on Rails] (http://stackoverflow.com/questions/6311132/whats-the-best-plugin-to-fetch-gmail-yahoo-hotmail-twitter-and-facebook-conta) –

Odpowiedz

0

Pomysł - sprawdź, czy params[:oauth_verifier], który został wysłany z Gmaila, będzie działać w kolejnych żądaniach. Ale może jest to dobre tylko na tę jedną prośbę.

1

Uzyskaj swój identyfikator klienta i numer_adresu klienta od here. To jest szorstki skrypt, który działa doskonale. Zmodyfikowano zgodnie z Twoimi potrzebami.

require 'net/http' 
    require 'net/https' 
    require 'uri' 
    require 'rexml/document' 

    class ImportController < ApplicationController 

     def authenticate 
     @title = "Google Authetication" 

     client_id = "xxxxxxxxxxxxxx.apps.googleusercontent.com" 
     google_root_url = "https://accounts.google.com/o/oauth2/auth?state=profile&redirect_uri="+googleauth_url+"&response_type=code&client_id="+client_id.to_s+"&approval_prompt=force&scope=https://www.google.com/m8/feeds/" 
     redirect_to google_root_url 
     end 

     def authorise 
     begin 
      @title = "Google Authetication" 
      token = params[:code] 
      client_id = "xxxxxxxxxxxxxx.apps.googleusercontent.com" 
      client_secret = "xxxxxxxxxxxxxx" 
      uri = URI('https://accounts.google.com/o/oauth2/token') 
      http = Net::HTTP.new(uri.host, uri.port) 
      http.use_ssl = true 
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
      request = Net::HTTP::Post.new(uri.request_uri) 

      request.set_form_data('code' => token, 'client_id' => client_id, 'client_secret' => client_secret, 'redirect_uri' => googleauth_url, 'grant_type' => 'authorization_code') 
      request.content_type = 'application/x-www-form-urlencoded' 
      response = http.request(request) 
      response.code 
      access_keys = ActiveSupport::JSON.decode(response.body) 

      uri = URI.parse("https://www.google.com/m8/feeds/contacts/default/full?oauth_token="+access_keys['access_token'].to_s+"&max-results=50000&alt=json") 

      http = Net::HTTP.new(uri.host, uri.port) 
      http.use_ssl = true 
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
      request = Net::HTTP::Get.new(uri.request_uri) 
      response = http.request(request) 
      contacts = ActiveSupport::JSON.decode(response.body) 
      contacts['feed']['entry'].each_with_index do |contact,index| 

      name = contact['title']['$t'] 
      contact['gd$email'].to_a.each do |email| 
       email_address = email['address'] 
       Invite.create(:full_name => name, :email => email_address, :invite_source => "Gmail", :user_id => current_user.id) # for testing i m pushing it into database.. 
      end 

      end 
     rescue Exception => ex 
      ex.message 
     end 
     redirect_to root_path , :notice => "Invite or follow your Google contacts." 


     end 

    end 

Zrzut ekranu ustawień.

enter image description here

Powiązane problemy