Twitter ::错误::在PostsController中未经授权#create - 令牌无效或过期

时间:2013-04-12 06:36:18

标签: ruby-on-rails ruby twitter omniauth twitter-oauth

为什么“创建”会给我一个无效/过期的令牌错误?

用户可以很好地登录(因此他们经过正确的身份验证)但是当他们尝试创建帖子时,我收到此错误。我正在使用Omniauth gem(v1.1.4)进行身份验证,使用Twitter gem(v4.6.2)发布到Twitter。如果重要的话,Omniauth-twitter的宝石是v.0.0.16。

这是导致错误的代码

class PostsController < ApplicationController
  def create
    Twitter::Client.new.update(@post.content)
  end
end

这是用户模型(user.rb)的一部分

def twitter
  unless @twitter_user
    provider = self.authentications.find_by_provider('twitter')
    @twitter_user = Twitter::Client.new(:oauth_token => provider.token, :oauth_token_secret => provider.secret) rescue nil
  end
  @twitter_user
end

这是我的omniauth初始化程序

Rails.application.config.middleware.use OmniAuth::Builder do
  configure do |config|
    config.path_prefix = '/auth'
  end

  provider :twitter, "xxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
end

Twitter.configure do |config|
  config.consumer_key = "xxxxxxxxxxxxxxxxxxxx"
  config.consumer_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  config.oauth_token = :token
  config.oauth_token_secret = :secret
end

我的架构:

create_table "authentications", :force => true do |t|
  t.integer  "user_id"
  t.string   "provider"
  t.string   "uid"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
  t.string   "secret"
  t.string   "token"
end

2 个答案:

答案 0 :(得分:0)

你需要像'@ twitter_user.update'这样的东西。对于您使用“Twitter :: Client.new”创建的每个Twitter用户,您必须提供omniauth的令牌和秘密(就像您在'user.rb'模型中一样)

class PostsController < ApplicationController
  def create
    # get twitter user. Feel free to change it depending on your app
    @twitter_user = User.twitter
    @twitter_user.update(@post.content)
  end
end

答案 1 :(得分:0)

我认为您使用的“身份验证”表格中的当前“令牌”和“机密”已过期。

  • 您只需尝试删除“身份验证”表格中的所有行,然后再次使用Twitter帐户登录,看看它是否正常运行。
  • 或者尝试在用户使用Twitter帐户进行身份验证后立即设置断点,然后在手动设置“令牌”和“秘密”并返回验证信息时执行推文发布行:[“凭据”] [“ token“]和[”credential“] [”token“]。我想推文会发布。

如果它仍然不起作用,您最好还显示其他相关代码,如会话控制器。您的身份验证流程的整体情况将更有助于解决问题。