mirror of
https://github.com/dillonkearns/elm-pages-v3-beta.git
synced 2024-11-28 06:05:31 +03:00
Add basic auth example.
This commit is contained in:
parent
4b0316b396
commit
e6488024a3
134
examples/end-to-end/app/Page/Test/BasicAuth.elm
Normal file
134
examples/end-to-end/app/Page/Test/BasicAuth.elm
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
module Page.Test.BasicAuth exposing (Data, Model, Msg, page)
|
||||||
|
|
||||||
|
import Base64
|
||||||
|
import DataSource exposing (DataSource)
|
||||||
|
import Head
|
||||||
|
import Html.Styled exposing (div, text)
|
||||||
|
import Page exposing (Page, PageWithState, StaticPayload)
|
||||||
|
import Pages.PageUrl exposing (PageUrl)
|
||||||
|
import Server.Request as Request exposing (Request)
|
||||||
|
import Server.Response as Response exposing (Response)
|
||||||
|
import Shared
|
||||||
|
import View exposing (View)
|
||||||
|
|
||||||
|
|
||||||
|
type alias Model =
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
type alias Msg =
|
||||||
|
()
|
||||||
|
|
||||||
|
|
||||||
|
type alias RouteParams =
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
page : Page RouteParams Data
|
||||||
|
page =
|
||||||
|
Page.serverRender
|
||||||
|
{ head = head
|
||||||
|
, data = data
|
||||||
|
}
|
||||||
|
|> Page.buildNoState { view = view }
|
||||||
|
|
||||||
|
|
||||||
|
type alias Data =
|
||||||
|
{ greeting : String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
data : RouteParams -> Request (DataSource (Response Data))
|
||||||
|
data routeParams =
|
||||||
|
withBasicAuth
|
||||||
|
(\{ username, password } ->
|
||||||
|
(username == "asdf" && password == "qwer")
|
||||||
|
|> DataSource.succeed
|
||||||
|
)
|
||||||
|
(Data "Login success!"
|
||||||
|
|> Response.render
|
||||||
|
|> DataSource.succeed
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
head :
|
||||||
|
StaticPayload Data RouteParams
|
||||||
|
-> List Head.Tag
|
||||||
|
head static =
|
||||||
|
[]
|
||||||
|
|
||||||
|
|
||||||
|
view :
|
||||||
|
Maybe PageUrl
|
||||||
|
-> Shared.Model
|
||||||
|
-> StaticPayload Data RouteParams
|
||||||
|
-> View Msg
|
||||||
|
view maybeUrl sharedModel static =
|
||||||
|
{ title = "Basic Auth Test"
|
||||||
|
, body =
|
||||||
|
[ text "Basic Auth Test"
|
||||||
|
, div []
|
||||||
|
[ text static.data.greeting
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
parseAuth : String -> Maybe { username : String, password : String }
|
||||||
|
parseAuth base64Auth =
|
||||||
|
case
|
||||||
|
base64Auth
|
||||||
|
|> String.dropLeft 6
|
||||||
|
|> Base64.toString
|
||||||
|
|> Maybe.map (String.split ":")
|
||||||
|
of
|
||||||
|
Just [ username, password ] ->
|
||||||
|
Just
|
||||||
|
{ username = username
|
||||||
|
, password = password
|
||||||
|
}
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
|
||||||
|
withBasicAuth :
|
||||||
|
({ username : String, password : String } -> DataSource Bool)
|
||||||
|
-> DataSource (Response data)
|
||||||
|
-> Request (DataSource (Response data))
|
||||||
|
withBasicAuth checkAuth successResponse =
|
||||||
|
Request.oneOf
|
||||||
|
[ Request.expectHeader "authorization"
|
||||||
|
|> Request.map
|
||||||
|
(\base64Auth ->
|
||||||
|
case parseAuth base64Auth of
|
||||||
|
Just userPass ->
|
||||||
|
checkAuth userPass
|
||||||
|
|> DataSource.andThen
|
||||||
|
(\authSucceeded ->
|
||||||
|
if authSucceeded then
|
||||||
|
successResponse
|
||||||
|
|
||||||
|
else
|
||||||
|
requireBasicAuth |> DataSource.succeed
|
||||||
|
)
|
||||||
|
|
||||||
|
Nothing ->
|
||||||
|
requireBasicAuth
|
||||||
|
|> DataSource.succeed
|
||||||
|
)
|
||||||
|
, requireBasicAuth
|
||||||
|
|> DataSource.succeed
|
||||||
|
|> Request.succeed
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
requireBasicAuth : Response data
|
||||||
|
requireBasicAuth =
|
||||||
|
Response.customResponse
|
||||||
|
{ headers = []
|
||||||
|
, body = Nothing
|
||||||
|
, statusCode = 401
|
||||||
|
, isBase64Encoded = False
|
||||||
|
}
|
||||||
|
|> Response.withHeader "WWW-Authenticate" "Basic"
|
Loading…
Reference in New Issue
Block a user