【问题标题】:Issue with Guardian - EnsureAuthenticated not workingGuardian 的问题 - EnsureAuthenticated 不起作用
【发布时间】:2018-04-28 18:30:08
【问题描述】:

我正在尝试让 Guardian auth 为我的应用程序工作。但我完全陷入困境,找不到任何支持我遇到的问题。

据我所知,我已经准确地设置了 Guardian 文档显示的方式,但是当我在浏览器中测试身份验证时,它在 Guardian 提供的 EnsureAuthenticated 插件上失败。

这是我的工作:

配置:

应用程序中的所有值均已正确填写。

config :statcasters, MyApp.Guardian,
  allowed_algos: ["HS512"],
  verify_module: Guardian.JWT,
  issuer: "my_app",
  ttl: {30, :days},
  allowed_drift: 2000,
  verify_issuer: true,
  secret_key: "my_secret_key"

经过验证的控制器:

defmodule Statcasters.LeagueController do
  use StatcastersWeb, :controller
  alias Statcasters.{League, Repo}

  plug Guardian.Plug.EnsureAuthenticated

  def create(conn, %{"league" => league_params}) do
    changeset = League.changeset(%League{}, league_params)

    case Repo.insert(changeset) do
      {:ok, league} ->
        conn
        |> put_status(:created)
        |> render("league.json", league: league)

      {:error, changeset} ->
        conn
        |> put_status(:unprocessable_entity)
        |> render(Statcasters.ChangesetView, "error.json", changeset: changeset)
    end
  end
end

在这个控制器中它失败了。当它进入 EnsureAuthenticated 插件时,它会停在那里。但此时我的标头中有一个有效的 JWT。

这是我们的参数:

Parameters: %{"headers" => %{"Authorization" => "Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJTdGF0Y2FzdGVycyIsImV4cCI6MTUyNzUzMDA1OSwiaWF0IjoxNTI0OTM4MDU5LCJMiOiJTdGF0Y2FzdGVycyIsImp0aSI6IjJhNDg3MWQ4LTkwZGEtNDNlYS1hMGJlLWVjNjgwNjIzOTBkOCIsIm5iZiI6MTUyNDkzODA1OCwic3ViIjoiMSIsInR5cCI6InJlZnJlc2gifQ.EKeaHoQiW9tmtsabPIjj6069zD6Vcex9w3xfkXP5MIyiogWh400S6wMzaAsTQd20I5ai_y9jJTtgLzqYfbGTaQ"}

我已验证 JWT 是有效的 here

请求:

       axios.post('/api/v1/leagues', {
          league: {
            name: this.$refs.league_name.value,
            player_limit: this.$refs.player_limit.value,
          },
          headers: {
            Authorization: "Bearer jwt(correct jwt)"
          }
        }).then(response => {
        }).catch(error => {
       })

同样,问题是我的身份验证在 Plug.EnsureAuthenticated 挂钩中失败。但我不明白为什么,因为我似乎正确设置了所有内容并且 JWT 在 auth 标头中。

【问题讨论】:

  • 您是将标头作为 GET/POST 参数还是作为 HTTP 标头发送?它们需要是 HTTP 标头。
  • @Dogbert 我更新了问题以包含请求。我将它作为标题传递。或者至少我认为我是

标签: authentication elixir jwt phoenix-framework guardian


【解决方案1】:

您将标头作为 POST 参数发送,而不是 HTTP 标头。 You need to put the headers in the third argument for axios.post:

axios.post('/api/v1/leagues', {
  league: {
    name: this.$refs.league_name.value,
    player_limit: this.$refs.player_limit.value,
  }
}, {
  headers: {
    Authorization: "Bearer jwt(correct jwt)"
  }
})

【讨论】:

  • 我明白了!嗯,该死的。谢谢 Dogbert
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多