2011-02-22 15 views
5

Estoy tratando de implementar una función de inicio de sesión con Facebook en mi sitio, y golpear una barricada tratando de obtener el token de acceso de Facebook. Aquí está mi código:Rails EOF Error al usar HTTP.get_response para recuperar el token de acceso de Facebook

if params[:error_reason] == "user_denied" then 
    flash[:error] = "To login with Facebook, you must click 'Allow' to let the site access your information" 
    redirect_to :login 
elsif params[:code] then 
    token_uri = URI.parse("https://graph.facebook.com/oauth/access_token?client_id=****************&redirect_uri=http://localhost:3000/auth/fblogin&client_secret=***************&code="+URI.escape(params[:code])) 
    response = Net::HTTP.get_response(token_uri) 
    session[:response] = response 
    data = ActiveSupport::JSON.decode(response) 
    access_token = data[:access_token] 
    flash[:error] = access_token 
    redirect_to :register 
end 

Esto está dentro de una función fblogin controlador que es el objetivo de la redirección inicial para obtener un código de autorización (el params[:code]).

Pero cuando corro a través de este, me sale el siguiente error:

EOFError in AuthController#fblogin

en la línea Net::HTTP.get_response(token_uri). Lo busqué por todas partes, y no puedo encontrar nada que indique lo que esto significa. ¿Podrían ser los caracteres oscuros que Facebook usa en sus tokens de acceso? ¡Estoy totalmente perdido!

+0

¿Es este Ruby 1.9? Si es así, debe configurar manualmente un archivo CRT que contenga certificados de CA de confianza, consulte http://martinottenwaelter.fr/2010/12/ruby19-and-the-ssl-error/ –

Respuesta

10

Está recibiendo un EOFError porque está intentando conectarse a un URL https usando un código que solo funciona con http. Consulte la sección titulada "Solicitud de SSL/HTTPS" en this Net::HTTP Cheat Sheet para obtener información básica.

Sin embargo, yo recomendaría el uso de una biblioteca de terceros para manejar esto para usted, como OAuth2 para utilizar la API de OAuth2 de Facebook, donde se iba a escribir código como este:

def client 
    OAuth2::Client.new('app_id', 'app_secret', :site => 'https://graph.facebook.com') 
end 

# in your callback code: 
access_token = client.web_server.get_access_token(params[:code], :redirect_uri => 'http://localhost:3000/auth/fblogin') 
user = JSON.parse(access_token.get('/me')) 

Si realmente quiere Para realizar las solicitudes usted mismo, puede consultar las bibliotecas como Faraday para ejecutar las solicitudes HTTPS por usted.

+0

¡Gracias, respuesta perfecta! Intenté escribir las solicitudes yo mismo para comprender mejor el flujo de autenticación (esto es solo un proyecto de aprendizaje). ¡Pero le daré una mirada más cercana a OAuth2! –

Cuestiones relacionadas