Facebook和RoR:如何重定向到授权URL?

时间:2011-05-29 19:42:18

标签: facebook authorization koala

我正在尝试将用户重定向到请求访问用户信息权限的URL。

我有一个表单的视图,其操作如下:

class AuthController < ApplicationController

   def auth
     @oauth = Koala::Facebook::OAuth.new("*id*", "*secret*", 'http://localhost:3000/auth/auth2') 
     address = @oauth.url_for_oauth_code(:permissions => "publish_stream")
     puts "address  #{address}"
     redirect_to address
     return  
   end

   def auth2

   end

end

stdout上,地址显示为:Redirected to https://graph.facebook.com/oauth/authorize?client_id=*id*&redirect_uri=http://localhost:3000/auth/auth2&scope=publish_stream

如果我在浏览器中独立输入此URL(而不是通过我的应用程序),我将进入应用程序请求权限的正确页面。但是,通过我的申请,我被带到一个显示Facebook徽标的页面,而不是请求权限的页面。

我希望看到权限页面,然后一旦用户允许,请求转发到我的redirect_uri。

3 个答案:

答案 0 :(得分:0)

您是使用fbml进行重定向还是尝试使用服务器端?如果您的应用程序是画布页面并且您正在重定向服务器端,则您只是重定向Facebook,而不是用户。你需要确保你实际上告诉facebook进行重定向。

如果是这种情况,请查看fb:redirect

答案 1 :(得分:0)

我只是想回答我的问题。解决方案实际上非常简单。而不是在我的控制器中重定向到授权uri,我需要在我的视图中执行如下操作。这避免了中间登录页面,似乎是其他人正在做的事情已经遇到这个特定问题(提供中间Facebook页面而不是将用户直接传递到授权页面。)

<script language=JavaScript>
top.location.href="https://graph.facebook.com/oauth/authorize?client_id=client_id&redirect_uri=http://localhost:3000/xxx&scope=publish_stream";
</script>

我不能说我明白为什么这很重要而我无法在控制器中重定向。因此,如果有人使用RoR可以解释原因,请告诉我。

答案 2 :(得分:0)

我最近遇到了类似的问题。为了将您的应用程序从iframe中分离出来并从服务器端重定向重定向到授权页面,您可以这样做:

def facebook_authorization
  redirect_url =<<-EOS
    <script>
      top.location.href='https://graph.facebook.com/oauth/authorize?client_id=client_id&redirect_uri=http://localhost:3000/xxx&scope=publish_stream';
    </script>
   EOS       

   render :inline => redirect_url
end

这与使用php的facebook文档中描述的方式非常相似。

此外,如果用户授权您的应用,您将在signed_request响应参数中获得oauth_access令牌。我不使用考拉,所以不确定他们如何解析签名的请求。

通过测试,我发现只要用户授权您的应用程序,您就会在每次请求时从facebook获取oauth_access令牌。这样可以轻松检测用户是否已授权应用程序,并且您每次访问应用程序时都不会向用户发送身份验证页面。