2011-02-22 73 views
5

我试图在我的网站上实现使用Facebook功能的登录功能,并尝试从Facebook获取访问令牌。这里是我的代码:使用HTTP.get_response检索Facebook访问令牌时的Rails EOF错误

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 

这是一个fblogin控制器功能即是初始重定向的目标得到一个授权码(在params[:code])内。

但是当我通过这次跑,我得到以下错误:

EOFError in AuthController#fblogin

Net::HTTP.get_response(token_uri)线。我搜遍了各地,找不到任何东西来表明这意味着什么。它可能是Facebook在他们的访问令牌中使用的模糊字符吗?我完全失去了!

+0

这是Ruby 1.9吗?如果是这样,您必须手动配置包含可信CA证书的CRT文件,请参阅http://martinottenwaelter.fr/2010/12/ruby19-and-the-ssl-error/ – 2011-02-22 19:49:13

回答

10

您正在收到EOFError,因为您正尝试使用仅适用于http的代码连接到https网址。基础知识请参见this Net::HTTP Cheat Sheet标题为“SSL/HTTPS请求”的部分。

不过,我会建议使用第三方库来管理这个给你,如OAuth2为利用Facebook的OAuth2用户API,在那里你会像这样写代码:

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')) 

如果你真的想要自己提出请求,您可以查看像Faraday这样的库来为您执行HTTPS请求。

+0

谢谢,完美答案!我试图自己编写请求以更好地理解认证流程(这只是一个学习项目)。但我会给OAuth2一个更接近的看看! – 2011-02-23 05:04:44