Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 如何使用Snap';在单个POST请求过程中的身份验证机制?_Authentication_Haskell_Haskell Snap Framework - Fatal编程技术网

Authentication 如何使用Snap';在单个POST请求过程中的身份验证机制?

Authentication 如何使用Snap';在单个POST请求过程中的身份验证机制?,authentication,haskell,haskell-snap-framework,Authentication,Haskell,Haskell Snap Framework,我正在开发一个基于Haskell Snap的web应用程序,我想公开一个API端点,远程服务将调用该端点,而无需事先建立经过身份验证的会话;但是,我确实希望对该请求进行身份验证,因此应该在请求时提供凭据 您可以想象请求包含四个字段: 用户名 密码 有效载荷id 有效载荷文件 有效负载id和文件可能与此问题无关,但我之所以包含它们,是因为我(a)需要在此请求中支持文件上载(据我所知,这限制了用于发送字段的编码),并且(b)需要检索至少一个非文件字段。当我在没有身份验证的情况下设置这个时,这些东

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

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

  • 用户名
  • 密码
  • 有效载荷id
  • 有效载荷文件
有效负载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)验证并建立会话,(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现在做什么有了更好的理解。谢谢