gpt4 book ai didi

authentication - 在单页Clojure Web应用程序中使用Friend进行身份验证和授权

转载 作者:行者123 更新时间:2023-12-04 08:49:09 24 4
gpt4 key购买 nike

我正在尝试将Friend身份验证和授权集成到Clojure/Compojure单页Web应用程序中。

我有一个由Angular Controller 支持的登录表单,该 Controller 使用AJAX针对Web应用程序对用户名和密码进行身份验证,并获取经过身份验证的用户记录。因此,我不想使用基于Friend表单的登录名提供的默认行为-我基本上想依靠HTTP状态代码,并且我不需要任何Friend页面重定向。

例如,发出未经身份验证的请求应仅返回401状态代码,而不应重定向到“/login”。在配置Friend(下面包含的代码)时,我通过指定自定义“:unauthenticated-handler”来完成此部分的工作。

成功登录后,我只需要200状态代码,而不是重定向到最初请求的页面。这就是我无法工作的原因。

我根据各种示例编写了自定义的Friend身份验证工作流程(我的Clojure技能现在是初学者水平):

(defn my-auth
[& {:keys [credential-fn]}]
(routes
(GET "/logout" req
(friend/logout* {:status 200}))
(POST "/login" {{:keys [username password]} :params}
(if-let [user-record (-> username credential-fn)]
(if
(and
[user-record password]
(creds/bcrypt-verify password (:password user-record)))
(let [user-record (dissoc user-record :password)]
(workflows/make-auth user-record {:cemerick.friend/workflow :my-auth :cemerick.friend/redirect-on-auth? true}))
{:status 401})
{:status 401}))))

这是我的带有中间件声明的处理程序:
(def app
(->
(handler/site
(friend/authenticate app-routes
{:credential-fn (partial creds/bcrypt-credential-fn my-credential-fn)
:unauthenticated-handler unauthenticated
:workflows [(my-auth :credential-fn my-credential-fn)]}))
(session/wrap-session)
(params/wrap-keyword-params)
(json/wrap-json-body)
(json/wrap-json-response {:pretty true})))

以及以上引用的其他处理函数:
(defn unauthenticated [v]
{:status 401 :body "Unauthenticated"})

最后,还有一个附加的路由片段来测试身份验证:
(GET "/auth" req
(friend/authenticated (str "You have successfully authenticated as "
(friend/current-authentication))))

这大部分有效,几乎可以满足我的所有需求。

因为“授权重定向?”在“make-auth”中为true时,成功登录后会生成页面重定向-我想防止该重定向,因此将值设置为false。但是,此单个更改导致404和失败的登录。

因此,除了Friend身份验证映射外,我还需要某种方式在此处返回200状态代码,并且我还想在响应正文中返回“用户记录”,以便客户端应用程序可以根据用户角色来定制UI(已经包装了JSON请求/响应并可以正常工作)。

因此,当我调用Friend“make-auth”函数时,我想我需要这样做:
{:status 200 :body user-record}

但是,似乎我既可以拥有身份验证映射,也可以拥有响应-但不能同时拥有两者。

可以通过Friend实现吗?如果可以,如何实现?

最佳答案

您需要将:redirect-on-auth?作为false,并且需要将响应包装在响应图{:status 200 :body (workflows/make-auth...)}中。请注意,您可能需要将 body 序列化为String或其他可以处理的内容。

关于authentication - 在单页Clojure Web应用程序中使用Friend进行身份验证和授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20273190/

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