authenticationrouteselixirphoenix-frameworkplug

How to stop further routing in a plug?


I'm using Phoenix, and in router.ex, I have defined a function that verifies the user's JWT token, before continuing on to routing through the api, in order to protect the routes. However, I am having the issue that if, say, I return a status of 403 in the plug, it continues routing and I end up getting an error as I am both accessing the route and disallowing access.

My code looks something like this:

def validate(conn, _opts) do
  if !Map.has_key?(conn.cookies, "jwt") do
    conn
    |> send_resp(403, "Forbidden")
    # I would like to have something here that stops further
    # routing - i.e. a way to say 'already sent a response; don't keep going'
  end
end

Solution

  • Here is an excerpt from Plug.Conn.send_resp/3

    Note that this function does not halt the connection, so if subsequent plugs try to send another response, it will error out. Use halt/1 after this function if you want to halt the plug pipeline.