add twitter oauth linking
This commit is contained in:
parent
b4f0f57df9
commit
c9b5ec10e3
|
@ -171,7 +171,7 @@ class SettingsController < ApplicationController
|
||||||
def github_callback
|
def github_callback
|
||||||
if !session[:github_state].present? || !params[:code].present? ||
|
if !session[:github_state].present? || !params[:code].present? ||
|
||||||
(params[:state].to_s != session[:github_state].to_s)
|
(params[:state].to_s != session[:github_state].to_s)
|
||||||
flash[:error] = "No OAuth state"
|
flash[:error] = "Invalid OAuth state"
|
||||||
return redirect_to "/settings"
|
return redirect_to "/settings"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -199,6 +199,45 @@ class SettingsController < ApplicationController
|
||||||
return redirect_to "/settings"
|
return redirect_to "/settings"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def twitter_auth
|
||||||
|
session[:twitter_state] = SecureRandom.hex
|
||||||
|
return redirect_to Twitter.oauth_auth_url(session[:twitter_state])
|
||||||
|
end
|
||||||
|
|
||||||
|
def twitter_callback
|
||||||
|
if !session[:twitter_state].present? ||
|
||||||
|
(params[:state].to_s != session[:twitter_state].to_s)
|
||||||
|
flash[:error] = "Invalid OAuth state"
|
||||||
|
return redirect_to "/settings"
|
||||||
|
end
|
||||||
|
|
||||||
|
session.delete(:twitter_state)
|
||||||
|
|
||||||
|
tok, sec, username = Twitter.token_secret_and_user_from_token_and_verifier(
|
||||||
|
params[:oauth_token], params[:oauth_verifier])
|
||||||
|
if tok.present? && username.present?
|
||||||
|
@user.twitter_oauth_token = tok
|
||||||
|
@user.twitter_oauth_token_secret = sec
|
||||||
|
@user.twitter_username = username
|
||||||
|
@user.save!
|
||||||
|
flash[:success] = "Your account has been linked to Twitter user @" <<
|
||||||
|
"#{username}."
|
||||||
|
else
|
||||||
|
return twitter_disconnect
|
||||||
|
end
|
||||||
|
|
||||||
|
return redirect_to "/settings"
|
||||||
|
end
|
||||||
|
|
||||||
|
def twitter_disconnect
|
||||||
|
@user.twitter_oauth_token = nil
|
||||||
|
@user.twitter_username = nil
|
||||||
|
@user.twitter_oauth_token_secret = nil
|
||||||
|
@user.save!
|
||||||
|
flash[:success] = "Your Twitter association has been removed."
|
||||||
|
return redirect_to "/settings"
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def user_params
|
def user_params
|
||||||
|
|
|
@ -48,6 +48,9 @@ class User < ActiveRecord::Base
|
||||||
s.string :totp_secret
|
s.string :totp_secret
|
||||||
s.string :github_oauth_token
|
s.string :github_oauth_token
|
||||||
s.string :github_username
|
s.string :github_username
|
||||||
|
s.string :twitter_oauth_token
|
||||||
|
s.string :twitter_oauth_token_secret
|
||||||
|
s.string :twitter_username
|
||||||
end
|
end
|
||||||
|
|
||||||
validates :email, :format => { :with => /\A[^@ ]+@[^@ ]+\.[^@ ]+\Z/ },
|
validates :email, :format => { :with => /\A[^@ ]+@[^@ ]+\.[^@ ]+\Z/ },
|
||||||
|
@ -121,6 +124,10 @@ class User < ActiveRecord::Base
|
||||||
h[:github_username] = self.github_username
|
h[:github_username] = self.github_username
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if self.twitter_username.present?
|
||||||
|
h[:twitter_username] = self.twitter_username
|
||||||
|
end
|
||||||
|
|
||||||
h
|
h
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -246,6 +246,21 @@
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<% if Twitter.enabled? %>
|
||||||
|
<div class="boxline">
|
||||||
|
<%= label_tag :twitter_username, "Twitter:", :class => "required" %>
|
||||||
|
<% if @edit_user.twitter_username.present? %>
|
||||||
|
Linked to
|
||||||
|
<strong><a href="https://twitter.com/<%= h(@edit_user.twitter_username)
|
||||||
|
%>">@<%= h(@edit_user.twitter_username) %></a></strong>
|
||||||
|
(<%= link_to "Disconnect", "/settings/twitter_disconnect",
|
||||||
|
:method => :post %>)
|
||||||
|
<% else %>
|
||||||
|
<a href="/settings/twitter_auth">Connect</a>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
|
|
@ -121,6 +121,9 @@ Lobsters::Application.routes.draw do
|
||||||
get "/settings/github_auth" => "settings#github_auth"
|
get "/settings/github_auth" => "settings#github_auth"
|
||||||
get "/settings/github_callback" => "settings#github_callback"
|
get "/settings/github_callback" => "settings#github_callback"
|
||||||
post "/settings/github_disconnect" => "settings#github_disconnect"
|
post "/settings/github_disconnect" => "settings#github_disconnect"
|
||||||
|
get "/settings/twitter_auth" => "settings#twitter_auth"
|
||||||
|
get "/settings/twitter_callback" => "settings#twitter_callback"
|
||||||
|
post "/settings/twitter_disconnect" => "settings#twitter_disconnect"
|
||||||
|
|
||||||
get "/filters" => "filters#index"
|
get "/filters" => "filters#index"
|
||||||
post "/filters" => "filters#update"
|
post "/filters" => "filters#update"
|
||||||
|
|
|
@ -4,6 +4,9 @@ class Twitter
|
||||||
# these need to be overridden in config/initializers/production.rb
|
# these need to be overridden in config/initializers/production.rb
|
||||||
@@CONSUMER_KEY = nil
|
@@CONSUMER_KEY = nil
|
||||||
@@CONSUMER_SECRET = nil
|
@@CONSUMER_SECRET = nil
|
||||||
|
|
||||||
|
# these are set for the account used to post updates in
|
||||||
|
# script/post_to_twitter (needs read/write access)
|
||||||
@@AUTH_TOKEN = nil
|
@@AUTH_TOKEN = nil
|
||||||
@@AUTH_SECRET = nil
|
@@AUTH_SECRET = nil
|
||||||
|
|
||||||
|
@ -12,6 +15,10 @@ class Twitter
|
||||||
# https://t.co/eyW1U2HLtP
|
# https://t.co/eyW1U2HLtP
|
||||||
TCO_LEN = 23
|
TCO_LEN = 23
|
||||||
|
|
||||||
|
def self.enabled?
|
||||||
|
self.CONSUMER_KEY.present?
|
||||||
|
end
|
||||||
|
|
||||||
def self.oauth_consumer
|
def self.oauth_consumer
|
||||||
OAuth::Consumer.new(self.CONSUMER_KEY, self.CONSUMER_SECRET,
|
OAuth::Consumer.new(self.CONSUMER_KEY, self.CONSUMER_SECRET,
|
||||||
{ :site => "https://api.twitter.com" })
|
{ :site => "https://api.twitter.com" })
|
||||||
|
@ -47,4 +54,28 @@ class Twitter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.token_secret_and_user_from_token_and_verifier(tok, verifier)
|
||||||
|
rt = OAuth::RequestToken.from_hash(self.oauth_consumer,
|
||||||
|
{ :oauth_token => tok })
|
||||||
|
at = rt.get_access_token({ :oauth_verifier => verifier })
|
||||||
|
|
||||||
|
res = at.get("/1.1/account/verify_credentials.json")
|
||||||
|
js = JSON.parse(res.body)
|
||||||
|
|
||||||
|
if !js["screen_name"].present?
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
[ at.token, at.secret, js["screen_name"] ]
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.oauth_request_token(state)
|
||||||
|
self.oauth_consumer.get_request_token(:oauth_callback =>
|
||||||
|
Rails.application.root_url + "settings/twitter_callback?state=#{state}")
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.oauth_auth_url(state)
|
||||||
|
self.oauth_request_token(state).authorize_url
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue