Advertisement
Shinmera

Radiance Authenticate Draft

Jul 16th, 2013
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.52 KB | None | 0 0
  1. (defmethod authenticate ((verify verify) &key &allow-other-keys)
  2.   (let ((token (hunchentoot:cookie-in "token" (request *radiance-request*))))
  3.     (if token
  4.         (progn
  5.           (setf token (decrypt token (config-tree :verify :session :secret)))
  6.           (if (and token (find #\- token))
  7.               (let* ((username (subseq token 0 (position #\- token)))
  8.                      (session (session-start (implementation 'session) username))
  9.                      (user (session-user session))
  10.                      (token (subseq token (1+ (position #\- token)))))
  11.                 (if (user-saved-p user)
  12.                     (authenticate-user user session token)
  13.                     (error "Unknown user: ~a" username)))
  14.               (error "Malformed token: ~a" token)))
  15.         (error "No token received."))))
  16.  
  17. (defun authenticate-user (user session token)
  18.   (setf token (if (config-tree :verify :session :use-per-user-secret)
  19.                   (decrypt token (user-field user "secret"))
  20.                   token))
  21.   (let ((data (split-sequence:split-sequence #\: token)))
  22.     (if (= (length data) 3)
  23.         (destructuring-bind (timestamp random session-id) data
  24.           (declare (ignore random))
  25.           (if (string= session-id (uuid session))
  26.               (progn (log:info "User ~a successfully authenticated session ~a (initiated on ~a)" user session-id timestamp)
  27.                      session)
  28.               (error "Invalid session ID: ~a" session-id)))
  29.         (error "Invalid data length: ~a" (length data)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement