Как изменить конфигурацию SetCookie по умолчанию в servant-auth - PullRequest
1 голос
/ 24 сентября 2019

После успешного входа в систему servant-auth устанавливает в ответ файл cookie JWT-Cookie.Проблема в том, что он также помечает cookie как HttpOnly, что означает, что я не могу прочитать JWT в своем одностраничном приложении.Насколько я понимаю, это можно настроить с помощью типа данных SetCookie.Я смог создать свой собственный SetCookie, используя defaultSetCookie { setCookieHttpOnly = False }.Как мне вставить это в функцию acceptLogin?

Вот мой обработчик для входа в систему.

checkCreds :: CookieSettings
           -> JWTSettings
           -> LoginRequest
           -> App (Headers '[ Header "Set-Cookie" SetCookie
                            , Header "Set-Cookie" SetCookie ]
                            NoContent)
checkCreds cookieSettings jwtSettings LoginRequest{email = email, rawPassword = rawPassword} = do
   maybeUser <- logicForFetchingAndValidatingUser
   -- What do I do with this mySetCookie? 
   let mySetCookie = defaultSetCookie { setCookieHttpOnly = False }
   case maybeUser of
     Just userView -> do
      mApplyCookies <- liftIO $ acceptLogin cookieSettings jwtSettings userView
      case mApplyCookies of
        Nothing           -> throwError err401
        Just applyCookies -> return $ applyCookies NoContent
     Nothing -> throwError err401

1 Ответ

0 голосов
/ 25 сентября 2019

Я прочитал источник acceptLogin и выяснил, что он вызывает makeSessionCookie и makeXsrfCookie, а затем использует результаты для создания функции для добавления заголовков.Я сделал то же самое в своем коде, модифицируя результат makeSessionCookie по пути:

checkCreds :: CookieSettings
           -> JWTSettings
           -> LoginRequest
           -> App (Headers '[ Header "Set-Cookie" SetCookie
                            , Header "Set-Cookie" SetCookie]
                            NoContent)
checkCreds cookieSettings jwtSettings LoginRequest{email = email, rawPassword = rawPassword} = do
   -- Usually you would ask a database for the user info. This is just a
   -- regular servant handler, so you can follow your normal database access
   -- patterns (including using 'enter').
   maybeUser <- logicForFetchingAndValidatingUser
   case maybeUser of
     Just userView -> do
      mSessionCookie <- liftIO $ makeSessionCookie cookieSettings jwtSettings userView
      case mSessionCookie of
        Nothing -> throwError err401
        Just sessionCookie -> do
          let modifiedSessionCookie = sessionCookie { setCookieHttpOnly = False, setCookieSecure = False }
          xsrfCookie <- liftIO $ makeXsrfCookie cookieSettings
          return $ (addHeader modifiedSessionCookie . addHeader xsrfCookie) NoContent

     Nothing -> throwError err401
...