Question

I’ve been trying to let a user tweet from my rails app with the omniauth-twitter gem and the twitter-gem and the following code below but every time I go to send the tweet, I’m getting the following error.

“Twitter::Error::Forbidden - Your credentials do not allow access to this resource:”

I have the following code for Twitter set up.

user.rb

def tweet(tweet)
  client = Twitter::REST::Client.new do |config|
    config.consumer_key        = ENV["TWITTER_CONSUMER_KEY"]
    config.consumer_secret     = ENV["TWITTER_CONSUMER_SECRET"]
    config.access_token        = ENV["TWITTER_ACCESS_TOKEN"]
    config.access_token_secret = ENV["TWITTER_ACCESS_SECRET"]
  end

  client.update(tweet)
end

routes.rb

resources :tweets, only: [:new, :create]

I didn’t change anything in my sessions controller that was created with devise.

class Devise::SessionsController < DeviseController
  prepend_before_filter :require_no_authentication, :only => [ :new, :create ]
  prepend_before_filter :allow_params_authentication!, :only => :create
  prepend_before_filter { request.env["devise.skip_timeout"] = true }

# GET /resource/sign_in
def new
 self.resource = resource_class.new(sign_in_params)
 clean_up_passwords(resource)
 respond_with(resource, serialize_options(resource))
 respond_to do |format|
  format.js
end   
end

# POST /resource/sign_in
def create
 self.resource = warden.authenticate!(auth_options)
 set_flash_message(:notice, :signed_in) if is_navigational_format?
 sign_in(resource_name, resource)
 respond_with resource, :location => after_sign_in_path_for(resource)
end

# DELETE /resource/sign_out
 def destroy
  redirect_path = after_sign_out_path_for(resource_name)
  signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
  set_flash_message :notice, :signed_out if signed_out && is_navigational_format?

 # We actually need to hardcode this as Rails default responder doesn't
 # support returning empty response on GET request
 respond_to do |format|
  format.all { head :no_content }
  format.any(*navigational_formats) { redirect_to redirect_path }
end
end

protected

def sign_in_params
 devise_parameter_sanitizer.sanitize(:sign_in)
end

def serialize_options(resource)
methods = resource_class.authentication_keys.dup
methods = methods.keys if methods.is_a?(Hash)
methods << :password if resource.respond_to?(:password)
{ :methods => methods, :only => [:password] }
end

def auth_options
  { :scope => resource_name, :recall => "#{controller_path}#new" }
end
end

tweets_controller.rb

class TweetsController < ApplicationController

  def new
  end

  def create
   current_user.tweet(twitter_params[:message])
   redirect_to root_path
  end

  def twitter_params
   params.require(:tweet).permit(:message)
  end

  end

And in my view, I've set up a form for a user to fill out and a button to send the tweet.

 <p>
  <%= form_for :tweet, url: tweets_path, method: :post do |f| %>
    <%= f.text_field :message %>
    <%= f.submit "Send Tweet" %>
  <% end %>
 </p>

UPDATE: Here is my server log

    "Started POST "/tweets" for 127.0.0.1 at 2014-04-29 11:26:48 -0500
    Processing by TweetsController#create as HTML
    Parameters: {"utf8"=>"✓",      "authenticity_token"=>"wRGfnEqErGE3enZ2m5/cjBK5N8Ai+z/TprqI5jmsbJY=", "tweet"=>  {"message"=>"Testing Tweet!"}, "commit"=>"Send Tweet"}
    User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY   "users"."id" ASC LIMIT 1
    Completed 500 Internal Server Error in 793ms

Twitter::Error::Forbidden - Your credentials do not allow access to this resource:
  twitter (5.1.1) lib/twitter/rest/response/raise_error.rb:22:in `on_complete'
  faraday (0.8.8) lib/faraday/response.rb:9:in `block in call'
  faraday (0.8.8) lib/faraday/response.rb:63:in `on_complete'
  faraday (0.8.8) lib/faraday/response.rb:8:in `call'
  faraday (0.8.8) lib/faraday/request/url_encoded.rb:14:in `call'
  faraday (0.8.8) lib/faraday/request/multipart.rb:13:in `call'
  twitter (5.1.1) lib/twitter/rest/request/multipart_with_file.rb:15:in `call'
  faraday (0.8.8) lib/faraday/connection.rb:253:in `run_request'
  faraday (0.8.8) lib/faraday/connection.rb:118:in `post'
  twitter (5.1.1) lib/twitter/rest/client.rb:131:in `request'
  twitter (5.1.1) lib/twitter/rest/client.rb:103:in `post'
  twitter (5.1.1) lib/twitter/rest/api/utils.rb:123:in `object_from_response'
  twitter (5.1.1) lib/twitter/rest/api/tweets.rb:125:in `update'
  app/models/user.rb:93:in `tweet'
  app/controllers/tweets_controller.rb:7:in `create'
  actionpack (4.0.2) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
  actionpack (4.0.2) lib/abstract_controller/base.rb:189:in `process_action'
  actionpack (4.0.2) lib/action_controller/metal/rendering.rb:10:in `process_action'
  actionpack (4.0.2) lib/abstract_controller/callbacks.rb:18:in `block in process_action'
  activesupport (4.0.2) lib/active_support/callbacks.rb:403:in `_run__4448031954415073372__process_action__callbacks'
  activesupport (4.0.2) lib/active_support/callbacks.rb:80:in `run_callbacks'
  actionpack (4.0.2) lib/abstract_controller/callbacks.rb:17:in `process_action'
  actionpack (4.0.2) lib/action_controller/metal/rescue.rb:29:in `process_action'
  actionpack (4.0.2) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
  activesupport (4.0.2) lib/active_support/notifications.rb:159:in `block in instrument'
  activesupport (4.0.2) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
  activesupport (4.0.2) lib/active_support/notifications.rb:159:in `instrument'
  actionpack (4.0.2) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
  actionpack (4.0.2) lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
  activerecord (4.0.2) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
  actionpack (4.0.2) lib/abstract_controller/base.rb:136:in `process'
  actionpack (4.0.2) lib/abstract_controller/rendering.rb:44:in `process'
  session_off (0.5.0) lib/session_off.rb:176:in `process_with_session_off'
  actionpack (4.0.2) lib/action_controller/metal.rb:195:in `dispatch'
  actionpack (4.0.2) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
  actionpack (4.0.2) lib/action_controller/metal.rb:231:in `block in action'
  actionpack (4.0.2) lib/action_dispatch/routing/route_set.rb:80:in `call'
  actionpack (4.0.2) lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
  actionpack (4.0.2) lib/action_dispatch/routing/route_set.rb:48:in `call'
  actionpack (4.0.2) lib/action_dispatch/journey/router.rb:71:in `block in call'
  actionpack (4.0.2) lib/action_dispatch/journey/router.rb:59:in `each'
  actionpack (4.0.2) lib/action_dispatch/journey/router.rb:59:in `call'
  actionpack (4.0.2) lib/action_dispatch/routing/route_set.rb:680:in `call'
  omniauth (1.1.4) lib/omniauth/strategy.rb:184:in `call!'
  omniauth (1.1.4) lib/omniauth/strategy.rb:164:in `call'
  omniauth (1.1.4) lib/omniauth/strategy.rb:184:in `call!'
  omniauth (1.1.4) lib/omniauth/strategy.rb:164:in `call'
  rack-livereload (0.3.15) lib/rack/livereload.rb:23:in `_call'
  rack-livereload (0.3.15) lib/rack/livereload.rb:14:in `call'
  warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
  warden (1.2.3) lib/warden/manager.rb:34:in `catch'
  warden (1.2.3) lib/warden/manager.rb:34:in `call'
  rack (1.5.2) lib/rack/etag.rb:23:in `call'
  rack (1.5.2) lib/rack/conditionalget.rb:35:in `call'
  rack (1.5.2) lib/rack/head.rb:11:in `call'
  actionpack (4.0.2) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
  actionpack (4.0.2) lib/action_dispatch/middleware/flash.rb:241:in `call'
  rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
  rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
  actionpack (4.0.2) lib/action_dispatch/middleware/cookies.rb:486:in `call'
  activerecord (4.0.2) lib/active_record/query_cache.rb:36:in `call'
  activerecord (4.0.2) lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call'
  activerecord (4.0.2) lib/active_record/migration.rb:369:in `call'
  actionpack (4.0.2) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.0.2) lib/active_support/callbacks.rb:373:in `_run__810443810394189641__call__callbacks'
  activesupport (4.0.2) lib/active_support/callbacks.rb:80:in `run_callbacks'
  actionpack (4.0.2) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (4.0.2) lib/action_dispatch/middleware/reloader.rb:64:in `call'
  actionpack (4.0.2) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
  better_errors (1.1.0) lib/better_errors/middleware.rb:84:in `protected_app_call'
  better_errors (1.1.0) lib/better_errors/middleware.rb:79:in `better_errors_call'
  better_errors (1.1.0) lib/better_errors/middleware.rb:56:in `call'
  airbrake (3.1.15) lib/airbrake/rails/middleware.rb:13:in `call'
  actionpack (4.0.2) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  actionpack (4.0.2) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.0.2) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.0.2) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.0.2) lib/active_support/tagged_logging.rb:67:in `block in tagged'
  activesupport (4.0.2) lib/active_support/tagged_logging.rb:25:in `tagged'
  activesupport (4.0.2) lib/active_support/tagged_logging.rb:67:in `tagged'
  railties (4.0.2) lib/rails/rack/logger.rb:20:in `call'
  quiet_assets (1.0.2) lib/quiet_assets.rb:18:in `call_with_quiet_assets'
  actionpack (4.0.2) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.2) lib/rack/runtime.rb:17:in `call'
  activesupport (4.0.2) lib/active_support/cache/strategy/local_cache.rb:83:in `call'
  rack (1.5.2) lib/rack/lock.rb:17:in `call'
  actionpack (4.0.2) lib/action_dispatch/middleware/static.rb:64:in `call'
  rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
  airbrake (3.1.15) lib/airbrake/user_informer.rb:16:in `_call'
  airbrake (3.1.15) lib/airbrake/user_informer.rb:12:in `call'
  railties (4.0.2) lib/rails/engine.rb:511:in `call'
  railties (4.0.2) lib/rails/application.rb:97:in `call'
  rack (1.5.2) lib/rack/lock.rb:17:in `call'
  rack (1.5.2) lib/rack/content_length.rb:14:in `call'
  rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service'
  /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
  /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
  /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'



Started POST "/__better_errors/70276081720140/variables" for 127.0.0.1 at 2014-04-29 11:26:49 -0500"
Was it helpful?

Solution

I think you miss the config for:

config.consumer_key        = ENV["TWITTER_CONSUMER_KEY"]
config.consumer_secret     = ENV["TWITTER_CONSUMER_SECRET"]
config.access_token        = ENV["TWITTER_ACCESS_TOKEN"]
config.access_token_secret = ENV["TWITTER_ACCESS_SECRET"]

If the enviroment variables are unset youll get the 'unauthorized' error.

Just for testing purpose, try to actually input your data instead of the ENV vars... It it works, it means that you have delivered the yml file wrongly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top