试图通过他的 Railscast 实现 Ryan 的 JS 实现 Facebook 登录:http ://railscasts.com/episodes/360-facebook-authentication
服务器端身份验证工作得很好——那里没有问题——但是通过 JS 弹出窗口尝试它总是给我这个错误:
另外,我的服务器输出记录:
(facebook) Callback phase initiated.
(facebook) Authentication failure! invalid_credentials: OmniAuth::Strategies::OAuth2::CallbackError, OmniAuth::Strategies::OAuth2::CallbackError
我的直觉告诉我原因是没有数据被传递到回调 URL(来自 ASCIIcast 底部的 Ryan 的 JS 代码):
window.location = '/auth/facebook/callback' if response.authResponse
但我对 Omniauth 的工作原理知之甚少,无法确定。谁能帮我这个?如果您需要我发布特定文件,请告诉我,尽管一切都应该逐字记录 Ryan 在他的截屏视频中已经提到的内容。
更新:所以我刚刚找到这篇文章,看起来 JS 调用正确,所以我很难过。:(
另一个更新:我似乎可以使用浏览器控制台很好地操纵我的状态。呼叫FB.login()
会提示我一个窗口,我可以填写该窗口,然后它会登录。运行
FB.getLoginStatus(function(resp) { console.log(resp.status); });
...确认我已使用有效凭据连接。所以现在我真的很困惑为什么这不起作用......
作为参考,这是我加载到页面上的 JS:
jQuery ->
$('body').prepend '<div id="fb-root"></div>'
$.ajax
url: "#{window.location.protocol}//connect.facebook.net/en_US/all.js"
dataType: 'script'
cache: true
window.fbAsyncInit = ->
FB.init(appId: '<%= ENV["FACEBOOK_APP_ID"] %>', cookie: true)
$('*[data-js="fb_login"]').click (e) ->
e.preventDefault()
FB.login (response) ->
window.location = '/auth/facebook/callback' if response.authResponse
$('*[data-js="logout"]').click ->
FB.getLoginStatus (response) ->
FB.logout() if response.authResponse
true
是的,我已经确认正在<%= ENV["FACEBOOK_APP_ID"] %>
返回我正确的 Facebook 应用 ID。