2011-09-21 40 views
5

Estoy utilizando Omniauth para solicitar las credenciales de gmail del usuario, por lo que puedo solicitarle al usuario amigos/contactos más tarde.Cómo obtener un token de acceso en ruby ​​on rails para contactos de gmail

Ahora mismo estoy obteniendo la lista de amigos dentro del controlador OmniauthCallbacks, usando el token de acceso que la solicitud de autenticación genera para mí. Algo como esto

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 

¿Cómo puedo utilizar las credenciales que he almacenados en la base de datos para crear un nuevo token de acceso, por lo que se puede llamar a la API de Google desde un controlador diferente?

+0

De Tester: ¿Encontró una respuesta no detestable? :) Haznos saber. –

+0

@DavidJames verifique mi respuesta. Acabo de escribir hoy y estoy trabajando perfectamente en mi parte final. –

+0

posible duplicado de [¿Cuál es el mejor complemento para buscar Gmail, Yahoo, Hotmail, Twitter y lista de contactos de Facebook en Ruby on Rails] (http://stackoverflow.com/questions/6311132/qué-el-mejor-complemento-a-buscar-gmail-yahoo-hotmail-twitter-y-facebook-conta) –

Respuesta

0

Una idea: investigue si el params[:oauth_verifier] que se envió desde gmail funcionará en solicitudes posteriores. Pero tal vez solo sea bueno para esa solicitud.

1

Obtenga su client_id y client_secret de here. Esta es una secuencia de comandos aproximada, que funciona perfectamente bien. Modificado según sus necesidades.

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 

Captura de pantalla para la configuración.

enter image description here

Cuestiones relacionadas