Haskell:
Wysyłanie zapytania http z podstawową autoryzacją
Jak to zrobić:
import Network.HTTP.Simple
import Data.ByteString.Base64
import Data.ByteString.Char8 (pack)
-- Zakodowanie loginu i hasła do formatu Base64
createBasicAuthValue :: String -> String -> ByteString
createBasicAuthValue login password =
"Basic " <> (encode . pack $ login ++ ":" ++ password)
-- Przygotowanie żądania z uwierzytelnieniem
prepareRequest :: String -> String -> String -> Request
prepareRequest url login password =
setRequestMethod "GET" $
setRequestURL (pack url) $
addRequestHeader "Authorization" (createBasicAuthValue login password) $
defaultRequest
-- Wysłanie żądania HTTP
sendHttpRequest :: Request -> IO ()
sendHttpRequest request = do
response <- httpBS request
putStrLn $ "Stan odpowiedzi: " ++ show (getResponseStatusCode response)
print $ getResponseBody response
-- Przykład użycia
main :: IO ()
main = do
let url = "http://example.com/protected"
let login = "user"
let password = "pass"
let request = prepareRequest url login password
sendHttpRequest request
Oczekiwana odpowiedź to kod statusu HTTP wraz z treścią odpowiedzi (jeśli jest dostępna):
Stan odpowiedzi: 200
"Odpowiedź z zabezpieczonego zasobu"
Głębiej:
Bazowe uwierzytelnienie HTTP (Basic Authentication) jest prostą metodą bezpieczeństwa używaną od czasów HTTP/1.0. Dziś, choć uznaje się je za mniej bezpieczne niż bardziej zaawansowane techniki jak OAuth, nadal jest powszechnie stosowane, głównie z powodu prostoty implementacji. W Haskell możemy korzystać z gotowych bibliotek jak http-conduit
czy http-simple
do obsługi żądań HTTP, włączając w to uwierzytelnienie. W powyższym przykładzie użyto http-simple
do tworzenia i wysyłania żądania z nagłówkiem uwierzytelniającym Authorization
. Kodowanie login:password
do formatu Base64 jest konieczne, gdyż taki format jest oczekiwany przez standard Basic Authentication.
Alternatywy dla Basic Authentication to m.in. Digest Authentication, TLS Client Authentication oraz wspomniany OAuth, które oferują różne poziomy złożoności i bezpieczeństwa.