gpt4 book ai didi

authentication - 您如何在单个 POST 请求期间使用 Snap 的身份验证机制?

转载 作者:行者123 更新时间:2023-12-02 03:34:46 25 4
gpt4 key购买 nike

我正在开发一个基于 Haskell Snap 的网络应用程序,我想公开一个 API 端点,该端点将由远程服务调用,而无需预先建立经过身份验证的 session ;但是,我确实希望对该请求进行身份验证,因此应在请求时提供凭据。

您可以想象包含四个字段的请求:

  • 用户名
  • 密码
  • 负载标识
  • 有效载荷文件

负载 ID 和文件可能与这个问题无关,但我将它们包括在内是因为我 (a) 需要在此请求中支持文件上传(据我所知,这限制了用于发送字段的编码)和 ( b) 需要检索至少一个非文件字段。当我在没有身份验证的情况下进行设置时,这些东西的组合带来了一些困难,所以也许它是相关的。

用 Snap 的说法,我们称此处理程序为 uploadHandler

如上所述,我在没有身份验证的情况下工作正常,设置如下:

uploadHandler :: Handler App App ()
uploadHandler = do
-- collect files / form fields and process as needed.

-- and using the routes:
routes :: [(ByteString, Handler App App ())]
routes = [ ("/login", with auth handleLoginSubmit)
, ("/logout", with auth handleLogout)
, ("/new_user", with auth handleNewUser)

-- handle the upload:
, ("/upload", handleUpload)
]

天真的解决方案是简单地添加 'with auth' 并更改 handleUpload 的类型:

uploadHandler :: Handler App (AuthManager App) ()
uploadHandler = do
-- collect files / form fields and process as needed.

-- and using the routes:
routes :: [(ByteString, Handler App App ())]
routes = [ ("/login", with auth handleLoginSubmit)
, ("/logout", with auth handleLogout)
, ("/new_user", with auth handleNewUser)

-- handle the upload, with auth:
, ("/upload", with auth handleUpload)
]

但是,这似乎需要两个请求:(i) 验证并建立 session ,(ii) 发送包含实际负载的 POST 请求。

我在一个请求中找到了一种方法来执行此操作,但似乎应该有更优雅的方法。这是我一起破解的示例受限 POST 处理程序:

restrictedPOST :: Handler App (AuthManager App) ()
restrictedPOST = do
mName <- getPostParam "username"
mPass <- getPostParam "password"
let uName = C8.unpack $ fromMaybe "" mName
pass = ClearText $ fromMaybe "" mPass

authResult <- loginByUsername (T.pack uName) pass False
case authResult of
Left authFail -> writeText "Could not log in"
Right user -> writeText (T.append "Hello " (userLogin user))

是否可以使用类似“with auth”的东西来代替将此示例 (restrictedPOST) 转换为组合器?我意识到它可能需要知道从哪些字段中获取凭据,但我对网络服务也知之甚少(也许还有另一种方法?也许这完全不是问题,我只是不知道如何检查POST 请求的授权。我愿意接受任何建议!)

最佳答案

我认为您不了解with auth 的作用。与是否需要认证无关。它所做的只是将 Handler b (AuthManager b) 转换为 Handler b v。不执行权限检查。您的 restrictedPOST 函数有正确的想法。

关于authentication - 您如何在单个 POST 请求期间使用 Snap 的身份验证机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24343018/

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