Как сделать отдельный обратный звонок при регистрации для идентификации ueberauth?
ueberauth_identity имеет пример одного обратного вызова для входа в систему и регистрации, но это приводит к плохой обработке ошибок. Есть ли способ сделать отдельный обратный звонок при регистрации?
1 ответ
Я бы сказал, что это просто вопрос отправки определенного параметра и распространения его через все соответствующие вызовы. Я не уверен, насколько он в конечном итоге станет чище.
Скажем, например, что вы настроили его точно так же, как в документации:
scope "/auth", MyApp do
pipe_through :browser
get "/:provider", AuthController, :request
get "/:provider/callback", AuthController, :callback
post "/identity/callback", AuthController, :identity_callback
end
Таким образом, когда вы хотите заставить пользователя войти в систему, вы перенаправляете его по следующему маршруту:
Routes.auth_path(@conn, :request, "identity")
Что реализовано примерно так:
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
Теперь ничто не мешает вам добавить некоторые параметры запроса, чтобы он выглядел так:
Routes.auth_path(@conn, :request, "identity", login: true)
Что вы можете распространить на URL обратного вызова:
def request(conn, %{"login" => _}) do
callback_url = Helpers.callback_url(conn) <> "?login=true"
render(conn, "request.html", callback_url: callback_url)
end
Чтобы вы, наконец, могли сопоставить шаблон в своем обратном вызове:
def identity_callback(%{assigns: %{ueberauth_auth: auth}} = conn, %{"login" => _}) do
# ...
end