Тест аутентификации API с помощью Guardian
Я пытаюсь проверить свой контроллер, но продолжаю нажимать на ошибку "Неаутентифицированный". Я думаю, я знаю, где это идет не так, но я просто не уверен, почему это не работает. Вот что у меня есть.
setup %{conn: conn} do
user = insert(:user)
{:ok, jwt, _} = Guardian.encode_and_sign(user, :api)
conn = conn
|> put_req_header("accept", "application/json")
|> put_req_header("authorization", "bearer: " <> jwt)
{:ok, conn: conn}
end
test "creates and renders resource when data is valid", %{conn: conn} do
conn = post(conn, league_path(conn, :create), league: @valid_attrs)
body = json_response(conn, 201)
assert body["name"]
assert Repo.get_by(League, name: "Obama's League")
end
Это правильно создает и подписывает JWT, но по какой-то причине он не аутентифицирует его в маршрутизаторе. Вот роутер.
pipeline :authenticated do
plug(Guardian.Plug.EnsureAuthenticated)
end
scope "/api/v1", Statcasters do
pipe_through([:api, :authenticated])
resources("/leagues", LeagueController, only: [:create])
end
Я думаю, что это где я иду не так, потому что документация показывает, что эта ошибка возникнет, если этот плагин маршрутизатора не разрешен:
ОШИБКА:
** (RuntimeError) expected response with status 201, got: 401, with body:
{"errors":["Unauthenticated"]}
code: body = json_response(conn, 201)
Как я могу успешно использовать Guardian в тесте контроллера?
0 ответов
Хотя в вопросе вы не указываете версию опекуна, для версии ~> 2.0
, Bearer
является аргументом области по умолчанию для verify_header
вилка.
Вам следует заменить:
|> put_req_header("authorization", "bearer: " <> jwt)
с
|> put_req_header("authorization", "Bearer " <> jwt)
если вы явно не определилиverify_header
подключить с bearer:
plug Guardian.Plug.VerifyHeader, realm: "bearer:"