gpt4 book ai didi

authentication - 在 Clojure Web 应用程序中使用 JSON 请求正文而不是请求参数进行好友身份验证

转载 作者:行者123 更新时间:2023-12-04 02:38:51 25 4
gpt4 key购买 nike

我正在使用 Friend 将身份验证构建到 Compojure 网络应用程序中。

我已经为 Friend 定义了一个定制的身份验证工作流:

(defn authentication-workflow []
(routes
(GET "/logout" req
(friend/logout* {:status 200}))
(POST "/login" {{:keys [username password]} :params}
(if-let [user-record (authenticate-user username password)]
(workflows/make-auth user-record {:cemerick.friend/workflow :authorisation-workflow})
{:status 401}))))

身份验证部分被提取出来:

(defn authenticate-user [username password]
(if-let [user-record (get-user-for-username username)]
(if (creds/bcrypt-verify password (:password user-record))
(dissoc user-record :password))))

这可行,但是...

我正在使用 AngularJS 并且必须发布请求参数会导致一些难看的 Angular 代码(从 StackOverflow 的答案中抄袭其他地方):

$http({
method: 'POST',
url: '/login',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
transformRequest: function(obj) {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
return str.join("&");
},
data: {
username: username,
password: password
}
});

我宁愿做这个更简单的调用,而是通过请求正文发布一个 JSON 对象:

$http.post('/login', {username: username, password: password})

我尝试在身份验证处理程序中使用“:body”而不是“:params”,但 :body 的值对我来说既不是 JSON 也不是 Clojure,所以我不知道如何使用它:

{username me@myapp.com, password password}

我已经拥有适用于我的 REST API 处理程序的 JSON 请求/响应映射工作流,并且我已经检查过请求 header (例如 ContentType)对于 JSON 是正确的。

那么这可以用 Compojure/Friend 来完成吗?如果可以的话,怎么做?

最佳答案

这是一些工作代码和解释...

首先是 Friend 工作流程,使用请求正文:

(defn authentication-workflow []
(routes
(GET "/logout" req
(friend/logout* {:status 200}))
(POST "/login" {body :body}
(if-let [user-record (authenticate-user body)]
(workflows/make-auth user-record {:cemerick.friend/workflow :authorisation-workflow})
{:status 401}))))

二、认证功能:

(defn authenticate-user [{username "username" password "password"}]
(if-let [user-record (get-user-for-username username)]
(if (creds/bcrypt-verify password (:password user-record))
(dissoc user-record :password))))

三、声明了中间件的Compojure应用:

(def app
(-> (handler/site
(friend/authenticate app-routes
{:workflows [(authentication-workflow)]}))
(params/wrap-keyword-params)
(json/wrap-json-body)
(json/wrap-json-response {:pretty true})))

最后是用于发布凭据的 AngularJS 代码片段(用户名和密码来自 AngularJS 模型):

$http.post('/login', {username: username, password: password});

那么发生的事情是...

Angular javascript 代码将 JSON 发送到 Web 应用程序登录 URL。 “Content-Type” header 自动设置为“application/json”,请求主体自动编码为 JSON,例如:

{"username":"batman@batcave.org","password":"tumblerrocks"}

在服务器上,中间件将 JSON 解析为 Clojure 映射,并通过“:body”关键字将其呈现给处理程序:

{username batman@batcave.org, password tumblerrocks}

然后请求被路由到自定义好友身份验证工作流。

最后,从 Clojure 映射中提取提交的值并用于对用户进行身份验证。

关于authentication - 在 Clojure Web 应用程序中使用 JSON 请求正文而不是请求参数进行好友身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20312577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com