我正在尝试测试我的控制器,但我一直打一个监护人“Unauthenticated”错误。我想我知道哪里出了问题,但我不确定为什么它不起作用。这就是我所拥有的。
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)
如何在控制器测试中成功使用监护人?
答案 0 :(得分: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:"