我有一个使用https://github.com/intridea/oauth2的rails项目。在我的rails应用程序中,我有以下代码:
ApplicationController.rb
def facebook_client
OAuth2::Client.new(FacebookOauthCredentials::APP_ID, FacebookOauthCredentials::APP_SECRET, :site => 'https://graph.facebook.com')
end
FacebookController.rb
def facebook_session_create(poster, featured_item)
redirect_to facebook_client.web_server.authorize_url(:scope => 'publish_stream', :redirect_uri => "http://localhost:3000/facebook/facebook_callback")
end
def facebook_callback
if(params[:code])
begin
access_token = facebook_client.web_server.get_access_token(params[:code], :redirect_uri => "http://localhost:3000/facebook/facebook_callback")
access_token.post('/me/feed', "testing #{rand(1000)}")
rescue OAuth2::HTTPError => e
render :text => e.response.body
end
end
end
每次运行此代码时,我都会收到此回复:
{"error":{"type":"OAuthException","message":"Error validating verification code."}}
但是,我使用OAuth2 gem自述文件中提供的sinatra应用程序,它运行正常。
def client
OAuth2::Client.new(FacebookOauthCredentials::APP_ID, FacebookOauthCredentials::APP_SECRET, :site => 'https://graph.facebook.com')
end
get '/auth/facebook' do
redirect client.web_server.authorize_url(
:redirect_uri => redirect_uri,
:scope => 'publish_stream'
)
end
get '/auth/facebook/callback' do
access_token = client.web_server.get_access_token(params[:code], :redirect_uri => redirect_uri)
begin
user = JSON.parse(access_token.post('/me/feed', :message => "testing # {rand(10000)}"))
rescue Exception => e
return e.response.body
end
user.inspect
end
def redirect_uri
uri = URI.parse(request.url)
uri.path = '/auth/facebook/callback'
uri.query = nil
uri.to_s
end
我尝试使用irb重现这些步骤,但我遇到了一个http 400错误。我不确定它是否与rails应用程序的原因相同,或者是因为我正在进行控制台和Web浏览器操作的混合。任何建议都将不胜感激。
答案 0 :(得分:2)
我在此页Facebook graph API - OAuth Token
找到了问题的答案我遇到了完全相同的问题但是 事实证明问题不是 redirect_uri的编码 参数,或者我有一个尾随 这是简单的斜线或问号 我通过了两个不同的 重定向网址(还没读过 当时的规范)。
redirect_uri仅用作a 重定向一次(第一次)到 重定向回依赖方 使用“代码”令牌。第二次, redirect_uri传回给 auth服务器,但这次不是 按预期使用(重定向) 而是由身份验证使用 服务器验证代码。服务器 用access_token回复。
你会注意到facebook的文档 (这很糟糕)说取 “将它换成一个访问令牌 取...... “
总之,我没有编码或 对Uri做一些特别的事,只是 两次传递相同的redirect_uri, 并获取第二页以获取 access_token里面。
我没有正确复制我的原始代码,并且我传递的重定向uri得到的代码与我传递给获取访问令牌的uri不同。 Facebook的API文档非常糟糕:(
答案 1 :(得分:0)
我遇到了这个问题/错误,但最终找到了一个不同的解决方案(通过比较我正在运行的Dev应用程序设置)和我的prod应用程序设置(产生此错误)。
我在Facebook Developer应用中访问了我的应用的高级设置页面: https://developers.facebook.com/apps/YourAppID/advanced
然后我找到了“加密访问令牌:”设置并将其设置为“已启用”。