链接微博时出现redirect_uri_mismatch
的错误,根据新浪的文档意思是: 代码里的回调地址 跟 应用设置里的回调地址 不同:
* 我代码中的 match '/auth/weibo/callback', to: 'sessions#create'
* 应用设置中的 http://127.0.0.1/auth/weibo/callback
不一样吗?
补充:
#Gemfile
gem 'omniauth'
gem 'omniauth-weibo-oauth2'
#routes
match '/auth/weibo/callback', to: 'sessions#create'
#omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
provider :weibo, ENV['*****'], ENV['*****'], scope: 'user'
end
莫非你 url 写的是localhost
?
url 应该跟应用设置需要一样的才行,也就是说,
你的应用设置申请写的是http://127.0.0.1
,本地请求的 url 也要是127.0.0.1
才行
https://api.weibo.com/oauth2/authorize?response_type=code&client_id&redirect_uri=http%3A%2F%2F127.0.0.1%2Fauth%2Fweibo%2Fcallback&state=bc7083109e2ce1187bc8e1c155f699b6574af5927cbd7de7
client_id 是空的,这个是什么问题,开发者帐号的问题还是代码的问题?麻烦了~~
#20 楼 @mayday 你的 client_id 没有带到 url 里去 贴个我自己实现的版本吧 没用任何 gem
def weibo
config = OAUTH_CONFIG['weibo']
session[:oauth_state] = SecureRandom.hex(16)
options = {
client_id: config['key'],
redirect_uri: "#{HOSTS["dynamic"]}/users/callback",
state: session[:oauth_state],
}
authorize_url = "#{config['authorize_path']}?#{options.map{|k, v|"#{CGI::escape(k.to_s)}=#{CGI::escape(v.to_s)}"}.join('&')}"
redirect_to authorize_url if authorize_url
end
def callback
not_authorized if params[:state].blank? || params[:state] != session[:oauth_state]
config = OAUTH_CONFIG['weibo']
resp = Timeout::timeout(30){HTTParty.post("#{config['access_token_path']}", body: { grant_type: "authorization_code", client_id: config['key'], client_secret: config['secret'], redirect_uri: "#{HOSTS["dynamic"]}/users/callback", code: params[:code] })}
if resp.response && resp.response.msg && resp.response.msg == "OK"
resp_info = JSON.parse resp.body
resp_get_info = Timeout::timeout(30){HTTParty.get("https://api.weibo.com/2/users/show.json?access_token=#{resp_info['access_token']}&uid=#{resp_info['uid']}")}
if resp_get_info.response && resp_get_info.response.msg && resp_get_info.response.msg == "OK"
user_info = JSON.parse resp_get_info.body
//你自己的save user代码
end
end
redirect_to root_path
end
端口不一定必须为 80,3000 就行,提交审核后去掉端口就行。
我一般开发时设一个 host 将域名指向到 localhost
如
127.0.0.1 www.wakmj.com
然后传给新浪 API 的 redirect_uri 参数为
http://www.wakmj.com:3000/auth/weibo/callback
昨天看了下 weibo_2 gem 包,扩展了下它的 example,可以很方便的在 console 中探究 sina weibo api 啦,可参考这里 https://github.com/cao7113/uweibo