2011-09-21 11 views
5

Sto utilizzando Omniauth per richiedere le credenziali dell'utente gmail, quindi posso richiedere l'utente amici/contatti in seguito.Come ottenere creare un token di accesso in ruby ​​su rotaie per contatti gmail

In questo momento sto ricevendo l'elenco degli amici all'interno del controller OmniauthCallbacks, utilizzando il token di accesso che la richiesta di autenticazione genera per me. Qualcosa di simile

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 

Come posso utilizzare le credenziali che ho memorizzati nel database per creare un nuovo token di accesso, così posso chiamare API di Google da un controller diverso?

+0

De Tester: Hai trovato una risposta non detestabile? :) Facci sapere. –

+0

@DavidJames controlla la mia risposta. Ho appena scritto oggi e lavorando perfettamente alla mia fine .. –

+0

possibile duplicato di [Qual'è il miglior plugin per recuperare Gmail, Yahoo, Hotmail, Twitter e Facebook in Ruby on Rails] (http://stackoverflow.com/questions/6311132/cosa-the-best-plugin-to-fetch-gmail-yahoo-hotmail-twitter-e-facebook-conta) –

risposta

0

Un'idea: verificare se lo params[:oauth_verifier] inviato da Gmail funzionerà nelle richieste successive. Ma forse è solo buono per quella richiesta.

1

Ottieni client_id e client_secret da here. Questo è uno script approssimativo, che funziona perfettamente bene. Modificato secondo le tue esigenze.

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 

Screenshot per impostazioni.

enter image description here