Skip to content

Instantly share code, notes, and snippets.

@siscia
Created December 5, 2012 18:41
Show Gist options
  • Save siscia/4218318 to your computer and use it in GitHub Desktop.
Save siscia/4218318 to your computer and use it in GitHub Desktop.
Login with twitter in clojure
(ns morgan.models.social
(:require [clj-http.client :as client])
(:import [org.scribe.oauth OAuthService]
[org.scribe.builder ServiceBuilder]
[org.scribe.model Token Verifier OAuthRequest Verb])
(:import [org.scribe.builder.api FacebookApi TwitterApi$Authenticate]))
(def twitter-service
(-> (doto
(ServiceBuilder.)
(.provider (TwitterApi$Authenticate.))
(.apiKey "Pqc8RQMeJwVKpv0vPqPg")
(.apiSecret "4UvfkrZbmT4wmwhKrddsqZqIwPQRQ7X4akQW2zCLM")
(.callback "https://morgan-siscia.rhcloud.com/tw"))
(.build)))
(def tokens (atom {}))
(defn get-token []
(.getRequestToken twitter-service))
(defn get-twitter-url [token]
(swap! tokens assoc (.getToken token) token)
(.getAuthorizationUrl twitter-service token))
(defn get-access-token-twitter [oauth-token oauth-veri]
(let [token (get @tokens oauth-token)
verifier (Verifier. oauth-veri)
access-token (.getAccessToken twitter-service token verifier)]
(do
(swap! tokens dissoc oauth-token))
access-token))
(defn get-info-twitter [access-token user-id]
(let [request (doto
(OAuthRequest. (Verb/GET) "https://api.twitter.com/1.1/users/show.json")
(.addQuerystringParameter "user_id" user-id))]
(do
(.signRequest twitter-service access-token request))
(.getBody (.send request))))
(ns morgan.views.social
(:use [noir.core :only [defpage]]
[noir.response :only [redirect]]
[morgan.models.social :only [get-access-token-twitter
get-info-twitter
get-twitter-url
get-token]]))
(defpage "/tw" {:keys [oauth_token oauth_verifier]}
(let [access-token (get-access-token-twitter oauth_token oauth_verifier)
user-id (:user_id ((fn [req] ;;homemade implementation of
;;URLDecode by amaloy
;;http://stackoverflow.com/a/6591708/869271
(into {}
(for [[_ k v]
(re-seq #"([^&=]+)=([^&]+)" req)]
[(keyword k) v]))
) (.getRawResponse access-token)))]
(get-info-twitter access-token user-id)))
(defpage "/twitter" []
(redirect (get-twitter-url (get-token))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment