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

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

链接微博时出现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

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

端口?

#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

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