[#923] Support for multiple OAuth consumer strategies.

This commit is contained in:
Ivan Tashkinov 2019-03-20 20:25:48 +03:00
commit af68a42ef7
6 changed files with 52 additions and 36 deletions

View file

@ -187,25 +187,25 @@ defmodule Pleroma.Web.OAuth.OAuthController do
|> redirect(to: "/")
end
def callback(%{assigns: %{ueberauth_failure: failure}} = conn, %{"redirect_uri" => redirect_uri}) do
def callback(%{assigns: %{ueberauth_failure: failure}} = conn, params) do
params = callback_params(params)
messages = for e <- Map.get(failure, :errors, []), do: e.message
message = Enum.join(messages, "; ")
conn
|> put_flash(:error, "Failed to authenticate: #{message}.")
|> redirect(external: redirect_uri(conn, redirect_uri))
|> redirect(external: redirect_uri(conn, params["redirect_uri"]))
end
def callback(
conn,
%{"client_id" => client_id, "redirect_uri" => redirect_uri} = params
) do
def callback(conn, params) do
params = callback_params(params)
with {:ok, registration} <- Authenticator.get_registration(conn, params) do
user = Repo.preload(registration, :user).user
auth_params = %{
"client_id" => client_id,
"redirect_uri" => redirect_uri,
"client_id" => params["client_id"],
"redirect_uri" => params["redirect_uri"],
"scopes" => oauth_scopes(params, nil)
}
@ -230,10 +230,21 @@ defmodule Pleroma.Web.OAuth.OAuthController do
_ ->
conn
|> put_flash(:error, "Failed to set up user account.")
|> redirect(external: redirect_uri(conn, redirect_uri))
|> redirect(external: redirect_uri(conn, params["redirect_uri"]))
end
end
defp callback_params(%{"state" => state} = params) do
[client_id, redirect_uri, scope, state] = String.split(state, "|")
Map.merge(params, %{
"client_id" => client_id,
"redirect_uri" => redirect_uri,
"scope" => scope,
"state" => state
})
end
def registration_details(conn, params) do
render(conn, "register.html", %{
client_id: params["client_id"],

View file

@ -1,14 +1,10 @@
<h2>External OAuth Authorization</h2>
<%= form_for @conn, o_auth_path(@conn, :request, :twitter), [method: "get"], fn f -> %>
<div class="scopes-input">
<%= label f, :scope, "Permissions" %>
<div class="scopes">
<%= text_input f, :scope, value: Enum.join(@available_scopes, " ") %>
</div>
</div>
<br>
<br>
<h2>Sign in with external provider</h2>
<%= hidden_input f, :client_id, value: @client_id %>
<%= hidden_input f, :redirect_uri, value: @redirect_uri %>
<%= hidden_input f, :state, value: @state%>
<%= submit "Sign in with Twitter" %>
<%= for strategy <- Pleroma.Config.get([:auth, :oauth_consumer_strategies], []) do %>
<%= form_for @conn, o_auth_path(@conn, :request, strategy), [method: "get"], fn f -> %>
<%= hidden_input f, :state, value: Enum.join([@client_id, @redirect_uri, Enum.join(@available_scopes, " "), @state], "|") %>
<%= submit "Sign in with #{String.capitalize(strategy)}" %>
<% end %>
<% end %>

View file

@ -37,6 +37,5 @@
<% end %>
<%= if Pleroma.Config.get([:auth, :oauth_consumer_enabled]) do %>
<br>
<%= render @view_module, "consumer.html", assigns %>
<% end %>