Friend requires some ring middleware, including the keyword params middleware. Not having it included in your app will produce this. If you are using Compojure's handler middlewares, this is done for you.

This particular example is broken because you're applying the middleware in the wrong order. Try:

(-> app-routes
  (friend/authenticate ...)
  handler/api)

Any Friend questions can be posted to the clojure-sec ML, where they'll get more attention.

Thanks,

- Chas

On 04/23/2014 06:27 PM, Ivan Schuetz wrote:
Hi,

I'm trying to get a simple use case running - send a login request to /login and get success or fail response, preferably in JSON format.

I followed the example in https://github.com/cemerick/friend#workflows


(def users {"root" {:username "root"
                    :password (creds/hash-bcrypt "admin_password")
                    :roles #{::admin}}
            "jane" {:username "jane"
                    :password (creds/hash-bcrypt "test")
                    :roles #{::user}}})


(defroutes app-routes

  (GET "/test" [] {:body {:my-map "helo"}})
  (route/resources "/")
  (route/not-found "Not found"))

(def app
  (->
      (handler/api app-routes)
      (middleware/wrap-json-body)
      (middleware/wrap-json-response)

(friend/authenticate {:credential-fn (partial creds/bcrypt-credential-fn users)
                            :workflows [
(workflows/interactive-form)]})
      )
  )



I'm testing with curl:

curl -v --data "username=jane&password=test" http://localhost:3000/login

Or:

curl -v --request POST "http://localhost:3000/login?username=jane&password=test";

And I get:

* About to connect() to localhost port 3000 (#0)
*   Trying ::1...
* connected
* Connected to localhost (::1) port 3000 (#0)
> POST /login?username=jane&password=test HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.5
> Host: localhost:3000
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Wed, 23 Apr 2014 22:25:15 GMT
< Location: http://localhost:3000/login?&login_failed=Y&username=
< Content-Length: 0
< Server: Jetty(7.6.8.v20121106)
<
* Connection #0 to host localhost left intact
* Closing connection #0


This looks like authentication failed, but the data is correct. I reviewed the curl request, and this seems to be the correct way to send a POST. But &username= gives me the impression it's not being parsed correctly.

Also, how can I get a JSON response instead of a header?

Thanks.

P.S. Maybe it would be positive if this library has an own Google Group.
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com <mailto:clojure+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to