認証プラグがあり、コントローラをテストしたいと考えています。問題は、このプラグのラインに
user_id = get_session(conn, :user_id)
そして、このメソッドを使用しているときは常に nil です (以前はダーティハックを使用していましたが、もうやりたくありません):
@session Plug.Session.init([
store: :cookie,
key: "_app",
encryption_salt: "secret",
signing_salt: "secret",
encrypt: false
])
user = MyApp.Factory.create(:user)
conn()
|> put_req_header("accept", "application/vnd.api+json")
|> put_req_header("content-type", "application/vnd.api+json")
|> Map.put(:secret_key_base, String.duplicate("abcdefgh", 8))
|> Plug.Session.call(@session)
|> fetch_session
|> put_session(:user_id, user.id)
この conn を使用してパッチ リクエストを送信していますが、そのセッションの user_id は nil です。IO.puts conn
私のプラグインでの結果:
%Plug.Conn{adapter: {Plug.Adapters.Test.Conn, :...}, assigns: %{},
before_send: [#Function<0.111117999/1 in Plug.Session.before_send/2>,
#Function<0.110103833/1 in JaSerializer.ContentTypeNegotiation.set_content_type/2>,
#Function<1.55011211/1 in Plug.Logger.call/2>,
#Function<0.111117999/1 in Plug.Session.before_send/2>], body_params: %{},
cookies: %{}, halted: false, host: "www.example.com", method: "PATCH",
owner: #PID<0.349.0>,
params: %{"data" => %{"attributes" => %{"action" => "start"}}, "id" => "245"},
path_info: ["api", "tasks", "245"], peer: {{127, 0, 0, 1}, 111317}, port: 80,
private: %{MyApp.Router => {[], %{}}, :phoenix_endpoint => MyApp.Endpoint,
:phoenix_format => "json-api", :phoenix_pipelines => [:api],
:phoenix_recycled => true,
:phoenix_route => #Function<4.15522358/1 in MyApp.Router.match_route/4>,
:phoenix_router => MyApp.Router, :plug_session => %{},
:plug_session_fetch => :done, :plug_session_info => :write,
:plug_skip_csrf_protection => true}, query_params: %{}, query_string: "",
remote_ip: {127, 0, 0, 1}, req_cookies: %{},
req_headers: [{"accept", "application/vnd.api+json"},
{"content-type", "application/vnd.api+json"}], request_path: "/api/tasks/245",
resp_body: nil, resp_cookies: %{},
resp_headers: [{"cache-control", "max-age=0, private, must-revalidate"},
{"x-request-id", "d00tun3s9d7fo2ah2klnhafvt3ks4pbj"}], scheme: :http,
script_name: [],
secret_key_base: "npvJ1fWodIYzJ2eNnJmC5b1LecCTsveK4/mj7akuBaLdeAr2KGH4gwohwHsz8Ony",
state: :unset, status: nil}
この問題を解決し、認証を適切にテストするには、どうすればよいですか?
UPDATE認証プラグ
defmodule MyApp.Plug.Authenticate do
import Plug.Conn
import Phoenix.Controller
def init(default), do: default
def call(conn, _) do
IO.puts inspect get_session(conn, :user_id)
IO.puts conn
user_id = get_session(conn, :user_id)
if user_id do
current_user = MyApp.Repo.get(MyApp.Task, user_id)
assign(conn, :current_user, current_user)
else
conn
|> put_status(401)
|> json(%{})
|> halt
end
end
end
ルーター (ここからいくつかの部分を切り取りました):
defmodule MyApp.Router do
use MyApp.Web, :router
pipeline :api do
plug :accepts, ["json-api"] # this line and 3 below are under JaSerializer package responsibility
plug JaSerializer.ContentTypeNegotiation
plug JaSerializer.Deserializer
plug :fetch_session
plug MyApp.Plug.Authenticate # this one
end
scope "/api", MyApp do
pipe_through :api
# tasks
resources "/tasks", TaskController, only: [:show, :update]
end
end