使用Omniauth-facebook客户端流程解析cookie

时间:2011-12-31 21:42:00

标签: ruby-on-rails facebook facebook-javascript-sdk omniauth

我有一个遗留应用程序,我一直致力于转换为Omniauth,因为该应用程序目前连接到Twitter和Facebook等多个第三方平台。在客户端集成Omniauth for Facebook比从头开始构建它要花费更多的时间。想要最后一步,希望能得到社区的见解。

我在/示例Sinatra应用程序中的omniauth-facebook中的示例用于客户端流程,但我在日志中不断收到以下错误:

Started GET "/auth/facebook/callback" for 127.0.0.1 at Sat Dec 31 07:52:01 -0500 2011 
Started GET "/auth/failure?message=invalid_credentials" for 127.0.0.1 at Sat Dec31 07:52:04 -0500 2011

Processing by FacebookUsersController#failure as    Parameters {"message"=>"invalid_credentials"}

我能够在另一个分支中使用服务器端流程来实现此功能,但客户端流程出现问题。这是相关文件。发生了什么事?

配置/初始化/ omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, 'xxx', 'xxx', :scope => 'email', :display => 'popup'
end

配置/ routes.rb中

  match '/auth/:provider/callback' => 'facebook_users#login_or_register_fb_user'
  match '/auth/failure' => 'facebook_users#failure'

应用/视图/布局/ application.haml 这实际上是通过部分包含在布局中的,这是在页面上加载的最后一件事。

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId      : 'xxx', // App ID
      status     : true, // check login status
      cookie     : true, // enable cookies to allow the server to access the session
      xfbml      : true  // parse XFBML
    });

    // Additional initialization code here
  };

  // Load the SDK Asynchronously
  (function(d){
     var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "//connect.facebook.net/en_US/all.js";
     d.getElementsByTagName('head')[0].appendChild(js);
   }(document));

   $(function() {
     $('.facebook_button').click(function(e) {
       e.preventDefault();

       FB.login(function(response) {
         if (response.authResponse) { 
           $.get('/auth/facebook/callback');
         }
       }, { scope: 'email'});


     });
   });
</script>

应用/控制器/ facebook_users_controller.rb

class FacebookUsersController < ApplicationController

  def login_or_register_fb_user
    respond_to do |f|
        f.js {
          MultiJson.encode(request.env)
        }
    end
  end 
  def failure
    respond_to do |f|
         f.js {
           MultiJson.encode(request.env)
         }
    end
  end
end

当我尝试登录facebook用户时,我在日志中看到“/ auth / failure?message = invalid_credentials”的任何想法?在我的应用程序控制器中是否还有我需要的东西 - 一个解析Facebook cookie之前的过滤器?我在这里不知所措。我很确定我的设置是正确的。

此应用的Facebook设置:

谢谢你的帮助。

0 个答案:

没有答案