如何为ueberauth身份进行单独的注册回调

Cha*_*Han 5 elixir phoenix-framework ueberauth

ueberauth_identity有一个用于登录和注册的单个回调的示例,但这会导致错误处理。有没有办法进行单独的注册回调?

Jav*_*ano 0

我想说这只是发送特定参数并通过所有相关调用传播它的问题。我不确定它最终会“清洁多少”。

举例来说,您的设置与文档中完全相同:

scope "/auth", MyApp do
  pipe_through :browser

  get "/:provider", AuthController, :request
  get "/:provider/callback", AuthController, :callback
  post "/identity/callback", AuthController, :identity_callback
end
Run Code Online (Sandbox Code Playgroud)

这样,当您想要强制用户登录时,您可以将他重定向到以下路由:

Routes.auth_path(@conn, :request, "identity")
Run Code Online (Sandbox Code Playgroud)

其实现有点像这样:

defmodule UeberauthExampleWeb.AuthController do
  use UeberauthExampleWeb, :controller

  plug Ueberauth

  alias Ueberauth.Strategy.Helpers

  def request(conn, _params) do
    render(conn, "request.html", callback_url: Helpers.callback_url(conn))
  end

  # ...
end
Run Code Online (Sandbox Code Playgroud)

现在,没有什么能真正阻止您添加一些查询参数,使其看起来像这样:

Routes.auth_path(@conn, :request, "identity", login: true)
Run Code Online (Sandbox Code Playgroud)

您可以将其传播到回调 URL:

def request(conn, %{"login" => _}) do
  callback_url = Helpers.callback_url(conn) <> "?login=true"
  render(conn, "request.html", callback_url: callback_url)
end
Run Code Online (Sandbox Code Playgroud)

这样您最终就可以在回调中进行模式匹配:

def identity_callback(%{assigns: %{ueberauth_auth: auth}} = conn, %{"login" => _}) do
  # ...
end
Run Code Online (Sandbox Code Playgroud)