新手问题 再次请教 QQ 和 weibo 的 Omniauth

cqcn1991 · 2013年03月25日 · 最后由 cqcn1991 回复于 2013年03月26日 · 7057 次阅读

总共弄了 twitter,qq,weibo,三个三方认证 用的代码都是一样的

def self.from_omniauth(auth)
  where(auth.slice(:provider, :uid)).first_or_create do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.name = auth.info.nickname
    user.image = auth.info.image
  end
end
def all
  user = User.from_omniauth(request.env["omniauth.auth"])
  if user.persisted?
    flash.notice = "Signed in!"
    sign_in_and_redirect user
  else
    session["devise.user_attributes"] = user.attributes
    redirect_to new_user_registration_url
  end
end
alias_method :weibo, :all
alias_method :twitter, :all
alias_method :qq_connect, :all

devise 的 initializer 里面也设置好了

config.omniauth :twitter, CONFIG[:twitter_consumer_key], CONFIG[:twitter_consumer_secret]
config.omniauth :weibo, CONFIG[:weibo_key], CONFIG[:weibo_secret]
config.omniauth :qq_connect, CONFIG[:qq_key], CONFIG[:qq_secret]

但是始终只有 twitter 能用,验证完以后自己填 email(因为本身 User Model 里面需要 email) weibo 的话,是提示 something went wrong。 QQ 则是授权完毕以后,转到了 sign_up 页面提示提示 Invalid credentials 主要的 code 都是按照 railscasts 上面写的 真的也不知道怎么 debug 了…… 因为我觉得用的代码都是一样的诶……(唯一就是 twitter 站点里面填的 callbacks URL 是 127.0.0.1 这个,QQ 和微博都是填的本身的 heroku 的网站,但是这个应该是没有影响的)。然后就是 weibo 和 QQ 都是在审核阶段,用的测试账号,还不能公开使用第三方登陆

weibo 的 heroku logs

2013-03-25T12:21:55+00:00 app[web.1]: (weibo) Request phase initiated.
2013-03-25T12:21:55+00:00 heroku[router]: at=info method=GET path=/users/auth/we
ibo host=issuethoughts.herokuapp.com fwd="175.8.21.241" dyno=web.1 queue=0 wait=
0ms connect=1ms service=10ms status=302 bytes=239
2013-03-25T12:21:56+00:00 app[web.1]: Started GET "/users/auth/weibo/callback?st
ate=aa27eee9443e8e5ccc96d024660939970b5ccc7a0d0c30df&code=083a9b5dd0035245c5b147
a3e5662af2" for 175.8.21.241 at 2013-03-25 12:21:56 +0000
2013-03-25T12:21:56+00:00 app[web.1]: (weibo) Callback phase initiated.
2013-03-25T12:21:58+00:00 app[web.1]: : SELECT  "users".* FROM "users"  WHERE "u
sers"."provider" = 'weibo' AND "users"."uid" = 1695469591 LIMIT 1):
2013-03-25T12:21:58+00:00 app[web.1]:   app/controllers/omniauth_callbacks_contr
oller.rb:13:in `all'
2013-03-25T12:21:58+00:00 app[web.1]:
2013-03-25T12:21:58+00:00 app[web.1]: ActiveRecord::StatementInvalid (PG::Error:
 ERROR:  operator does not exist: character varying = integer
2013-03-25T12:21:58+00:00 app[web.1]: LINE 1: ...RE "users"."provider" = 'weibo'
 AND "users"."uid" = 16954695...
2013-03-25T12:21:58+00:00 app[web.1]:
                   ^
2013-03-25T12:21:58+00:00 app[web.1]: HINT:  No operator matches the given name
and argument type(s). You might need to add explicit type casts.
2013-03-25T12:21:58+00:00 app[web.1]:   app/models/user.rb:23:in `from_omniauth'

2013-03-25T12:21:58+00:00 app[web.1]:   Parameters: {"state"=>"aa27eee9443e8e5cc
c96d024660939970b5ccc7a0d0c30df", "code"=>"083a9b5dd0035245c5b147a3e5662af2"}
2013-03-25T12:21:58+00:00 app[web.1]:
2013-03-25T12:21:58+00:00 app[web.1]:
2013-03-25T12:21:58+00:00 app[web.1]: Processing by OmniauthCallbacksController#
weibo as HTML
2013-03-25T12:21:58+00:00 app[web.1]: Completed 500 Internal Server Error in 5ms

QQ 的 heroku logs

heroku logs
2013-03-25T11:57:32+00:00 app[web.1]: (qq_connect) Callback phase initiated.
2013-03-25T11:57:34+00:00 app[web.1]: (qq_connect) Authentication failure! inval
id_credentials: OAuth2::Error, :
2013-03-25T11:57:34+00:00 app[web.1]: Processing by OmniauthCallbacksController#
failure as HTML
2013-03-25T11:57:34+00:00 app[web.1]: Completed 302 Found in 1ms (ActiveRecord:
0.0ms)
2013-03-25T11:57:34+00:00 app[web.1]:   Parameters: {"code"=>"2BE57603894A6F97FC
28023BD975EF03", "state"=>"75453ef674f41b99f6ba9e84e9557733c80acca3b36951b2"}
2013-03-25T11:57:34+00:00 app[web.1]:
2013-03-25T11:57:34+00:00 app[web.1]: callback( {"error":100002,"error_descripti
on":"param client_secret is wrong or lost "} );
2013-03-25T11:57:34+00:00 app[web.1]: Redirected to http://issuethoughts.herokua
pp.com/users/sign_in
2013-03-25T11:57:34+00:00 heroku[router]: at=info method=GET path=/users/auth/qq
_connect/callback?code=2BE57603894A6F97FC28023BD975EF03&state=75453ef674f41b99f6
ba9e84e9557733c80acca3b36951b2 host=issuethoughts.herokuapp.com fwd="175.8.21.24
1" dyno=web.1 queue=0 wait=0ms connect=2ms service=1500ms status=302 bytes=114
2013-03-25T11:57:34+00:00 app[web.1]: Started GET "/users/sign_in" for 175.8.21.
241 at 2013-03-25 11:57:34 +0000
2013-03-25T11:57:34+00:00 app[web.1]: Processing by Devise::SessionsController#n
ew as HTML
2013-03-25T11:57:34+00:00 app[web.1]:   Rendered devise/shared/_links.erb (1.2ms
)
2013-03-25T11:57:34+00:00 app[web.1]:   Rendered layouts/_header.html.erb (1.1ms
)
2013-03-25T11:57:34+00:00 app[web.1]:   Rendered devise/sessions/new.html.erb wi

QQ 的那个报说client_secret不对或者丢失了 是不是传错了参数啊

微博那个 查查user.uid的类型对不对 是否为int 不过我记得微博的uid会超出int范围 可以改用bigint

#1 楼 @leozwa 汗……我还以为 uid 我设的是 integer,真的是乌龙了……那就改成 bigint 就行了是吧?

对的 uid那一栏改成bigint int 是 hold 不住的... 我还记得微博内容string也 hold 不住 要用text...

#3 楼 @leozwa 我是这样改的,但是一直报 An error has occurred, this and all later migrations canceled: SQLite3::SQLException: near "ALTER": syntax error: ALTER TABLE users ALTE R COLUMN uid TYPE bigint USING uid::bigint

但是 stackoverflow 上就是这样写的额…… http://stackoverflow.com/questions/10380399/how-do-i-change-a-string-column-into-a-bigint

class ChangeUidFormatInUsers < ActiveRecord::Migration
  def up
    execute <<-SQL
      ALTER TABLE users  ALTER COLUMN uid TYPE bigint USING uid::bigint
    SQL
  end

  def down
    change_column :users, :uid, :string
  end
end

#4 楼 @cqcn1991 sqlite 好像所有的数字类型(int, tinyint, bigint...)最后都会变成 integer

我推荐你本地也使用 PG 做数据库 你换 PG 的话change_column :users, :uid, :bigint应该是没问题的

#5 楼 @leozwa 没有,本地的 sqlite 之前,我写的 change column 换成 biginit 成功了。 但是用到 Postgre 的时候,提示报错,因为网站本身有数据,这个也是那个 stackoverflow 里面写了的。所以我才把写法换成那个 stackoverflow 里面的那种写法

到底是怎么回事……

#6 楼 @cqcn1991 哦 是你本来的 uid 都是 string PG 不知道怎么转换了 我之前是从 int 转 bigint 所以没问题

#7 楼 @leozwa 太谢谢你了,微博的 omniauth 终于搞定,就是数据类型的问题 可是 QQ 是怎么一回事啊……

#7 楼 @leozwa logs 里面提示的是 client_secret is wrong or lost 难道是那个 key 和 secret 填错了?可是我查了没填错啊 Notice 里面提示的是 Invalid credentials,这个到底是什么意思呢……? 好像 QQ 确实有这个东西 :credentials => { :token => '2.00JjgzmBd7F...', # OAuth access_token, which you may wish to store :secret => 'ac737720847e...', https://github.com/beenhero/omniauth-qq 这个我确实没存,不知道你了解么?

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