Rails [已解决,谢谢大家] 新浪认证的问题

mayday · 2013年04月14日 · 最后由 cao7113 回复于 2013年12月06日 · 16 次阅读

链接微博时出现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
共收到 26 条回复

话说这个端口对于回调地址有没有影响?

端口?

#2楼 @Rei 恩,我本地访问是3000端口,但是新浪应用设置里面不能写端口,是不是我本地的访问端口必须为80?

那试试80端口。新浪的api有时就那么神经。

应该是端口问题 必须为80

#5楼 @zj0713001 rails s -p 80, but 80端口没有权限~~google ing!

如果使用 rvm

rvmsudo rails s -p 80

如果不用 rvm

sudo rails s -p 80

我都是一样的……也没啥问题啊……

#7楼 @Rei @zj0713001 还是redirect_uri_mismatch 。。。

#8楼 @cqcn1991 你在本地是3000端口没问题?我表示现在改到80端口问题依旧~~

哦 , 错误变成error:invalid_request了,我先看看,谢谢了

莫非你url写的是localhost?

url应该跟应用设置需要一样的才行,也就是说, 你的应用设置申请写的是http://127.0.0.1,本地请求的url也要是127.0.0.1才行

#7楼 @Rei 看了下url

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是空的,这个是什么问题,开发者帐号的问题还是代码的问题?麻烦了~~

#13楼 @mayday 用的什么 gem?可能没配置好。

#12楼 @ywjno 恩,是127.0.0.1,是client_id的问题,如上,不知道怎么解决

#14楼 @Rei 我在帖子里把配置文件什么的都补充了,帮忙看一下,那个星号是我故意覆盖的

学校晚上断电,电脑没电了,明天再继续研究,麻烦诸位了,尤其是@Rei ,早点休息。

#17楼 @mayday

provider :weibo, ENV['WEIBO_KEY'], ENV['WEIBO_SECRET']

这两个 ENV 要替换实际的值。

#18楼 @Rei 恩,我有替换的, provider :weibo, ENV['4129056994'], ENV['9e48c47e505cd8efa47ce743c525db9d']

#18楼 @Rei 明天跟微博的开发小助手联系一下,看是不是帐号的问题。

#19楼 @mayday

provider :weibo, '4129056994', '9e48c47e505cd8efa47ce743c525db9d'

#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

#10楼 @mayday 我没在本地调试……直接线上走的……运行成功就没管了 话说我还不知道怎么本地测试Omniauth

#21楼 @Rei 嗯嗯 , 是这个问题,灰常感谢。

昨天看了下weibo_2 gem包,扩展了下它的example,可以很方便的在console中探究sina weibo api啦,可参考这里 https://github.com/cao7113/uweibo

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册