Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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 服务客户端如何处理收到的cookie?_Authentication_Haskell_Cookies_Servant - Fatal编程技术网

Authentication 服务客户端如何处理收到的cookie?

Authentication 服务客户端如何处理收到的cookie?,authentication,haskell,cookies,servant,Authentication,Haskell,Cookies,Servant,我想使用服务客户端首先调用登录端点以获取会话cookie,然后对需要cookie身份验证的端点发出请求 API是(简化的) 将合格的服务导入为SV 将符合条件的Servant.Auth.Server导入为 将符合条件的Servant.Client作为SC导入 --身份验证和X-CSRF cookies 键入CookieHeader=(SV.Headers'[SV.Header“Set Cookie”为.SetCookie ,SV.Header“Set Cookie”为.SetCookie] SV

我想使用服务客户端首先调用登录端点以获取会话cookie,然后对需要cookie身份验证的端点发出请求

API是(简化的)

将合格的服务导入为SV
将符合条件的Servant.Auth.Server导入为
将符合条件的Servant.Client作为SC导入
--身份验证和X-CSRF cookies
键入CookieHeader=(SV.Headers'[SV.Header“Set Cookie”为.SetCookie
,SV.Header“Set Cookie”为.SetCookie]
SV.无内容)
键入LoginEndpoint=“login”:>SV.ReqBody'[SV.JSON]login:>SV.Verb'SV.POST 204'[SV.JSON]CookieHeader
键入protectedpoint=“protected”:>SV.Get'[SV.JSON]
--整体API
类型Api=LoginEndpoint:(AS.Auth'[AS.Cookie,AS.JWT]用户:>protecteddpoint)
代理Api::代理Api
apiProxy=代理
我对客户的定义如下:

loginClient::Api.Login->SC.ClientM Api.CookieHeader
protectedClient::AC.Token->SC.ClientM Text:SC.ClientM SV.NoContent
loginClient:protectedClient=SC.client Api.apiProxy
客户端如何处理身份验证cookie?我可以想出两种方法。在
ClientM
monad中执行请求时,如

do

结果经过一些实验,我发现服务客户端确实在
cookieJar
中维护cookies,这是
clientEnv
的一部分。更准确地说,
clientEnv
包含
cookieJar
字段,该字段的类型为
Maybe(TVar-cookieJar)
。它是客户端根据后续请求的
Set Cookie
指令更新的TVar。在发出第一个请求之前,由开发人员创建并初始化TVar;否则,服务客户端将在请求之间丢弃cookie

此外,可以使用与请求主体相同的方式检索cookie。为此,必须将要检索的cookie定义为API类型的一部分,如我的原始问题示例中所示:

type LoginEndpoint=“login”:>SV.ReqBody'[SV.JSON]login:>SV.Verb'SV.POST 204'[SV.JSON]CookieHeader
分解返回的文件一开始有点棘手,因为我需要计算出由仆人的类型级机器生成的最终类型。最终,我做到了以下几点:


SV.Headers resp h我希望cookie一旦设置好(并且假设cookieJar不是
Nothing
),就会在同一“
ClientM
monadic块”中的所有请求中自动重新发送。“我试图阅读TVar并检查其内容[…]发现了一个空数组”你是如何获得TVar的?您是否先进行cookie设置调用,而没有“退出”
ClientM
monad?确实如此,但我需要首先初始化TVar,如下面的回答所述。这是我第一次与TVars打交道,所以这并不是很明显——在事后看来,确实如此。