在我的凤凰应用程序中,我有一个管道和范围" api"
pipeline :api do
plug(:accepts, ["json"])
end
scope "/api" .....
# .....
end
如何通过通过特殊标头传递的API密钥来保护它?也就是说,我喜欢这样的事情:
defmodule MyApp.MyController do
use MyApp.Web, :controller
:before_filter :authenticate_user_by_api_key!
def authenticate_user_by_api_key!(conn, params) do
# check if a header exists and key is valid
end
end
我计划验证标头。 如何在不依赖任何第三方库的情况下实现这一目标?
另外。如果我想使用模块而不是单个函数,我该怎么做?
答案 0 :(得分:4)
如果它是本地方法,您只需在控制器中使用plug
构造即可。
defmodule MyApp.MyController do
use MyApp.Web, :controller
plug :authenticate_user_by_api_key!
defp authenticate_user_by_api_key!(conn, params) do
# Authenticate or something
end
end
See this answer并详细了解Plugs here。
如果您想从模块调用该函数,您的模块必须导出init/1
和call/2
方法:
defmodule MyApp.Plugs.Authentication do
import Plug.Conn
def init(default), do: default
def call(conn, default) do
# Check header for API Key
end
end
在你的控制器中使用它:
defmodule MyApp.MyController do
use MyApp.Web, :controller
plug MyApp.Plugs.Authentication
# Controller Methods
end