Authentication 如何使用Snap';在单个POST请求过程中的身份验证机制?
我正在开发一个基于Haskell Snap的web应用程序,我想公开一个API端点,远程服务将调用该端点,而无需事先建立经过身份验证的会话;但是,我确实希望对该请求进行身份验证,因此应该在请求时提供凭据 您可以想象请求包含四个字段:Authentication 如何使用Snap';在单个POST请求过程中的身份验证机制?,authentication,haskell,haskell-snap-framework,Authentication,Haskell,Haskell Snap Framework,我正在开发一个基于Haskell Snap的web应用程序,我想公开一个API端点,远程服务将调用该端点,而无需事先建立经过身份验证的会话;但是,我确实希望对该请求进行身份验证,因此应该在请求时提供凭据 您可以想象请求包含四个字段: 用户名 密码 有效载荷id 有效载荷文件 有效负载id和文件可能与此问题无关,但我之所以包含它们,是因为我(a)需要在此请求中支持文件上载(据我所知,这限制了用于发送字段的编码),并且(b)需要检索至少一个非文件字段。当我在没有身份验证的情况下设置这个时,这些东
- 用户名
- 密码
- 有效载荷id
- 有效载荷文件
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)验证并建立会话,(ii)发送包含实际负载的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))
restrictedPOST::Handler应用程序(AuthManager应用程序)()
限制性POST=do
mName我想你不明白auth的在做什么。它与是否需要身份验证无关。它所做的只是将处理程序b(AuthManager b)
转换为处理程序bv
。不执行任何权限检查。你的restrictedPOST函数的想法是正确的。我认为你是对的。。。我对auth现在做什么有了更好的理解。谢谢