Elixir Phoenix Swagger 安全定义

Elixir Phoenix Swagger Security Definitions

我已将 phoenix_swagger 集成到我的后端。我正在根据我的控制器自动生成我的 swagger 文档 UI 并使用它来交互式测试我的端点。

尽管如此,我的路由使用 Bearer JWT 进行保护。我想弄清楚如何在 phoenix_swagger 中定义授权 headers,但绝对没有运气。

非常感谢帮助Elixir的朋友们!

视觉效果:

swagger_path :create_user do
   post "/api/v1/users/create"
   description "Create a user."
   parameters do
     user :body, Schema.ref(:Create), "User to save", required: true
   end
   response 200, "Success"
 end

 def create_user(conn, query_params) do
   changeset = User.changeset(%User{}, query_params)
   with {:ok, user} <- Repo.insert(changeset),
       {:ok, token, _claims} <- Guardian.encode_and_sign(user) do
     conn
     |> Conn.put_status(201)
     |> render("jwt.json", jwt: token)
   else
     {:error, changeset} ->
       conn
       |> put_status(400)
       |> render(ErrorView, "400.json", %{changeset: changeset})
   end
 end

标准 Swagger 2.0 JSON参考:

这是我需要审视自己的事情。这里有几个链接可能会有所帮助。

https://github.com/xerions/phoenix_swagger/blob/master/docs/getting-started.md#router

https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#swagger-object

好的,我想我明白了!将 security [%{Bearer: []}] 添加到 swagger_path 会将授权令牌传递给调用。

控制器:

...
swagger_path :create_user do
  post "/api/v1/users/create"
  description "Create a user."
  parameters do
    user :body, Schema.ref(:Create), "User to save", required: true
  end
  security [%{Bearer: []}]
  response 200, "Success"
end

def create_user(conn, query_params) do
  changeset = User.changeset(%User{}, query_params)
  with {:ok, user} <- Repo.insert(changeset),
      {:ok, token, _claims} <- Guardian.encode_and_sign(user) do
    conn
    |> Conn.put_status(201)
    |> render("jwt.json", jwt: token)
  else
    {:error, changeset} ->
      conn
      |> put_status(400)
      |> render(ErrorView, "400.json", %{changeset: changeset})
  end
end
...

路由器:

...
def swagger_info do
  %{
    info: %{
      version: "0.0.1",
      title: "Server"
    },
    securityDefinitions: %{
      Bearer: %{
        type: "apiKey",
        name: "Authorization",
        in: "header"
      }
    }
  }
end
...