scotty-web / scotty

Haskell web framework inspired by Ruby's Sinatra, using WAI and Warp (Official Repository)
http://hackage.haskell.org/package/scotty
BSD 3-Clause "New" or "Revised" License
1.72k stars 134 forks source link

Only use middleware on certain routes #187

Open glittershark opened 8 years ago

glittershark commented 8 years ago

I have a middleware that will authenticate the request - is there any way for me to mount this middleware only on those routes that require auhentication (ie, at some stage in the route-matching process) or would I have to do it using an actionM rather than a middleware and manually call it on every single authenticated route?

ocramz commented 1 year ago

if ScottyT were a MonadReader, we could implement this new function in terms oflocal https://hackage.haskell.org/package/mtl-2.2.2/docs/Control-Monad-Reader-Class.html#v:local .

@glittershark I know it's been a few years 😅 but do you happen to remember where was the authentication middleware from?

glittershark commented 1 year ago

oh, boy.

My initial thought was "absolutely no way I still have any clue what's going on", but I did some digging and I actually managed to find the original code, which is wild to me given this was 8 years ago.

Originally:

authenticate :: Context -> Middleware
authenticate ctx app req respond =
    -- TODO: Looks like Scotty doesn't support middleware only on certain routes :/
    if pathInfo req == ["tokens"] then passthrough else
    case getBearerToken $ requestHeaders req of
      Left _ -> respond authenticationError
      Right token -> do
        valid <- validate ctx token
        if valid then passthrough else respond authenticationError
    where passthrough = app req respond

blast from the past. thanks for the hit of nostalgia!

ocramz commented 10 months ago

I think this could be implemented here at no extra cost thanks to wai-extra ? https://hackage.haskell.org/package/wai-extra-3.1.14/docs/Network-Wai-Middleware-Select.html