summaryrefslogtreecommitdiff
path: root/src/mulk/benki/auth.clj
blob: 9105a21322dbfa419aceede9e0b9be9c95311005 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
(ns mulk.benki.auth
  (:refer-clojure)
  (:use [clojure         core repl pprint]
        [clojure.contrib repl-utils]
        [hiccup core     page-helpers]
        [mulk.benki      util]
        [clojure.core.match.core
         :only [match]]
        [noir            core])
  (:require [noir.session  :as session]
            [noir.response :as response]
            [noir.request  :as request])
  (:import [org.openid4java.consumer ConsumerManager]
           [org.openid4java.message ParameterList]))


(defonce manager (ConsumerManager.))


(defpartial return-from-openid-provider []
  (let [parlist      (ParameterList. (:query-params (request/ring-request)))
        discovered   (session/get :discovered)
        ;; Does the following work for POST requests?
        request-uri  (str "http://localhost:3001/login/return"
                          ;;(resolve-uri "/login/return")
                          (let [query-string (:query-string (request/ring-request))]
                            (if query-string
                              (str "?" query-string)
                              "")))
        verification (.verify manager request-uri parlist discovered)
        id           (.getVerifiedId verification)]
    (if id
      (layout "Authenticated!"
              [:p "Authentication result: " [:strong [:code (escape-html (fmt nil "~S" (bean id)))]]
               " (identifier: " [:strong [:code (escape-html (.getIdentifier id))]] ")"])
      (layout "Authentication Failed"))))

(defpage [:post "/login/return"] []
  (return-from-openid-provider))

(defpage "/login/return" []
  (return-from-openid-provider))


(defpage "/login/authenticate" {openid :openid}
  (let [discoveries (.discover     manager openid)
        discovered  (.associate    manager discoveries)
        authreq     (.authenticate manager discovered ;;(resolve-uri "/login/return")
                                   "http://localhost:3001/login/return"
                                   )]
    (session/put! :discovered discovered)
    (response/redirect (.getDestinationUrl authreq true))))


(defpage "/login" []
  (layout "Benki Login"
    [:p "Please enter your OpenID:"]
    [:form {:action (resolve-uri "/login/authenticate"),
            :method "GET"}
     [:input {:type "text", :name "openid"}]
     [:input {:type "submit"}]]))