【问题标题】:Twitter::Error::Unauthorized in PostsController#create - Invalid or expired tokenTwitter::Error::Unauthorized in PostsController#create - 无效或过期的令牌
【发布时间】:2013-04-04 14:04:15
【问题描述】:

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

用户可以正常登录(因此他们已正确验证),但是当他们尝试创建帖子时,我收到此错误。我使用 Omniauth gem (v1.1.4) 进行身份验证,使用 Twitter gem (v4.6.2) 发布到 Twitter。如果重要的话,Omniauth-twitter gem 是 v0.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

【问题讨论】:

  • 我相信这是this的复制品
  • @Newbie 根据该线程,我在哪里使用“客户端”而不是“Twitter”?因为当前的代码是Twitter::Client.new.update(@post.content)

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


【解决方案1】:

你需要像“@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

【讨论】:

  • 如果我收到undefined method 'update' for nil:NilClass,我该如何使用您在上面发布的方法解决这个问题?
【解决方案2】:

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

  • 您可以简单地尝试删除“身份验证”表中的所有行,然后再次使用 twitter 帐户登录,看看它是否正常工作。
  • 或者尝试在用户代码通过 twitter 帐户验证后设置断点,然后在手动设置“token”和“secret”返回验证信息后执行推文发布行:["credentials"]["令牌"] 和 ["凭证"]["令牌"]。我认为这条推文会发布。

如果还是不行,最好也显示其他相关代码,比如会话控制器。您的身份验证流程的全貌将更有助于解决问题。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多