2015-06-03 3 views
0

Я пытаюсь сделать базовый auth для API в Clojure с friend.basic http auth in Clojure/Friend

Вот запрос Логин:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'user=myuser%40email.com&pass=super-secret-password' http://localhost:3000/login/ 

Я использую compojure, как хорошо, но я не знаю, как повторно использовать связанный пример. Вот те части, которые я не знаю, как изменить:

  • Как заменить имя пользователя/пароль поля с пользователем/пасс поля, как в моем локонов запросе? Я могу извлечь их из необработанного запроса, но я не знаю, как передать его другу (мне нужно изменить credential-fn?).

  • Замените user atom на данные из базы данных. У меня есть auth [email password], который возвращает true или false (выборка из базы данных и использование bcrypt). Я также могу получить роль пользователя из базы данных. Как использовать базу данных (в частности, я использую mongo/monger) вместо атома пользователя?

+0

Ваша вторая часть о замене атома пользователя, вероятно, будет лучше в собственном вопросе. –

+0

@ DanielCompton У меня уже есть функция, которая извлекает данные из базы данных, поэтому моя единственная забота о другом, я думаю. Вы не согласны? – nha

+1

Возможно, вам понравился этот маленький скелет, который я поделил, чтобы интегрировать друга в Liberator, где я использовал встроенную базу данных пользователя. https://github.com/jaimeagudo/liberator-friend. Не пропустите [сообщение] (https://sritchie.github.io/2014/01/17/api-authentication-with-liberator-and-friend/) :) –

ответ

1

Вы можете предоставить совершенно другой учетных данных Fn или прилипнуть к демке, где учетных данных Fn реализуется с помощью cemerick.friend.credentials/Bcrypt-учетных данных Fn. Прочтите документ bcrypt-credential-fn по адресу , он довольно длинный. Он ожидает load-credentials-fn, который загружает пользователя с именем пользователя, а затем проверяет, совпадает ли пароль. В демоверсии load-credentials-fn - это карта в атоме пользователей, но если у вас есть база данных, вы хотите предоставить другую функцию load-credentials-fn, которая будет искать базу данных, вы не хотите для загрузки таблицы ваших пользователей на карте в атоме.

+0

спасибо. Итак, если я создаю пользовательскую функцию, которая возвращает карту, что должно быть внутри карты? – nha

+1

Результатом этой функции является объект аутентификации, то есть то, что вернет cemerick.firend/current-authentication, если вы вызываете его из приложения (например, для визуализации приветствия с именем пользователя), например: {: name "John" : role # {: admin: user}: размер обуви 42}. Не уверен, нет ли каких-либо подробностей о тех ролях, которые я пропустил здесь. –