Packages
messenger_bot
1.0.0-beta2
1.3.0
1.2.0
retired
1.1.0
retired
1.0.0
retired
1.0.0-rc.8
retired
1.0.0-rc.7
retired
1.0.0-rc.6
retired
1.0.0-rc.5
retired
1.0.0-rc.4
retired
1.0.0-rc.3
retired
1.0.0-rc.2
retired
1.0.0-rc.1
retired
1.0.0-beta9
retired
1.0.0-beta8
retired
1.0.0-beta7
retired
1.0.0-beta6
retired
1.0.0-beta5
retired
1.0.0-beta4
retired
1.0.0-beta3
retired
1.0.0-beta2
retired
1.0.0-beta10
retired
1.0.0-beta1
retired
0.9.2
retired
0.9.1
retired
0.9.0
retired
0.8.2
retired
0.8.1
retired
0.8.0
retired
0.7.3
retired
0.7.2
retired
0.7.1
retired
0.7.0
retired
0.6.0
retired
0.5.2
retired
0.5.1
retired
0.5.0
retired
0.4.0
retired
0.3.0
retired
0.2.1
retired
0.2.0
retired
0.1.0
retired
Unofficial Facebook Messenger Platform chatbot client and webhook handler
Retired package: Deprecated
Current section
Files
Jump to
Current section
Files
lib/messenger_bot/plugs/authenticate.ex
defmodule MessengerBot.Plug.Authenticate do
@moduledoc """
MessengerBot plug implementation to verify the sha1 signature with request body.
"""
import Plug.Conn
alias Plug.Conn
alias MessengerBot.Config
alias :crypto, as: Crypto
@doc false
def init(opts) do
opts
end
@doc false
def call(%{method: "POST"} = conn, _opts) do
{:ok, body, _} = Conn.read_body(conn)
conn = put_private(conn, :body, body)
case Conn.get_req_header(conn, "x-hub-signature") do
["sha1=" <> signature] ->
expected_signature = calculate_request_signature(body)
case signature == expected_signature do
true -> conn
false -> err_resp(conn, :unauthorized, %{"signature" => "invalid"})
end
_ ->
err_resp(conn, :unauthorized, %{"signature" => "required"})
end
end
def call(conn, _),
do: conn
defp calculate_request_signature(body) do
:sha
|> Crypto.hmac(Config.app_token(), body)
|> Base.encode16()
|> String.downcase()
end
defp err_resp(conn, status, errors) do
conn
|> put_resp_content_type("application/json")
|> send_resp(status, :jiffy.encode(%{errors: errors}))
|> halt()
end
end